組合索引的選擇原則

flzhang發表於2017-07-13

表上的索引是根據什麼建立的,特別是組合索引,有多個的時候優化器又怎麼選擇使用哪個呢,
今天做個試驗驗證下
新建這個表testindex
表結構
Name       Type          Nullable Default Comments
---------- ------------- -------- ------- --------
CREATETIME DATE          Y                        
LOC        VARCHAR2(100) Y                        
STATUS     VARCHAR2(20)  Y                        
COL1       VARCHAR2(10)  Y                        

testindex上只有兩個索引
right1 loc,createtime,status
right2 createtime,loc,status

收集表統計資訊
BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',
                                 tabname => 'TESTINDEX',
                                 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
                                 method_opt => 'for all columns size skewonly',
                                 cascade=>TRUE
                                 );
END;
收集統計資訊可參考
http://blog.csdn.net/robinson1988/article/details/5329522

根據條件取值範圍不同執行sql
Select *
From testindex
Where CREATETIME = :1
And  loc > :3
And  status =:4
走createtime,loc,status索引

Select *
From testindex
Where CREATETIME > :1
And  loc = :3
And  status =:4
走loc,createtime,status索引

說明選擇組合索引時根據查詢條件判斷,取值越精準,範圍越小的欄位createtime/loc放前面的索引越優先被選擇
這裡收集統計資訊還是很必要的,上面這個選擇索引的規則和直方圖,是否有其他索引關係應該不大


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750077/viewspace-2141998/,如需轉載,請註明出處,否則將追究法律責任。

相關文章