ITPub博客

首页 > 数据库 > Oracle > Oracle优化器(RBO与CBO)

Oracle优化器(RBO与CBO)

原创 Oracle 作者:DBA_建瑾 时间:2013-11-23 23:52:30 0 删除 编辑
      
    
Oracle80%的性能问题是由SQL语句引起的,而在SQL进行硬解析时会使用Oracle优化器。优化器(Optimizer)是Oracle中内置的一个核心子系统,主要负责成生SQL执行计划。目前Oracle的优化器分为RBOCBO两种类型。
    1.RBO优化器
    RBORule-Based Optimizer)为一种基于规则的优化器。在RBOOracle 为各种执行路径(Access Path)设置了固定的等级。RBO会根据SQL的诸多执行路径中,选取等级低的执行路径最后生成执行计划。RBO的执行路径等级分别为:
    1Single Row by Rowid
    2Single Row by Cluster Join
    3Single Row by Hash Cluster Key with Unique or Primary Key
    4Single Row by Unique or Primary Key
    5Clustered Join
    6Hash Cluster Key
    7Indexed Cluster Key
    8Composite Index
    9Single-Column Indexes
    10Bounded Range Search on Indexed Columns
    11Unbounded Range Search on Indexed Columns
    12Sort Merge Join
    13MAX or MIN of Indexed Column
    14ORDER BY on Indexed Column
    15Full Table Scan
    其中1级的执行路径是Single Row by Rowid,等级最高的执行路径是Full Table ScanRBO中会认为等级低的执行路径一定会比等级高的执行路径效率高(Oraclerowid表示数据的物理存储地址,通过rowid查找单个数据是最快的。索引中会存数据的rowid。)所以在有索引有SQL查询中,RBO一定会走索引而不会使用等级最高的全表扫描。

RBO优化器在某些时候生成的执行计划并不是最优,例如:

1.我们知道在查询的结果集中包括大量数据时,使用全表扫描的效率是要比索引高的。(全表扫描每次会读取多个数据块)。

2.在出现执行路径等级相同的情况时,RBO会根据对象(索引)在数据字典中的顺序来选择执行计划(不同的索引执行效率不同)。

Oracle 10g 之后官方已经不推荐使用RBO

2.CBO优化器

CBOCost-Based Optimizer)为一种基于成本的优化器。这里的成本指的是执行SQLCUPI/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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-11-15

  • 博文量
    22
  • 访问量
    244627