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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SQL查询中索引之外的列进行密钥查找相关的知识,希望对你有一定的参考价值。

我有一个查询如下

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

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

Execution Plan

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?

道歉,我伪造了计划和查询的匿名,所以我希望我已经正确地完成了它!

答案

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

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

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

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

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

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

以上是关于使用SQL查询中索引之外的列进行密钥查找的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server查询优化和事务处理

利用SQL索引提高查询速度

SQL Server中的全文搜索

SQL Server查询优化与事务处理

sql 查询优化

SQL优化----百万数据查询优化