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