Oracle

加快這 4 個查詢的最有效索引是什麼?

  • February 13, 2018

我有一些要加快的查詢,但它們過濾的列都是不同的,但相關的,我無法找出為它們創建索引的最佳方法。

所以第一個查詢是這樣的

1: select * from TABLE where A=? AND B=? and C=?

然後,接下來的三個查詢都在同一個表上,但它們每個都使用 A、B 和 C 中 2 個元素的可能組合之一。

2: select * from TABLE where A=? AND B=?

3: select * from TABLE where A=? and C=?

4: select * from TABLE where B=? and C=?

所以我想如果我在 (A,B,C) 上建立一個索引可以加快查詢 1 和 2,但我認為它不會對查詢 3 或 4 做任何事情。那麼我需要另外兩個索引嗎(A,C)和(B,C),還是有更有效的方法來做到這一點?

我正在使用 Oracle 12c 順便說一句。

如果沒有更多資訊,答案是“取決於”,因為最佳值將根據 A、B 和 C 的分佈屬性而有所不同(它們中的任何一個是否每行都是唯一的,即它們中的任何一個都是您的主鍵或主題一個唯一的索引?或者它們是否包含許多重複的值,如果是的話,這些值是如何聚集在一起的?),它們的類型和大小等等。此外,表格有多寬:除了這三個和/或包含大量數據(例如長字元串)的列之外,它是否還有更多列?

可能的一般答案:

如果我在 (A,B,C) 上創建一個索引,這將加快查詢 1 和 2

正確的。

但我認為它不會對查詢 3 或 4 做任何事情。

它可以幫助查詢 3。它希望能夠使用該索引的查詢計劃器,因為它以它開頭,A並且是查詢 3 中過濾的列之一。它可能會選擇不使用,具體取決於A數據的選擇性和屬性在其他列中,表更普遍,在更複雜的查詢中其他對象。

如果表很寬,也就是說每行的數據明顯多於這三列中的數據,那麼這個索引也可以幫助查詢 4:在沒有任何其他有用索引的情況下,查詢規劃器可能會選擇掃描索引A,B,C以查找匹配的行,而不是掃描整個表,這可能意味著讀取更多頁面。

(A,C)和(B,C)上的索引,還是有更有效的方法來做到這一點?

如果您的目標只是查詢速度,那麼這兩個索引對於這些查詢可能是最佳的。just 上的索引C可能(同樣,取決於其中的數據C和其他列)對查詢 3 和 4 都有用,因為規劃器可以使用 where 子句進行索引搜尋,C然後進行部分掃描以查找與該子句匹配的行BA。這取決於列的大小,可能會節省磁碟空間和工作記憶體並加快inserts 和updates 的速度,但對於 s 來說可能不如select兩個更寬的索引那麼優化。

變得更高級:您對集群設置的選擇可能很重要(請參閱http://use-the-index-luke.com/sql/clustering/index-organized-clustered-index),尤其是在您使用SELECT *時,儘管 Oracle 是在這個問題上,比 SQL 伺服器(任何索引都可以是集群鍵)靈活一點。

要自己嘗試一下,請將一些真實數據放入表的副本中,然後使用EXPLAIN PLAN(請參閱https://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)查看哪些索引它選擇用於您的查詢和其他性能計數器,以查看這有什麼掛鐘效應。

引用自:https://dba.stackexchange.com/questions/197804