2012-05-11 78 views
9

對於'大'表,是否有任何理由不對可選列的索引進行過濾?SQL過濾索引:我應該總是在可選列的索引上放置一個過濾器嗎?

因此,對於AAA列索引(因爲人們可以在AAA上進行搜索),
我可以將篩選器設置爲([AAA] IS NOT NULL)
這節省了存儲空間,因此可以節省資金。

technet一些更多的優點:

  • 提高查詢性能和計劃質量
  • 簡化索引維護成本
  • 簡化索引存儲成本

人們說,這是很好的放過濾大部分爲空的列的索引。但是,爲什麼我不會在索引中爲像1%那樣空的列進行過濾?如果它只有優勢,是否有任何理由不這樣做?

回答

5

這通常是有兩個陷阱是個好主意:

  1. 表設計有一個bug(只預迪納利!)。當它重建一張表時,它會刪除所有的過濾器。
  2. 確保優化器可以靜態地告訴您的謂詞永遠不會允許空行被返回。通常情況下,這是因爲SQL NULL語義(令人驚訝的是他們幫助而不是阻礙的唯一情況)。例如:select distinct col from T將不會使用索引,因爲可能會找到空值。使用這個:select distinct col from T where col is not null

過濾後的索引大量使用不足。他們甚至可以用來使一個可空的列獨一無二。

我的實用建議:只要嘗試幾個月,並自己學習,如果有其他未解決的問題。

如果您使用高級SQL Server查詢技術,還可以查看廣告索引視圖。 THey是一組超級過濾的索引(至少在Enterprise上)。

+1

+1爲直接的答案,和獨特的和無效的提示! –

0

所有指標都有優點和缺點: 缺點:

  1. 他們佔用的磁盤空間來維持
  2. 他們需要(索引樹需要定期reorgansised的 的平衡,以保證任何 查詢優化不使用bum數據分佈)可能 意味着它們需要脫機 - 如果它們很忙,則爲壞消息
  3. 如果頻繁插入,它們需要時間進行更新。

優點:

  1. 正確設計的,它們可以消除昂貴的表掃描
  2. 設計得當,(覆蓋索引)它們可以elimiate讀取的任何表。

所以通常它取決於。

  1. 太多的索引可以大大慢寫performanace
  2. 太多的索引可以大大提高dispace使用
  3. 不正確的索引,可以大大減少讀取性能

有的人做一個很好的生活出真正瞭解關於索引他們的東西: 有非常好的東西在這裏http://www.insidesqlserver.com/

因此,它取決於用戶返回索引引用的數據的頻率,以及它們更新通過索引包含的數據的頻率。

稀疏列索引沒有區別,但列(大部分)爲空時,篩選索引效率更高。一旦備件減少(例如50/50),那麼當優化器決定返回數據的最佳計劃時,數據的分配可能變得非常重要。過濾後的索引不會知道過濾器外數據的分佈情況 - 顯而易見,但需要說明。

+2

我想你錯過了這個問題的關鍵。它不是關於索引,而是關於索引的過濾器。它帶走了你佔用磁盤空間等缺點。 –

+0

對不起,我試圖指出,當考慮通常有一個索引時,總體考慮始於相同的地方。數據密度,讀取vs寫入等。結果應該是索引/否索引,如果索引則索引類型。隨着時間的推移和數據分佈的變化,您還可以使用丟失/未使用的索引存儲過程來調整性能。過濾後的索引佔用比沒有索引更多的空間,比未過濾的索引更少的空間。不想開始戰爭! –

+0

所以現在對於我的問題:你說:「列在哪裏大部分是空的,然後過濾索引效率更高」 - >爲什麼我不會在只有5%空的列的索引上放置過濾器,甚至像1%? (它仍然可能像500000行,所以它可以節省存儲空間。) –