4

我正在使用SQL Server 2008 R2,並且我想在非唯一的可以爲空的字段上添加非聚集索引。我的指數也將有一個更加列包括以避免訪問我的羣集索引:如何通過避免掃描空值來減少索引掃描

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField); 

myBasicField實際數據會有很多NULLs,我想知道如果有一個方法可以讓我增加性能通過不掃描這些NULLs,或阻止NULL值存儲在我的索引上。

在此先感謝。

+0

我喜歡過濾的索引答案。這只是別的。你可以把這些數據放在一個帶有FK關係的單獨表中,然後你完全消除null(如果它是空的,那麼在FK表中沒有行)。如果兩個都是聚簇索引,PK到FK的連接速度相當快。 – Paparazzi 2012-04-09 16:10:20

回答

6

有了SQL Server 2008和更新,你可以使用一個過濾指數。看到intro blog post here - 語法爲:

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField) 
WHERE myBasicField IS NOT NULL; 

包含相同WHERE子句可以利用這一點任何查詢,該指數會小很多,因此有更好的表現,如果你排除這樣的NULL值。

+0

+1如果用戶查詢的地方是myBasicField IS NULL,那麼你會得到一個全表掃描? – Paparazzi 2012-04-09 14:26:26

+0

@Blam:可能 - 取決於您的查詢中可能存在的其他條件。如果'myBasicField'爲NULL,那麼**這個**索引肯定不會被使用。 – 2012-04-09 14:28:59

+0

謝謝你們的快速回復。這就是我所需要的 – 2012-04-09 14:44:58