在 Oracle 中 80% 的性能问题是由 SQL 语句引起的,而在 SQL 进行硬解析时会使用 Oracle 优化器。优化器( Optimizer )是 Oracle 中内置的一个核心子系统,主要负责成生 SQL 执行计划。目前 Oracle 的优化器分为 RBO 和 CBO 两种类型。
1.RBO 优化器
RBO ( Rule-Based Optimizer )为一种基于规则的优化器。在 RBO 中 Oracle 为各种执行路径( Access Path )设置了固定的等级。 RBO 会根据 SQL 的诸多执行路径中,选取等级低的执行路径最后生成执行计划。 RBO 的执行路径等级分别为:
1 、 Single Row by Rowid
2 、 Single Row by Cluster Join
3 、 Single Row by Hash Cluster Key with Unique or Primary Key
4 、 Single Row by Unique or Primary Key
5 、 Clustered Join
6 、 Hash Cluster Key
7 、 Indexed Cluster Key
8 、 Composite Index
9 、 Single-Column Indexes
10 、 Bounded Range Search on Indexed Columns
11 、 Unbounded Range Search on Indexed Columns
12 、 Sort Merge Join
13 、 MAX or MIN of Indexed Column
14 、 ORDER BY on Indexed Column
15 、 Full Table Scan
其中 1 级的执行路径是 Single Row by Rowid ,等级最高的执行路径是 Full Table Scan , RBO 中会认为等级低的执行路径一定会比等级高的执行路径效率高( Oracle 中 rowid 表示数据的物理存储地址,通过 rowid 查找单个数据是最快的。索引中会存数据的 rowid 。)所以在有索引有 SQL 查询中, RBO 一定会走索引而不会使用等级最高的全表扫描。
RBO优化器在某些时候生成的执行计划并不是最优,例如:
1.我们知道在查询的结果集中包括大量数据时,使用全表扫描的效率是要比索引高的。(全表扫描每次会读取多个数据块)。
2.在出现执行路径等级相同的情况时,RBO会根据对象(索引)在数据字典中的顺序来选择执行计划(不同的索引执行效率不同)。
从Oracle 10g 之后官方已经不推荐使用RBO。
2.CBO优化器
CBO(Cost-Based Optimizer)为一种基于成本的优化器。这里的成本指的是执行SQL时CUP和I/O消耗的量(这里的消耗量是Oracle根据统计信息生成的一个估算值)。CBO在解析SQL时,会从诸多执行路径中选择成本最小的生成执行计划。CBO会根据对象的统计信息计算成本(统计信息中记录着对象的数据量等信息),这意味着CBO解析会比RBO更智能,CBO将会比较执行路径生成效率较高的执行计划。那么CBO就一定是完美的选择吗?
在某些情况下CBO会有些局限性,例如:
1.CBO在计算成本时是按统计信息中的数据计算的,而统计信息每天只更新一次,如果统计信息更新前后数据量存在巨大差距会影响CBO选择错误的执行计划。
2.CBO在计算成本时不会考虑DB Buffer Cache,如果DB Buffer Cache中已经缓存了要查询的数据时,是不需要耗费I/O去数据文件读取的。所以CBO可能会高估相关执行路径而选择错误执行计划。
3.直方图统计信息方面的不足可能会影响CBO选择错误执行计划。
4.在多表关联查询时,表之间的关联顺序会呈几何级的增长,各种可能生成的执行计划数量可能非常庞大,所以CBO只能在前2000种可能的执行计划中选一个,这就可能漏掉最优的执行计划。
DBA_建瑾
2013.11.23
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29324876/viewspace-777426/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29324876/viewspace-777426/