【问题标题】:Covering index adventureworks 2008 R2 - Why is column WorkorderID not included?覆盖索引 Adventureworks 2008 R2 - 为什么不包括列 WorkorderID?
【发布时间】:2013-04-25 22:11:25
【问题描述】:

创建覆盖非聚集索引以满足给定查询的要求。 如果索引中不存在一列,则 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 的覆盖索引?

【问题讨论】:

    标签: sql indexing sql-server-2008-r2


    【解决方案1】:

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

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

    因此,您的新索引 IX_WorkOrder_ProductID 实际上覆盖了查询 - WorkOrderID 之所以存在,是因为集群键无论如何都存在于 每个 非聚集索引中,而 @ 987654325@ 列是索引定义的一部分。

    由于聚集索引键包含在该表上的每个非聚集索引中,这也是为什么应该非常谨慎地选择聚集键并且应该尽可能小 - 理想情况下是INTBIGINT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多