CBO如何选择相同成本的索引

  

  ACOUG年会杨长老的演讲中,曾提到一个问题,   

  
  

  一条SQL语句,两种执行计划的成本值相同,国会预算办公室是如何选择执行计划吗?   

     

  
  

  

  翻译一下问题,创建测试表数据,   

  
  

  完成;创建表z(一个数字,b数字);   
  创建表。   

  

  
  

  

  完成;begin    
  ,2,,,因为我在1 . .10000年循环   
  ,3,,,,,插入z值(我);   
  ,4,,,结束循环;   
  ,5,,,提交;   
  ,6,结束;   
  ,7,/
  PL/SQL过程成功完成。   

  

  
  

  

  完成;创建索引idx_z_01>         

  

  
  

  

  除了索引名称,以及索引叶子块,本来我怀疑聚簇因子,会是另外一个影响因素,但通过设置IDX_Z_01的clsfct高于IDX_Z_02的clsfct,   

  
  

  exec dbms_stats.set_index_stats (& # 39; BISAL& # 39;, & # 39; IDX_Z_01& # 39;, clstfct=祝辞;21);   

     

  
  

  

  根据10053显示,IDX_Z_01的clsfct高于IDX_Z_02的clsfct,   

  
  

  索引统计数据:   
  ,指数:IDX_Z_01 坳#:1   
  ,,级:1,#磅:100,# DK: 10000,磅/K: 1.00,DB/K: 1.00,CLUF: 21.00   
  ,指数:IDX_Z_02 坳#:2   
  ,,级:1,#磅:20,# DK: 10000,磅/K: 1.00,DB/K: 1.00,CLUF: 18.00   

     

  
  

  

  此时CBO选择的是IDX_Z_01,因为他的名字,排在IDX_Z_02前面,并未考虑聚簇因子的影响,   

  
  

  最好的::AccessPath: IndexRange   
  ,指数:IDX_Z_01   
  ,,,,,,,成本:2.00,学位:1,职责:2.00,卡:0.00,字节数:0   

     

  
  

  

  总结:   

  

  对于成本相同的索引10 gr2及以上的版本,甲骨文CBO还是有方法选择,索引叶子块是第一个条件,索引名称排序是第二个条件。   

CBO如何选择相同成本的索引