Performance
我想獲取 MAX() 和 WHERE 子句中的欄位的單獨索引
我客戶的數據庫有一個巨大的表(數億條記錄),並且
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
在創建新索引後刷新統計資訊!