2

创建覆盖非聚集索引以满足给定查询的要求。如果索引中不存在一列,则 SQL Server 将需要执行键查找。为了防止键查找,创建了一个覆盖索引,但我不明白为什么下面是一个覆盖索引,而其中一列不包括在内。

数据库:Adventureworks 2008 R2 表:Production.WorkOrder 索引名称:IX_WorkOrder_ProductID

询问:

SELECT WorkOrderID,StartDate
FROM Production.WorkOrder
WHERE ProductID = 757;

索引 IX_WorkOrder_ProductID 仅以列 ProductID 开始,它被删除并重新创建,如下所示:

CREATE INDEX IX_WorkOrder_ProductID
ON Production.WorkOrder (ProductID)
INCLUDE (StartDate);

执行实际执行计划后使用索引查找(非集群),成本为 100%。

我的问题是:为什么不需要将列 WorkOrderID 也包含到索引 IX_WorkOrder_ProductID 中?为什么它是一个没有 WorkOrderID 的覆盖索引?

4

1 回答 1

4

由于WorkOrderID是该表上的聚集索引Production.WorkOrder,因此它已经自动包含在您在该表上创建的每个非聚集索引中。

真的没有必要再次包含它——它已经存在了。

因此,您的新索引IX_WorkOrder_ProductID实际上覆盖了查询 -WorkOrderID由于集群键无论如何都存在于每个非聚集索引中,并且该ProductID列是索引定义的一部分,因此存在。

由于集群索引键包含在该表上的每个非聚集索引中,这也是为什么应该非常仔细地选择集群键并且应该尽可能小 - 理想情况下是INTor的另一个原因BIGINT

于 2013-05-01T20:52:03.020 回答