有了多列非聚集索引,并且 SELECT 位于中间列,为什么 SQL Server 查询该索引而不是扫描表?

var*_*ble 5 index sql-server nonclustered-index

按 LastName、FirstName、MiddleName 的顺序设置单个非集群。

SELECT * FROM PERSON
WHERE FirstName='xyz'
Run Code Online (Sandbox Code Playgroud)

为什么执行计划使用索引而不直接扫表?我问是因为名字是索引的第二个成员,因此没有排序,那么为什么 SQL Server 决定查询非聚集索引?

在此输入图像描述

MBu*_*chi 13

这是使用最少的 IO 操作给出结果的问题。

该索引比整个表小得多,并且基于统计信息 SQL Server 知道单个名称 ('xyz') 的平均基数。

因此,计算读取该索引的页数加上检索表的其他字段的查找页数(出现次数 * 索引深度)小于扫描不按名称排序的整个表。

这可能就是您面临的情况。

尝试使用set statistics io on有或没有该索引来验证我的猜测。