Performance

我想獲取 MAX() 和 WHERE 子句中的欄位的單獨索引

  • July 17, 2015

我客戶的數據庫有一個巨大的表(數億條記錄),並且SELECT通過累積使用,它正在消耗大量的處理時間。每個執行官平均需要將近一分鐘。(無論如何,這就是 AWR 告訴我的。)

SELECT
   MAX(fldA)
FROM
   humongoustable
WHERE
   fldB = :B2 AND fldC = :B1

涉及上述欄位的索引只有一個,並且位於(fldC, fldA, fldB).

我懷疑這沒有任何幫助,應該有兩個單獨的非唯一索引;一為fldA一為(fldB, fldC)。我對麼?

能給你帶來最大好處的指數是 on

fldB, fldC, fldA desc

或開

fldC, fldB, fldA desc

取決於你的數據。您需要檢查您的數據和鍵,以確定應先顯示哪一列。

索引的最後一列是計算最大值的列。通過將它包含在索引中,您將避免表訪問。並且通過包含關鍵字desc,這意味著 Oracle 可以使用索引來計算最大值——它將是索引中前兩列匹配的第一個條目。

在理想情況下,您的索引的前導列中將有許多重複值。在這種情況下,您可能會通過使用索引鍵壓縮獲得一些可衡量的改進。在這種情況下,您的創建索引語句將類似於

create index humongoustable_idx on humongoustable(fldB, fldC, fldA desc) compress 1;

不要忘記humongoustable在創建新索引後刷新統計資訊!

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