先拋出兩個問題
Q1:
如果有A、B、C三個字段,都可能作為查詢條件,是建立多個復合索引好,還是建立三個單列的索引
Q2:
我在同一張表上建立了多個索引,為什么Oracle每次都選擇一個,而不能同時利用多個索引呢?
關於第一個問題,這個問題之所以不好回答是因為和業務或者說和查詢的模式有很大的關系。
主要來看看第二個問題
我在同一張表上建立了多個索引,為什么Oracle每次都選擇一個,而不能同時利用多個索引呢?
Oracle只有在AND-EQUAL、INDEX HASH JOIN和BITMAP INDEX AND/OR這三種執行計划下,能對一張表的查詢中使用多個索引
今天主要來說下AND-EQUAL這種執行方式
AND-EQUAL是一種基於RBO下的執行計划,將多個單列索引進行合並(Index Merge)輸出查詢結果。
同時and_equal可以通過Hints來進行強制,最少指定兩個索引,最多指定5個,但是在Oracle10G之后幾乎已經被廢棄了,(主要是因為10G之后主要使用的是CBO,復合索引遠遠優於And-Equal)
簡單地來說,就是在訪問一張表的同時,同時可以走多個不同的index。
但是在Oracle10G之后,Oracle是基於統計信息來選擇執行計划,And-Equal這種方式無法顯示出統計信息的直方圖(我也不知道是為啥,反正在CBO之下,應該是只能使用一個Index)
索引的根本意義是,通過走索引能夠篩選掉盡可能多的rowid和選擇到盡可能少的rowid,(如果index scan得到的rowid的數量很多,和全表的rowid差不多,那我index scan個屁,不如直接full table scan)
所以理論上,復合索引可以完美解決第一個問題
https://blog.csdn.net/wadekobe9/article/details/7738955
