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中
聚集索引叶节点是实际的数据行,因此所有列都可用