假设我们有一个这样的表定义:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
和这样的过滤非聚集索引:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
为什么这个索引没有“覆盖”这个查询:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
我得到这个执行计划:
KeyLookup 用于 WhereColumn IS NULL 谓词。
没有很好的理由。这是该查询的覆盖索引。
请在此处为反馈项目投票:https ://feedback.azure.com/d365community/idea/ffbf409a-5125-ec11-b6e6-000d3a4f0da0
作为一种解决方法
WhereColumn
,在过滤后的索引中包括:我在几周前进行一些测试时遇到了同样的问题。我有一个带有主要谓词的查询,要求返回的结果具有 NULL 关闭时间,我考虑使用过滤索引,因为 25K 的 2M+ 记录是 NULL,这个数字很快就会减少。
过滤后的索引没有被使用——我假设是因为“非唯一性”或共性——直到我找到一篇Microsoft 支持文章说:
因此,将列添加到索引(或包含)似乎是官方的 MS 响应。