Oracle的优化器的RBO和CBO方式

 

一、基于规则的优化方式(Rule-Based Optimization,简称为RBO)
 
    优化器在分析SQL语句时,所遵循的是Oracle内部预约的一些规则,对数据是不敏感的。它只借助少许的信息来决定一个sql语句的执行计划,包括:
    1)sql语句自己
    2)sql中涉及到的table、view、index等的基本信息
    3)本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO是无效的)
    例如:咱们常见的,当一个where子句中的一列有索引时去走索引。可是须要注意,走索引不必定就是优的,好比一个表只有两行数据,一次IO就能够完成全表的检索,而此时走索引时则须要两次IO,这时全表扫描(full table scan)的效率更优。
 
 
二、基于代价的优化方式(Cost-Based Optimization,简称为CBO)
 
    它是看语句的代价(Cost),经过代价引擎来估计每一个执行计划所需的代价,该代价将每一个执行计划所耗费的资源进行量化,CBO根据这个代价选择出最优的执行计划。一个查询所耗费的资源可分为三部分: I/O代价、CPU代价、NETWORK代价。I/O是指把数据从磁盘读入内存时所需代价(该代价是查询所需最主要的,因此在优化时一个基本原则就是下降I/O总次数);CPU代价是指处理内存中数据所需的代价,数据一旦读入内存,当咱们识别出咱们所要的数据后,会在这些数据上执行排序(sort)或链接(join)操做,这须要消耗CPU资源;对于访问远程节点来讲,network代价的花费也是很大的。
    优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是作analyze后才出现的,不少的时侯过时统计信息会令优化器作出一个错误的执行计划,因些应及时更新这些信息(dbms_stat.analyze)。
    如星型链接排列查询,哈希链接查询,函数索引,和并行查询等一些技术都是基于CBD的。
 
 
三、优化模式包括Rule、Choose、First rows、All rows四种方式:
 
     Rule:基于规则的方式。
     Choolse:默认的状况下Oracle用的即是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,若是表或索引没统计信息,表又不是特别的小,并且相应的列有索引时,那么就走索引,走RBO的方式。
     First Rows:它与Choose方式是相似的,所不一样的是当一个表有统计信息时,它将是以最快的方式返回查询的最早的几行,从整体上减小了响应时间。
     All Rows:也就是咱们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的全部的行,从整体上提升查询的吞吐量。没有统计信息则走RBO的方式。
 
 
四、设定选用哪一种优化模式:
    A、在initSID.ora中设定OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS(默认是Choose)
    B、Sessions级别经过:ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
    C、语句级别用Hint(/*+ ... */)来设定
 
 
五、一些常见的问题:
 
  A、为何表的某个字段明明有索引,但执行计划却不走索引?
    一、优化模式是all_rows的方式 
    二、表做过analyze,有统计信息
    三、表很小,上文提到过的,Oracle的优化器认为不值得走索引。
 
  B、使用CBO时,SQL语句中为何不能引用系统数据字典表或视图?
    一、由于系统数据字典表都未被分析过,可能致使极差的“执行计划”。
    二、擅自对数据字典表作分析,可能致使死锁,或系统性能严重降低。
 
  C、使用CBO时如何选择表链接方式?
    一、CBO有时会偏重于SMJ和HJ,但在OLTP系统中,NL通常会更好,由于它高效的使用了索引。
    二、SMJ即便相关列上建有索引,最多只能因索引的存在,避免数据排序过程。
    三、HJ因为须作HASH运算,索引的存在对数据查询速度几乎没有影响。
 
  D、使用CBO时,须要注意什么吗?
    一、必须保证为表和相关的索引搜集足够的统计数据, 对数据常常有增、删、改的表最好按期对表和索引进行分析
    二、可用SQL语句:analyze table xxx compute statistics for all indexes
 
  E、为何有时使用CBO会比较慢?
    一、没有对表或视图进行Analyze
    二、SQL进行CBO时对于没有Analyze的对象会自动进行Analyze,所以形成运行缓慢
相关文章
相关标签/搜索