在 SQL Server 中,查询是否能命中索引(即是否能使用 Index Seek
)取决于多个因素,包括索引的结构、查询条件的排列、和数据库优化器的策略。以下是一些常见的命中索引和不能命中索引的情况,及其详细解释:
一、命中索引的情况
1. 前导列匹配(典型的命中索引场景)
- 索引结构:假设有一个复合索引
IX_Example
,定义如下:CREATE NONCLUSTERED INDEX IX_Example ON TableName (IsTest, IsValid, OrderStatus);
- 查询示例:
SELECT * FROM TableName WHERE IsTest = 1
- 命中:因为查询条件中包含了
IsTest
,它是索引的前导列,SQL Server 可以使用Index Seek
来查找符合条件的记录。
- 命中:因为查询条件中包含了
SELECT * FROM TableName WHERE IsTest = 1 AND IsValid = 1
- 命中:查询条件包含了前导列
IsTest
,并且使用了IsValid
,可以进一步缩小索引范围,依然可以利用索引。
- 命中:查询条件包含了前导列
SELECT * FROM TableName WH