当Oracle估算某些查询的“成本”时,它是否真的查看表中的数据量(行)?
例如:
如果我对employees执行全表扫描,查找name='Bob',它是通过计算现有行的数量来估计成本,还是总是设置成本?
发布于 2010-04-06 13:39:44
在缺省配置中,Oracle将检查表统计信息(您可以通过查询ALL_TABLES视图查看表统计信息-请参见列NUM_ROWS)。通常,Oracle作业会定期运行,通过查询部分或全部表来重新收集这些统计信息。
如果(尚未)收集到统计信息,优化器将(根据optimizer_dynamic_sampling参数)对该表运行一个快速样本查询,以计算该表中行数的估计值。
(更准确地说,扫描表的成本不是根据行数计算的,而是根据表中的块数计算的(您可以在ALL_TABLES的BLOCKS列中看到)。它采用此数字并将其除以与多数据块读取计数相关的因子,以计算该部分计划的成本。)
发布于 2010-04-06 01:09:07
成本优化器使用段(表和索引)统计信息以及系统(cpu + i/o性能)统计信息进行估计。尽管这取决于数据库的配置方式,但从10g开始,调用DBMS_STATS包的进程通常每天计算一次段统计信息。
https://stackoverflow.com/questions/2579489
复制相似问题