CBO(基于代价的优化器)的重要性和自动收集
本文尝试说明CBO的重要性,及Oracle Database 10g开始作为默认选项的统计情报的自动收集功能和他的注意点。
CBO是什么
CBO是实行计划做成时的数据库数据的参考情报。也叫基于代价的优化器(Cost Base Opitimizer),也叫优化器统计信息。
CBO按照以下步骤创建SQL执行计划。
1.选择一些执行计划的候补
2.估算每个执行计划实际执行时的cost(I / O资源+ CPU资源)
3.最后,选择成本最低的执行计划
这里,估算cost的最重要的基础情报就是优化器统计信息CBO。
优化器统计信息包括表中存储的行数,行的平均长度,列值的最大和最小值等,CBO会根据此数据估算成本。
优化器统计信息可以用DBMS_STATS包的下列功能收集:
* GATHER_TABLE_STATS:收集指定表的优化器统计信息
* GATHER_SCHEMA_STATS过程:收集指定Schema中所有对象的优化器统计信息
* GATHER_DATABASE_STATS过程:收集数据库中所有对象的优化器统计信息
正确收集优化器统计信息的重要性
要注意的是,如果对表中存储的数据进行更新,则优化器统计信息不会自动维护。
大量数据更新后,如果不重新收集优化器的统计信息,CBO将无法选择正确的执行计划,
因为优化器统计信息将不会正确反映表中存储数据的特征。
那么SQL执行时选择了不正确的执行计划,则SQL执行性能将不是最佳的,并且在某些情况下会导致致命的性能延迟。
自动收集优化器统计信息
从Oracle10g开始,引入了自动收集优化器统计信息的功能。
在默认配置中,收集优化器统计信息的时区为:
* 10g:周一至周五22:00-第二天06:00,周六和周日全天
* 11g:周一至周五22:00-第二天02:00,周六和周日06:00-第二天02:00
收集优化器统计信息的注意点
* 默认收集时区并不总是适用于所有系统:这个时候,可以变更收集时间。
* 在数据更新时间和收集时间之间,执行的SQL的性能可能不是最佳的: 大量数据更新后,可以显式收集优化器统计信息。
* 执行计划有可能会变动: 通常,定期重新收集优化器统计信息是适当的,因为SQL执行计划可以正确反映数据状态。
但是,如果想尽可能地固定执行计划,可以禁用自动收集优化器统计信息。
浙公网安备 33010602011771号