oracle 複合索引

轉自https://www.csdn.net/gather_29/MtTaQg0sOTIyMC1ibG9n.html

oracle通過複合索引優化查詢及不走索引的8種情況 :https://www.cnblogs.com/jiarui-zjb/p/9551189.html

創建複合索引;

CREATE INDEX [索引名稱] ON [表名(列1,列2)];
--例子
CREATE INDEX name ON employee (emp_lname, emp_fname);

1.複合索引: 前綴性(Prefixing)

       先從例子說起.假設省,市,縣分別用3個字段存儲數據,並建立了一個複合索引.請記住: oracle索引,包括複合索引都是排序的.

例如該複合索引在數據庫索引樹上是這樣排序的,即先按省排序,再按市排序,最後按縣排序:

省  市  縣
北京  北京  東城
北京  北京  西城
北京  北京  海淀
黑龍江  哈爾濱  道里區
黑龍江  哈爾濱  道外區
黑龍江  哈爾濱  香坊區

        索引結構是先按省排序的,所以只要給出省名,就能使用索引.如果沒有省名,oracle就成了無頭蒼蠅,亂找一氣,變成了全表掃描了.例如,如果你只給一個縣條件,如"香坊區",oracle肯定不會使用該索引了

2.關於skip scan index

        有時候複合索引第一個字段沒有在語句中出現,oralce也會使用該索引.對,這叫oralce的skip scan index功能,oracle 9i才提供的.

        skip scan index功能適合於什麼情況呢?如果oracle發現第一個字段值很少的情況下,例如假設emp表有gender(性別)字段,並且建立了(gender,ename,job,mgr)複合索引.因爲性別只有男和女,所以爲了提高索引的利用率,oracle可將這個索引拆成('男',ename,job,mgr),('女',ename,job,mgr)兩個複合索引.這樣即便沒有gender條件,oracle也會分別到男索引樹和女索引樹進行搜索.但是,(gender,ename,job,mgr)索引本身設計是不合理的,它違背了複合索引的第二個原理,可選性(Selectivity),見下面描述.       

      3.複合索引的第二個原理:可選性(Selectivity)

        oracle建議按字段可選性高低進行排序,即字段值多的排在前面.例如,(ename,job,mgr,gender),(縣,市,省).這是因爲,字段值多,可選性越強,定位的記錄越少,查詢效率越高.例如,全國可能只有一個"開福區",而湖南省的記錄則太多了.

         4.複合索引設計建議

(1).分析SQL語句中的約束條件字段.

(2).如果約束條件字段比較固定,則優先考慮創建針對多字段的普通B*樹複合索引.如果同時涉及到月份,納稅人識別號,稅務機關代碼3個字段的條件,則可以考慮建立一個複合索引.

(3).如果單字段是主鍵或唯一字段,或者可選性非常高的字段,儘管約束條件比較固定,也不一定要建成複合索引,可建成單字段索引,降低複合索引開銷.

(4).在複合索引設計中,需首先考慮複合索引的第一個設計原理:複合索引的前綴性.即在SQL語句中,只有將複合索引的第一個字段作爲約束條件,該複合索引纔會啓用.

(5).在複合索引設計中,其實應考慮複合索引的可選性.即按可選性高低,進行復合索引字段的排序.例如上述索引的字段排序順序爲:納稅人識別號,稅務機關代碼,月份.

(6).如果條件涉及的字段不固定,組合比較靈活,則分別爲月份,稅務機關代碼和納稅人識別號3個字段建立索引.

(7).如果是多表連接SQL語句,注意是否可以在被驅動表(drived table)的連接字段與該表的其他約束條件字段上創建複合索引.

(8).通過多種SQL分析工具,分析執行計劃以量化形式評估效果.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章