2012-10-01 61 views
0

比方說,有一個叫T1過濾索引中包含哪些列?

CREATE TABLE T1 
(
    GID INT NOT NULL, 
    Attrib1 BIT NOT NULL, 
    Attrib1Date DATE NOT NULL, 
    Attrib2 BIT NOT NULL, 
    CONSTRAINT PK_T1 PRIMARY KEY (GID) 
) 

現在,我創建查詢索引,其中只有與Attrib1行等於1或等於Attrib2 1有趣的表。假設只有20%的行像這樣。

請不要關注Attrib1到Attribe2的相互作用 - 它們只給出兩個單獨的例子。

很明顯,使用過濾索引 - 我的意思是:INDEX -ES與WHERE子句。但問題是包含哪些列?

示例查詢:

SELECT * FROM T1 WHERE Attrib1 = 1 ORDER BY Attrib1Date 
SELECT * FROM T1 WHERE Attrib2 = 1 

實例和問題1)

哪個索引更正確?

CREATE NONCLUSTERED INDEX IX_Attrib1 
ON T1 (Attrib1, Attrib1Date) 
WHERE Attrib1 = 1 

OR

CREATE NONCLUSTERED INDEX IX_Attrib1 
ON T1 (Attrib1Date, Attrib1) 
WHERE Attrib1 = 1 

OR

CREATE NONCLUSTERED INDEX IX_Attrib1 
ON T1 (Attrib1Date) 
WHERE Attrib1 = 1 

實施例和問題2)

是否正確建立由僅含柱過濾索引進行過濾,像:

CREATE NONCLUSTERED INDEX IX_Attrib2 
ON T1 (Attrib2) 
WHERE Attrib2 = 1 
+1

(http://stackoverflow.com/q/10897198/73226) –

回答

2

首先,消除了誤解:

比方說,現在只有20%這樣的行......很明顯使用 過濾索引

不,這不是很明顯在所有。我認爲該指數有時需要考慮1%左右的選擇性。通常,門檻值爲5%。有一篇關於它的文章,但我不記得在哪裏。在Google上搜索它。

在你的3個變種

創造一個Attrib1 = 1

因爲SQL Server的執行篩選索引的,Attrib1在需要非聚集索引IX_Attrib1 ON T1(Attrib1,Attrib1Date) 索引鍵。儘管如此,將它置於位置1並不會使其非常具有選擇性。

CREATE NONCLUSTERED INDEX IX_Attrib1 ON T1(Attrib1Date,Attrib1) WHERE Attrib1 = 1

這個比上述更具有選擇性,並且將是優選的。預條件用於檢查過濾索引的適用性,但是在這之後,定期查詢引擎接管,其將執行正常選擇性檢查等

CREATE NONCLUSTERED INDEX IX_Attrib1 ON T1( Attrib1Date) WHERE Attrib1 = 1

出於上述原因,這個人是不理想的,這是因爲處理過程轉到:

  1. 查詢包含WHERE Attrib1 = 1 - >該指數可以考慮(與其他潛力)
  2. Attrib1Date選擇性是否足夠?
  3. 索引包含(Attrib1Date +記錄指針)=>可以把這些服務的請求,其中包括WHERE Attrib1 = 1條件

它無法在#3

CREATE NONCLUSTERED INDEX IX_Attrib2 ON T1(Attrib2 ) WHERE Attrib2 = 1

是的,你如果只拿到索引創建這樣做,和列的包括用於常規查詢優化器/ EN gine超越了filtered index applicability檢查。

+0

在過濾索引存放多餘的附加列不幸往往按我的鏈路所需的問題在[選擇時,一些行爲來考慮。 –

+0

謝謝馬丁。我瀏覽了SO問題和連接問題,嘗試了一些事情並總結了我的理解。由於性能方面的原因以及在「查詢優化器」中爲過濾後的索引創建兩個分支,實現類型是有意義的。 – RichardTheKiwi