假设我们有一个像这样的表定义:
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 谓词。
performance sql-server index-tuning filtered-index query-performance
我有疑问:
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
。你能给点建议吗?