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

zaf*_*s.m 5 t-sql indexing nullable sql-server-2008-r2 non-clustered-index

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

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField);
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

mar*_*c_s 7

使用SQL Server 2008及更高版本,您可以使用筛选索引.在这里查看介绍博客文章 - 语法将是:

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField)
WHERE myBasicField IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

任何包含相同WHERE子句的查询都可以利用这一点,并且索引将小得多,因此如果排除这样的NULL值,则性能会更好.