inequality_columns如果提示缺少索引请求的查询具有范围谓词,例如>or ,则列将在 中列出NOT。 Microsoft Docs关于该inequality_columns专栏的描述如下sys.dm_db_missing_index_details:
构成不等式谓词的以逗号分隔的列列表,例如,以下形式的谓词:
表.列 > 常量值
除“=”之外的任何比较运算符都表示不等式。
这是一个使用 StackOverflow 核心数据库的示例:
USE StackOverflowCore;
SELECT TOP(100) v.PostId
, v.BountyAmount
FROM dbo.Votes v
WHERE v.BountyAmount > 100
ORDER BY v.BountyAmount DESC;
Run Code Online (Sandbox Code Playgroud)
该查询的查询计划如下所示:
缺少的索引请求是:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Votes] ([BountyAmount])
INCLUDE ([PostId])
Run Code Online (Sandbox Code Playgroud)
查看缺失的索引 DMV,如下所示:
SELECT *
FROM sys.dm_db_missing_index_groups mig
CROSS APPLY sys.dm_db_missing_index_columns(mig.index_handle) mic
Run Code Online (Sandbox Code Playgroud)
| 索引组句柄 | 索引句柄 | 列_id | 列名 | 列_用法 |
|---|---|---|---|---|
| 2 | 1 | 4 | 赏金金额 | 不等式 |
| 2 | 1 | 2 | 帖子ID | 包括 |
正如您所看到的, 被作为一列BountyAmount包含在列中,因为我们要求的值大于特定金额。column_usageINEQUALITY
向子句添加相等谓词WHERE,如下所示:
SELECT TOP(100) v.PostId
, v.BountyAmount
FROM dbo.Votes v
WHERE v.BountyAmount > 100
AND v.UserId = 1000 /* THIS IS NEW */
ORDER BY v.BountyAmount DESC;
Run Code Online (Sandbox Code Playgroud)
缺失索引查询结果显示如下:
| 索引组句柄 | 索引句柄 | 列_id | 列名 | 列_用法 |
|---|---|---|---|---|
| 5 | 4 | 3 | 用户身份 | 平等 |
| 5 | 4 | 4 | 赏金金额 | 不等式 |
| 5 | 4 | 2 | 帖子ID | 包括 |
正如您所看到的,该UserId列现在显示有一个EQUALITY指示器,并且生成的缺失索引如下所示:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Votes] ([UserId],[BountyAmount])
INCLUDE ([PostId])
Run Code Online (Sandbox Code Playgroud)
这里的要点是INEQUALITY索引中的关键列通常应该列在EQUALITY关键列之后。