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如何选择相同成本的索引