SQL Server不使用将datetime与not null进行比较的索引

Pab*_*lla 5 indexing performance null datetime sql-server-2008

我有一个与其他任何东西无关的简单表.它有一个非PK列,它是一个日期.我已经为该列创建了一个非聚集索引.如果我进行此查询:

select*from table,其中datecolumn不为null < - 不使用索引并且非常慢.

但是,如果我删除not,就这样:select*from table,datecolum为null < - 使用索引并且非常快.

还有更多不是空值而不是空值.

我忘记了什么吗?我可以在这里使用过滤索引吗?

提前致谢.

Mar*_*ith 4

这个是正常的。除非谓词的选择性足以保证它,否则它不会使用索引。

听起来绝大多数记录都不为 NULL,因此不必通过非聚集索引查找这些记录,而是必须进行大量书签查找和随机 I/O 来检索其余列以返回,这样更快、更高效只需扫描整个聚集索引。

你可以用它FORCESEEK来强制你所说的你想要的行为。您可能会发现与聚集索引扫描相比,所花费的时间和 I/O 统计数据飞速增长。

SET STATISTICS IO ON

SELECT * FROM 
YourTable WITH (FORCESEEK) 
WHERE YourCol IS NOT NULL
Run Code Online (Sandbox Code Playgroud)