Oracle优化器

    Oracle优化器存在两种优化方式:基于规则的优化方式RBO(Rule-Based Optimization)和基于代价的优化方式CBO(Cost-Based Optimization),其中RBO方式在oracle10g中已经摒弃。

    RBO是一种基于规则的优化方式,优化器在分析SQL语句时遵循oracle内部预定的一些规则,如,当一个where子句中的一列有索引时就走索引。RBO根据可用的访问路径和访问路径的等级来选择访问计划,等级越高的访问路径运行SQL速度越慢如果有多个路径,则选用等级较低的路径。

    CBO是一个基于代价或成本的优化方式,代价或成本即内存和CPU 的消耗。优化只要是根据可用的访问路径、表或索引的统计信息等来选择一个成本最低的访问路径。所以要及时更新统计信息,避免过期的统计信息让优化器选择一个错误的执行计划。

       CBO主要包含查询转化器(Query Transformer)、评估器(Estimator)和计划生成器(Plan Generator)

    一、查询优化器,由于查询SQL语句的形式可能会影响所产生的执行计划,查询转化器就是改变查询语句的形式以获得更为高效的执行计划,Oracle主要提供四种转化技术:

   1.视图合并(View Mergin):查询语句含有视图时,会产生独立的“视图查询块”,影响语句的整体性,会产生不良的执行计划。视图合并会去掉“视图查询块”,将视图合并至一个整体的查询块中,使执行计划的整体性得到提升。

   2.谓词推进(Predicate Pushing):这项技术是将不能进行合并的视图相应的谓词推进到视图查询块中。这些谓词通常是可索引或有较强过滤性的。

   3.非嵌套子查询(Subquery Unnesting):子查询和视图一样,会被放进独立的查询块,查询转换器会将大多数子查询转为连接放进同一个查询块,不能合并的按照一个高效的方式排列。

   4.物化视图的查询重写:当query_rewrite_enabled=true时,转化器会寻找与该语句相关联的物化视图,并将该语句改写。

   二、评估器,评估器通过计算三个值来评估计划的总成本:选择性(Selectivity)、基数(Cardinality)、成本(Cost)

    1.选择性:是一个大于0小于1的数,0表示没有记录被选定,1表示所有记录都被选定。统计信息和直方图关系到选择性值的准确性。如:name=’Davis’,如果不存在统计信息评估器将根据所用的谓词来指定一个缺省的选择性值,此时评估器会始终认为等式谓词的选择性比不等式谓词小;如果存在统计信息而不存在直方图,此时选择性值为1/count(distinct name);如果存在统计信息也存在直方图,选择性值则为count(name)where name=’Davis’/ count(name)where name is not null。

    2.基数:通常表中的行数称为“基础基数”(Base cardinality);当用WHERE中的条件过滤后剩下的行数称为“有效基数”(Effective cardinality);连接操作之后产生的结果集行数称为“连接基数”(Join cardinality);一个字段DISTINCT之后的行数称为“DISTINCT基数”等等。

    3.成本:就是度量资源消耗的单位。可以理解为执行表扫描、索引扫描、连接、排序等操作所的消耗I/O、CPU、内存。

    三、计划生成器,最后是计划生成器的作用就是生成大量的执行计划,然后选择其中总体成本最低的一个,如果它发现当前执行计划的成本已经很低了,它将停止试验,相反当前计划的成本如果很高,它将继续试验其他执行计划。

你可能感兴趣的:(oracle10g,CBO,优化器)