Oracle 過度索引表
我正在嘗試提高 Oracle 11g 中視圖的性能,該視圖連接 11 個表,查詢中最大的 3 個表是 40、27、19 百萬行。我發現這些大表中的每一個都有超過 80 個不同的索引。除此之外,我懷疑數據庫伺服器記憶體不足。我知道許多索引會損害 UPDATE 、 INSERT 和 DELETE 操作的性能。我想知道這麼多索引是否會降低複雜 SELECT 查詢的性能?
對我來說,太多的索引意味著插入、更新或刪除行的成本更高。因為,如果索引有任何用途,它們就需要維護。查找包含您不查詢或不經常查詢的列的所有索引並將它們刪除。查找列相同的所有索引,但以不同的順序刪除除一個版本之外的所有索引。例如,一個好的索引將從低基數開始並變得更具體。例如國家、州、城市、郵政編碼。另一個好方法是,如果您按日期搜尋,其他欄位以日期列開頭以首先消除最大行數,然後選擇其他欄位匹配的值。嘗試將索引數量減少到每個表少於 10 個。
儘管有用的索引數量取決於這是 OLTP、DSS 還是數據倉庫。
正如JSapkota的評論所說,答案存在於 StackOverflow 上:
索引實際上會降低 SELECT 性能嗎?
是的,儘管非常輕微 - 如此輕微以至於回答“否”也是合理的。
如果您有一個可能被考慮用於查詢但不可用的索引,優化器將浪費很短的時間來思考是否以及如何使用它(在極少數情況下,索引和視圖非常複雜,並且在索引性能提示時更頻繁)錯了,你可能最終選擇了一個次優的查詢計劃)。
上面引用中的“短時間”通常在微秒範圍內,最壞的情況是幾毫秒。
另一方面:
索引過多會導致執行計劃穩定性出現問題。.ie你可能會遇到問題,當Oracle突然“更改執行計劃而不發出警告”時。這也可能表明過去存在性能問題,有人試圖修復它們,但不知道到底發生了什麼。ibre5041
因此,您可能應該花一些時間尋找未使用的索引。