Oracle

分區鍵上的索引

  • December 3, 2019

我們有一個列表分區表。設分區列為 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帶有提示的命令以使用/忽略相關索引並查看會發生什麼。

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