中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CBO如何選擇相同cost的索引

發布時間:2020-08-14 01:21:03 來源:ITPUB博客 閱讀:168 作者:bisal 欄目:關系型數據庫

ACOUG年會楊長老的演講中,曾提到一個問題,

一條SQL語句,兩種執行計劃的cost值相同,CBO是如何選擇執行計劃?


翻譯一下問題,創建測試表數據,

SQL> create table z (a number, b number);
Table created.


SQL> begin 
  2    for i in 1 .. 10000 loop
  3      insert into z values(i, i);
  4    end loop;
  5    commit;
  6  end;
  7  /
PL/SQL procedure successfully completed.


SQL> create index idx_z_01 on z(a);
Index created.

SQL> create index idx_z_02 on z(b);
Index created.


SQL> exec dbms_stats.gather_table_stats('BISAL', 'Z', cascade=>true);
PL/SQL procedure successfully completed.


對于以下SQL,

select * from z where a=1 and b=1;


根據10053顯示,可以看出,IDX_Z_01和IDX_Z_02這兩個索引,cost相同,CBO會選擇何種執行計劃?

注:關于10053介紹,可以參考《 探索索引的奧秘 - 10053事件 》

Index Stats::
  Index: IDX_Z_01  Col#: 1
    LVLS: 1  #LB: 20  #DK: 10000  LB/K: 1.00  DB/K: 1.00  CLUF: 18.00
  Index: IDX_Z_02  Col#: 2
    LVLS: 1  #LB: 20  #DK: 10000  LB/K: 1.00  DB/K: 1.00  CLUF: 18.00


Access Path: index (AllEqRange)
    Index: IDX_Z_01
    resc_io: 2.00  resc_cpu: 14613
    ix_sel: 0.000100  ix_sel_with_filters: 0.000100
    Cost: 2.00  Resp: 2.00  Degree: 1
  Access Path: index (AllEqRange)
    Index: IDX_Z_02
    resc_io: 2.00  resc_cpu: 14613
    ix_sel: 0.000100  ix_sel_with_filters: 0.000100
    Cost: 2.00  Resp: 2.00  Degree: 1


楊長老提到dbsnake曾經寫過,檢索了下,有一篇文章介紹,

《CBO對于Cost值相同的索引的選擇》

http://www.dbsnake.net/handle-equally-costed-indexes.html


文章總結來講,

對于Oracle 10gR2及其以上的版本,CBO對于Cost值相同的索引的選擇實際上會這樣:

1. 如果Cost值相同的索引的葉子塊數量不同,則Oracle會選擇葉子塊數量較少的那個索引;

2. 如果Cost值相同的索引的葉子塊數量相同,則Oracle會選擇索引名的字母順序在前面的那個索引。


先驗證(2)的觀點,從上面10053可以看出,兩個索引的cost相同,葉子塊數相同,此時CBO選擇的是IDX_Z_01,因為他的名字,排在IDX_Z_02前面,

Best:: AccessPath: IndexRange
  Index: IDX_Z_01
         Cost: 2.00  Degree: 1  Resp: 2.00  Card: 0.00  Bytes: 0


執行計劃顯示,使用索引IDX_Z_01,


除了索引名稱,以及索引葉子塊,本來我懷疑聚簇因子,會是另外一個影響因素,但通過設置IDX_Z_01的clsfct高于IDX_Z_02的clsfct,

exec dbms_stats.set_index_stats('BISAL','IDX_Z_01',clstfct=>21);


根據10053顯示,IDX_Z_01的clsfct高于IDX_Z_02的clsfct,

Index Stats::
  Index: IDX_Z_01  Col#: 1
    LVLS: 1  #LB: 100  #DK: 10000  LB/K: 1.00  DB/K: 1.00  CLUF: 21.00
  Index: IDX_Z_02  Col#: 2
    LVLS: 1  #LB: 20  #DK: 10000  LB/K: 1.00  DB/K: 1.00  CLUF: 18.00


此時CBO選擇的是IDX_Z_01,因為他的名字,排在IDX_Z_02前面,并未考慮聚簇因子的影響,

Best:: AccessPath: IndexRange
  Index: IDX_Z_01
         Cost: 2.00  Degree: 1  Resp: 2.00  Card: 0.00  Bytes: 0


總結:

對于cost相同的索引,10gR2及以上的版本,Oracle CBO還是有方法選擇,索引葉子塊是第一個條件,索引名稱排序是第二個條件。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武陟县| 通河县| 阿坝| 兴隆县| 新源县| 贵州省| 安溪县| 屯门区| 靖远县| 丰镇市| 恩平市| 宁河县| 张家港市| 镇雄县| 恭城| 临西县| 呼玛县| 宝应县| 连平县| 亚东县| 会宁县| 宜君县| 斗六市| 军事| 彰化市| 临潭县| 涪陵区| 陆良县| 鹤峰县| 梁山县| 峨边| 萍乡市| 鞍山市| 个旧市| 宁津县| 宜兰县| 莒南县| 武鸣县| 涞水县| 济宁市| 康马县|