【问题标题】:Creating an index on a column to run queries for NULL values在列上创建索引以运行 NULL 值查询
【发布时间】:2014-03-11 10:54:35
【问题描述】:

我们使用的是 SQL Server 2008。我们有几百万行的表。我们有一列是 NULLABLE,但很少有行将此列设置为 NULL。数百万行中可能有 100-200 行。

我们有一个查询来选择这些行,并且我们在该列上有一个索引。例如

SELECT
    tbl1.Col1,
    tbl1.Col2,
    tbl1.Col3,
    tbl1.Col4,
    tbl1.Col5,
    tbl1.Col6
    tbl2.Col1,
FROM
    tbl1
    INNER JOIN tbl2 ON (tbl1.FK = tbl2.PK)
WHERE
    tbl1.NullableColumn IS NULL

不幸的是,我们需要一些 tbl1 列(我不确定有多少列太多而不能用作包含列,但我们绝对需要来自 tbl1 的 18 列)。当我们运行此查询时,优化器会不断建议 tbl.NullableColumn 上的索引,但我们已经有了一个。它只是没有被使用,即使有一个索引提示它仍然没有被使用。

执行计划说它在 IX_tbl1_NullableColumn 上进行索引查找,然后在聚集索引上进行 keylookup(keylookup 需要 99% 的时间)。

  1. 我遇到过一些人说您永远不应该使用 NULLABLE 列作为索引。这是真的?是否适用于这种情况?
  2. 有没有更智能的方法来查找表中的少数 NULL 值?

【问题讨论】:

  • 我很困惑。您声称未使用索引(甚至没有提示?!),在下一段中,您说查询计划中有“IX_tbl1_NullableColumn 上的索引搜索”。该计划清楚地表明问题在于检索您绝对需要 + FK 的那 18 列,而不是索引本身。因此,如果此特定查询的性能是您的首要任务,则包括这些列。如果我们能看到查询计划和 IO 统计信息会有所帮助,否则我们无法确定这 99% 来自哪里。
  • @TomT 我也很困惑,正如我所说的那样。执行计划包括对优化器声称丢失的索引的索引查找。所以我不确定为什么它认为它丢失了,因为它正在使用。我们还有 3 台其他服务器 100% 工作,优化器没有建议索引。但是它们在 SP3 上,而这个问题在 SP2 上。我们会更新,如果仍然存在问题,我会回复。
  • @TomT 安装了服务包,现在在 SP3 上,问题已经消失。没有更多关于缺少索引的疯狂建议。我们甚至没有重建索引或更新统计数据。不过,我在他们的发行说明中找不到任何内容。
  • 感谢您分享您的发现。我会尝试用 SP2 记住这个问题。

标签: sql-server-2008 indexing database-performance


【解决方案1】:

将 SP3 应用到 SQL Server 解决了这个问题。这很奇怪,我无法解释。我在发行说明中也看不到任何有关它的信息。我不知道服务器是否只需要重新启动,或者是否真的是 SP3 解决了这个问题。我认为可能是 SP3,因为我们所有其他服务器都在运行 SP3,并且它们没有出现同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 2012-02-23
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2018-01-05
    相关资源
    最近更新 更多