【问题标题】:SQL Server does not use an index comparing datetime to not nullSQL Server 不使用将日期时间与非空值进行比较的索引
【发布时间】:2010-09-30 11:01:57
【问题描述】:

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

select * from table where datecolumn is not null

但如果我删除 not,这样: select * from table where datecolum is null

非空值比空值多得多。

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

提前致谢。

【问题讨论】:

  • @Alexander - “它有一个 not PK 列...”
  • 哦,我的错。不必要地提到“PK”让我感到困惑。人们可以列举出数以千计的东西不是一个实体,而只有 2-3 个是它。我想到了封闭世界假设。

标签: sql-server-2008 datetime null indexing performance


【解决方案1】:

这是正常的。它不会使用索引,除非谓词有足够的选择性来保证它。

听起来绝大多数记录都不是 NULL,所以与其通过非聚集索引查找这些记录,不如执行大量书签查找和随机 I/O 来检索其余列以返回它更快,并且只扫描整个聚集索引更有效。

您可以使用FORCESEEK 来强制执行您说想要的行为。与聚集索引扫描相比,您可能会发现所花费的时间和 I/O 统计数据达到了顶峰。

SET STATISTICS IO ON

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

【讨论】:

    【解决方案2】:

    理解你的问题的关键可能在于这句话:not nulls 比 nulls 多得多

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

    我想提两件事:

    1. 使用的查询并不总是比不使用的查询快。
    2. 您可以在查询中放置 INDEX HINT,但我通常会发现自己在做那种 优化

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2016-03-05
      • 1970-01-01
      • 2013-09-16
      • 2010-09-05
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多