Sql server 2012 在SQL查询中使用索引外的列进行键查找

Sql server 2012 在SQL查询中使用索引外的列进行键查找,sql-server-2012,sql-execution-plan,query-tuning,Sql Server 2012,Sql Execution Plan,Query Tuning,我有一个问题如下 SELECT ActivityId, AnotherId, PersonId, StartTime AS MyAlias FROM Activity WHERE DeletedStatus='Active' AND StartTime>='2018-02-01'AND StartTime<='2018-02-08' 指数2的定义如下: CREATE NONCLUSTERED INDEX Index1 O

我有一个问题如下

SELECT ActivityId,
       AnotherId,
       PersonId,
       StartTime AS MyAlias
FROM   Activity
WHERE  DeletedStatus='Active' AND
       StartTime>='2018-02-01'AND StartTime<='2018-02-08'
指数2的定义如下:

CREATE NONCLUSTERED INDEX Index1 ON Activity
(
    StartTime
)
CREATE CLUSTERED INDEX Index2 ON Activity
(
     EndTime
     StartTime
)
由于ActivityId、AnotherId、PersonId在
选择列表中,但不在索引中,因此优化程序在Index1上使用索引查找,然后使用键查找。这对我来说很有意义

然而,以下事情让我感到困惑:

  • 当DeletedStatus不在索引中,但在
    WHERE
    子句中时,为什么优化程序能够使用Index1进行索引查找
  • 为什么Index1中的输出列表包含EndTime,而该列在Index1中不存在
  • 当这些列都不在Index2中时,如何使用Index2输出ActivityId、AnotherId和PersonId
抱歉,我已经伪匿名的计划和查询,所以我希望我做的是正确的

为什么优化人员能够在以下情况下使用Index1进行索引搜索 DeletedStatus不在索引中,但在WHERE子句中

WHERE
子句还包括
StartDate
,因此可以使用提供的
StartDate
值和范围扫描来执行搜索。键查找包括“Active”谓词,用于根据
WHERE
子句过滤行,因为该列不包括在索引中

为什么Index1中的输出列表包含EndTime,而该列为 Index1中不存在

所有非聚集索引都隐式包含聚集索引键作为行定位器,类似于显式包含列

Index2如何用于输出ActivityId、AnotherId和PersonId 这些列都不在Index2中

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