使用 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'
正在使用的执行计划在这里
索引 1 定义为:
CREATE NONCLUSTERED INDEX Index1 ON Activity
(
StartTime
)
索引 2 定义为:
CREATE CLUSTERED INDEX Index2 ON Activity
(
EndTime
StartTime
)
优化器在 Index1 上使用索引查找,然后使用键查找,因为 ActivityId、AnotherId、PersonId 在 SELECT
列表中但不在索引中。这对我来说很有意义。
然而,下面的事情让我很困惑:
- 当 DeletedStatus 不在索引中但在
WHERE
子句中时,为什么优化器能够使用 Index1 进行索引查找?
- 当 Index1 中不存在该列时,为什么 Index1 中的输出列表包含 EndTime?
- 当 none 这些列在 Index2 中时,Index2 如何用于输出 ActivityId、AnotherId、PersonId?
抱歉,我已经伪匿名化了计划和查询,所以我希望我做对了!
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?
聚集索引的叶节点是实际的数据行,因此所有列都可用。
我有如下查询
SELECT ActivityId,
AnotherId,
PersonId,
StartTime AS MyAlias
FROM Activity
WHERE DeletedStatus='Active' AND
StartTime>='2018-02-01'AND StartTime<='2018-02-08'
正在使用的执行计划在这里
索引 1 定义为:
CREATE NONCLUSTERED INDEX Index1 ON Activity
(
StartTime
)
索引 2 定义为:
CREATE CLUSTERED INDEX Index2 ON Activity
(
EndTime
StartTime
)
优化器在 Index1 上使用索引查找,然后使用键查找,因为 ActivityId、AnotherId、PersonId 在 SELECT
列表中但不在索引中。这对我来说很有意义。
然而,下面的事情让我很困惑:
- 当 DeletedStatus 不在索引中但在
WHERE
子句中时,为什么优化器能够使用 Index1 进行索引查找? - 当 Index1 中不存在该列时,为什么 Index1 中的输出列表包含 EndTime?
- 当 none 这些列在 Index2 中时,Index2 如何用于输出 ActivityId、AnotherId、PersonId?
抱歉,我已经伪匿名化了计划和查询,所以我希望我做对了!
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?
聚集索引的叶节点是实际的数据行,因此所有列都可用。