轉自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分析工具,分析執行計劃以量化形式評估效果.