【发布时间】:2011-02-04 11:43:22
【问题描述】:
当 Oracle 为某些查询估算“成本”时,它实际上是否查看表中的数据量(行)?
例如:
如果我对 name='Bob' 的员工进行全表扫描,它是通过计算现有行的数量来估计成本,还是总是设定成本?
【问题讨论】:
标签: sql performance oracle optimization
当 Oracle 为某些查询估算“成本”时,它实际上是否查看表中的数据量(行)?
例如:
如果我对 name='Bob' 的员工进行全表扫描,它是通过计算现有行的数量来估计成本,还是总是设定成本?
【问题讨论】:
标签: sql performance oracle optimization
成本优化器使用段(表和索引)统计信息以及系统(cpu + i/o 性能)统计信息进行估算。虽然这取决于您的数据库的配置方式,但从 10g 起,段统计信息通常由调用 DBMS_STATS 包的进程每天计算一次。
【讨论】:
在默认配置中,Oracle 将检查表统计信息(您可以通过查询ALL_TABLES 视图来查看 - 请参阅列 NUM_ROWS)。通常,Oracle 作业会定期运行,以通过查询部分或全部表来重新收集这些统计信息。
如果尚未收集统计信息,优化器将(取决于optimizer_dynamic_sampling 参数)对表运行快速示例查询,以计算该表中行数的估计值。
(更准确地说,扫描一张表的成本不是根据行数计算的,而是根据表中的块数计算的(可以在ALL_TABLES 的BLOCKS 列中看到)。它将这个数字除以与多块读取计数相关的因子,以计算该部分计划的成本。)
【讨论】: