Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server不使用将datetime与not null进行比较的索引_Sql Server 2008_Datetime_Null_Indexing_Performance - Fatal编程技术网

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

Sql server 2008 SQL Server不使用将datetime与not null进行比较的索引,sql-server-2008,datetime,null,indexing,performance,Sql Server 2008,Datetime,Null,Indexing,Performance,我有一个简单的表,与其他任何表都不相关。它有一个not PK列,表示它是日期。我已经为该列创建了一个非聚集索引。如果我提出这个问题: 从datecolumn不为null的表中选择*这是正常的。它不会使用索引,除非谓词有足够的选择性来保证它 听起来绝大多数记录都不是空的,因此,与其通过非聚集索引查找这些记录,还不如进行大量书签查找和随机I/O来检索其余的列以返回,只扫描整个聚集索引会更快、更高效 您可以使用FORCESEEK强制执行所需的行为。您可能会发现,与聚集索引扫描相比,所花费的时间和I/O

我有一个简单的表,与其他任何表都不相关。它有一个not PK列,表示它是日期。我已经为该列创建了一个非聚集索引。如果我提出这个问题:


从datecolumn不为null的表中选择*这是正常的。它不会使用索引,除非谓词有足够的选择性来保证它

听起来绝大多数记录都不是空的,因此,与其通过非聚集索引查找这些记录,还不如进行大量书签查找和随机I/O来检索其余的列以返回,只扫描整个聚集索引会更快、更高效

您可以使用
FORCESEEK
强制执行所需的行为。您可能会发现,与聚集索引扫描相比,所花费的时间和I/O统计数据非常重要

SET STATISTICS IO ON

SELECT * FROM 
YourTable WITH (FORCESEEK) 
WHERE YourCol IS NOT NULL

理解您的问题的关键可能在这句话中:非空比空多得多

SQLServer(以及任何其他关系数据库)使用统计信息来确定它将使用的查询计划。统计数据可能会告诉数据库,有许多行的日期为非空。因此,SQLServer可能认为使用索引是不值得的,而完整表扫描对于具有非空条件的特定查询是一个更好的计划

我想提两件事:

  • 使用的查询并不总是比不使用的查询快
  • 你可以在你的查询中放置一个索引提示,但我经常发现自己在做那种优化时遭到了攻击

  • @Alexander-“它有一个非PK列…”哦,我错了。不必要地提到“PK”让我感到困惑。一个人可以列举一个实体所不是的数千种事物,而只有2-3种事物是实体。封闭世界假说对我产生了影响。