Oracle
分區鍵上的索引
我們有一個列表分區表。設分區列為 c1。我們在該列(c1)上有一個索引。我們計劃刪除索引。我們的疑問是,如果我們刪除索引,是否會影響性能?假設我們正在查詢其中一個分區。oracle優化器是直接使用分區段還是依靠索引(在分區列上)來選擇正確的分區,或者如果我們刪除索引,它是否執行全表掃描(遍歷所有段)?
首先,您可以嘗試監控索引使用情況。您將選擇使用索引或未使用的答案。可以多次打開/關閉索引監控以獲取更多資訊。
例如,這裡:https ://oracle-base.com/articles/9i/performance-enhancements-9i#IndexMonitoring
此外,您可以查看 v$sql_plan 視圖以查看最近使用此索引的查詢:
select s.sql_id, s.sql_text from v$sql_plan p, v$sql s where p.sql_id = s.sql_id and object_name = 'YOUR_INDEX_NAME_HERE' ;
此外,最重要的是,您可以使索引對優化器不可見。這樣您就可以清楚地看到它是否會影響查詢的性能。
範例 - https://oracle-base.com/articles/11g/invisible-indexes-11gr1
Eduard 建議讓索引不可見是一種快速檢查方法。一些背景資料:
這取決於分區的數量、每個分區中的數據量以及每個分區的數據百分比。我假設您在詢問具有
WHERE
指定列表分區列值的子句的查詢是否會受到影響。
- 如果您有 5 個分區,並且每個分區中的行分佈相當均勻,則可能不會使用索引。如果您有 100 個分區,則可能會使用索引。
- 如果您有傾斜的數據(IE:列表分區
A
有 1 億行,列表分區B
有 1000 萬行,而其他分區有大約 100 萬行,那麼索引可能會有所幫助,但如果您確保為該列收集了統計資訊,例如過程的method_opt=>'FOR COLUMNS C1 SIZE 20'
參數DBMS_STATS.GATHER_TABLE_STATS
,假設您的分區少於 20 個。即:這SIZE 20
是用於列的直方圖的大小,C1
因此您希望大小比數字大一點的唯一值C1
。您還可以執行一些
EXPLAIN PLAN
帶有提示的命令以使用/忽略相關索引並查看會發生什麼。