缺失指数统计中不平等列的含义和重要性是什么?

var*_*ble 4 index sql-server

缺失指数统计中不平等列的含义和重要性是什么?

我想了解它如何影响 dba 创建索引的方式?

在此输入图像描述

Han*_*non 8

inequality_columns如果提示缺少索引请求的查询具有范围谓词,例如>or ,则列将在 中列出NOTMicrosoft 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关键列之后。