一尘不染

为什么不使用 IS NULL 值的过滤索引?

sql-server

假设我们有一个这样的表定义:

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 谓词。


阅读 78

收藏
2022-11-13

共1个答案

一尘不染

为什么这个索引没有“覆盖”这个查询:

没有很好的理由。这是该查询的覆盖索引。

请在此处为反馈项目投票:https ://feedback.azure.com/d365community/idea/ffbf409a-5125-ec11-b6e6-000d3a4f0da0

作为一种解决方法WhereColumn,在过滤后的索引中包括:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 
2022-11-13