0

我有一个查询如下

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

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

执行计划

Index1 定义为:

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?
  • 当 Index2 中没有这些列时,如何使用 Index2 输出 ActivityId、AnotherId、PersonId?

抱歉,我已经对计划和查询进行了伪匿名,所以我希望我做得正确!

4

1 回答 1

1

为什么当 DeletedStatus 不在索引中但在 WHERE 子句中时,优化器能够使用 Index1 进行索引查找?

WHERE子句还包括StartDate,因此可以使用提供的StartDate值执行搜索,然后进行范围扫描。键查找包括“活动”谓词来过滤每个WHERE子句的行,因为该列不包含在索引中。

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

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

当 Index2 中没有这些列时,如何使用 Index2 输出 ActivityId、AnotherId、PersonId?

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

于 2018-03-02T17:35:08.047 回答