使用 SQL 查询中索引之外的列进行键查找

Key Lookup using columns outside of the index in SQL Query

我有如下查询

SELECT ActivityId,
       AnotherId,
       PersonId,
       StartTime AS MyAlias
FROM   Activity
WHERE  DeletedStatus='Active' AND
       StartTime>='2018-02-01'AND StartTime<='2018-02-08'

正在使用的执行计划在这里

Execution Plan

索引 1 定义为:

CREATE NONCLUSTERED INDEX Index1 ON Activity
(
    StartTime
)

索引 2 定义为:

CREATE CLUSTERED INDEX Index2 ON Activity
(
     EndTime
     StartTime
)

优化器在 Index1 上使用索引查找,然后使用键查找,因为 ActivityId、AnotherId、PersonId 在 SELECT 列表中但不在索引中。这对我来说很有意义。

然而,下面的事情让我很困惑:

抱歉,我已经伪匿名化了计划和查询,所以我希望我做对了!

Why is the optimiser able to use Index1 to do an index seek when DeletedStatus is not in the index but is in the WHERE clause?

WHERE 子句还包括 StartDate,因此可以使用提供的 StartDate 值执行查找,然后进行范围扫描。键查找包括 'Active' 谓词以根据 WHERE 子句过滤行,因为该列不包含在索引中。

Why does the output list in Index1 include EndTime when that column is not present in Index1?

所有 non-clustered 索引都隐式包含聚簇索引键作为行定位符,类似于显式包含的列。

How is Index2 being used to output ActivityId,AnotherId,PersonId when none of those columns are in Index2?

聚集索引的叶节点是实际的数据行,因此所有列都可用。