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执行计划可以正确反映数据状态。

                                            但是,如果想尽可能地固定执行计划,可以禁用自动收集优化器统计信息。

posted on 2021-02-23 17:52  至柔  阅读(267)  评论(0)    收藏  举报

导航