Sql-Server

用過濾(非空值)索引替換索引有什麼影響?

  • August 8, 2019

我們的項目執行一個非常大、非常複雜的數據庫。所以大約一個月前,我們注意到包含空值的索引列使用的空間變得太大了。作為對此的回應,我編寫了一個腳本,該腳本將動態搜尋包含超過 1% 空值的所有單列索引,然後在值不為 NULL 的情況下將這些索引刪除並重新創建為過濾索引。這將在整個數據庫中刪除並重新創建數百個索引,通常會釋放整個數據庫使用的近 15% 的空間。

現在我有兩個問題:

A)以這種方式使用過濾索引有什麼缺點?我認為它只會提高性能,但是否存在任何性能風險?

B)我們在刪除和重新創建索引時收到錯誤(“無法刪除索引 XYZ,因為它不存在或您沒有權限”),即使事後檢查時,一切都完全符合預期。這怎麼可能發生?

謝謝你的幫助!

**編輯:**回應@Thomas Kejser

嗨,謝謝,但事實證明這是一場災難。當時我們不明白一些事情,例如:

  1. 在查詢期間,SQLOS 在確定它不能使用 NULL 值連接表列之前製定索引計劃。IE,您確實需要有一個 WHERE 子句過濾器來匹配查詢中使用的每個過濾索引的索引,否則根本不會使用該索引。
  2. 刪除和創建索引並在之後再次冗餘更新它們的統計資訊可能仍不足以生成更新的計劃,我們假設他們會這樣做。在某些情況下,似乎只有足夠高的工作負載才會迫使 SQL Server 重新評估計劃。
  3. 執行計劃程序的功能有一些奇特的東西,僅憑常識和邏輯很難確定。即使有成千上萬的程式碼隱藏生成的不同查詢的變體,看似無用的索引也可以幫助一些最終用於關鍵查詢的統計資訊和查詢計劃。

最後,這些變化被恢復了。因此,過濾索引是一個強大的工具,但您需要真正了解從這些列中獲取的數據究竟是什麼。除了空間問題之外的普通索引相當容易應用,過濾索引代表了非常定制的解決方案。它們當然不是正常索引的替代品,而是在需要它們的特殊情況下對它們的擴展。

非常有趣的方法。我對創造力的支持。

既然您回收了空間,我假設原始索引不再存在?過濾索引的缺點是:

實際上,這意味著您必須非常小心過濾索引,因為它們通常會導致糟糕的查詢計劃。我不會稱它們無用,但我認為它們是對傳統索引的補充,而不是替代品(正如您正在嘗試做的那樣)。

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