相关疑难解决方法(0)

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

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

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )
Run Code Online (Sandbox Code Playgroud)

还有一个过滤的非聚集索引,如下所示:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 
Run Code Online (Sandbox Code Playgroud)

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

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Run Code Online (Sandbox Code Playgroud)

我得到这个执行计划:

在此处输入图片说明

KeyLookup 用于 WhereColumn IS NULL 谓词。

这是计划:https : //www.brentozar.com/pastetheplan/?id=SJcbLHxO7

performance sql-server index-tuning filtered-index query-performance

23
推荐指数
2
解决办法
4299
查看次数

为什么引擎选择 Index Scan 而不是 Index Seek 进行 Group By 查询?

我有疑问:

SELECT
      M_nvarchar_3
    , MA_nvarchar_40                    
    , W_nvarchar_4
    , LB_nvarchar_2               
    , SUM(ST_decimal_13_3)        
    , SUM(CW_decimal_13_3)
    , SUM(STO_decimal_13_3)    
    , MAX(GJ_nvarchar_7)     
FROM [dbo].[MES]
WHERE L2 = ''
GROUP BY M_nvarchar_3
         , MA_nvarchar_40                    
         , W_nvarchar_4
         , LB_nvarchar_2;
Run Code Online (Sandbox Code Playgroud)

我创建了NONCLUSTERED FILTERED INDEX这样的:

CREATE NONCLUSTERED INDEX IX_M_nvarchar_3_MA_nvarchar_40_W_nvarchar_4_LB_nvarchar_2
ON [dbo].[MES]
(
    M_nvarchar_3 ASC
    , MA_nvarchar_40 ASC
    , W_nvarchar_4 ASC
    , LB_nvarchar_2  ASC
   
)
INCLUDE
(
    ST_decimal_13_3
    ,CW_decimal_13_3
    , STO_decimal_13_3
    , GJ_nvarchar_7
)
WHERE L2 = '';
Run Code Online (Sandbox Code Playgroud)

并在上面的查询中有NONCLUSTERED INDEX SCAN。我想在这种情况下得到了NONCLUSTERED INDEX SEEK。你能给点建议吗?

index sql-server nonclustered-index

1
推荐指数
1
解决办法
595
查看次数