包含的列用于 Seek 运算符

Included columns are used in Seek operator

考虑具有两个非聚集索引的table,并查询:

1 INDEX_1 on table (column1, column2, column3)
2 INDEX_2 on table (column1) INCLUDED (column2, column3)

    SELECT column3
    FROM   table
    WHERE  column1 = 100 columnn2 =  100

出于某种原因,SQL 服务器使用 INDEX_2。 两个索引的执行计划相同(除了 Seek 运算符中的对象) 此外,两者的逻辑读取时间相同。 如果索引未按 column2

排序,如何在 INDEX_2 上执行具有此类条件的查找运算符

How is it possible to perform seek operator with such conditions on INDEX_2, if index is not sorted by column2

Index Seek 查找索引中的某个位置,但随后可能会从该点开始沿着 leaf-level 页面扫描,这些页面存储在 doubly-linked 列表中,遵循索引排序顺序。

所以它更像是一个Seek+Scan。从聚集索引中进行选择时,您会看到相同的计划,因为包含列的索引是一种微型聚集索引。

例如 Adventureworks

SELECT SalesOrderID, *
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = 43892
  AND ProductID = 758

将为您提供一个读取多行的索引查找:

查找包含该 SalesOrderID 行的第一页,然后扫描直到它找到具有该 ProductID 的所有行。当操作员找到具有不同 SalesOrderID 的页面时,就完成了。

但是如果 (column1, column2, column3) 是聚簇索引键,查询将是 single-row Seek。所有 non-unique non-clustered 索引都将所有聚簇索引列添加为索引键列,并在物理上存储为唯一索引。