Sql server 2008 SQL Server不使用将datetime与not null进行比较的索引
我有一个简单的表,与其他任何表都不相关。它有一个not PK列,表示它是日期。我已经为该列创建了一个非聚集索引。如果我提出这个问题: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
从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种事物是实体。封闭世界假说对我产生了影响。