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

gro*_*chu 1 index sql-server nonclustered-index

我有疑问:

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。你能给点建议吗?

小智 9

过滤索引隔离了其中 的行集L2 = ''。您的查询要求获取整个行子集(匹配的行是表的子集,也是索引中的所有行)并将它们与子句聚合GROUP BY。您可以通过查看整个过滤索引(或者换句话说扫描它)来完成此操作,尤其是因为它覆盖了该查询。如果您要扫描过滤后的索引,那么在这种情况下这是最佳做法。