如何通过避免扫描空值来减少索引扫描

时间:2012-04-09 13:43:04

标签: tsql indexing sql-server-2008-r2 nullable non-clustered-index

我正在使用SQL Server 2008 R2,我想在非唯一的可空字段上添加非聚集索引。我的索引还会包含一个列,以避免访问我的聚簇索引:

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

myBasicField的实际数据中会有很多NULLs,我想知道是否有一种方法可以通过不扫描这些NULLs或阻止{来提高性能{1}}值存储在我的索引上。

提前致谢。

2 个答案:

答案 0 :(得分: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值,性能会更好。

答案 1 :(得分:3)

您正在寻找过滤索引。参见:

http://technet.microsoft.com/en-us/library/cc280372.aspx