【问题标题】:Is the addition of a second ID column beneficial to index?添加第二个 ID 列是否有利于索引?
【发布时间】:2012-03-29 04:58:51
【问题描述】:

假设我有一个表 tbl_FacilityOrders,在 SQL Server 2005 中有两个外键 fk_FacilityID 和 fk_OrderID。它可以包含来自数百个设施的订单。我需要查询单个记录,并且我可以使用 facilityID 和 orderID。在 fk_FacilityID 然后 fk_OrderID 上定义索引并将两者都传递给查询还是只使用 fk_OrderID 更好。由于设施 ID 比订单 ID 少,我可以看到首先清除其他设施的记录可能是有益的。

第二个问题是,如果我使用上面的两列查询,我编写 WHERE 子句列的顺序是否重要,或者引擎是否足够聪明,可以按照索引的顺序评估它们?

例如是:

WHERE fk_facilityID = @FacilityID AND fk_OrderID = @OrderID

相当于:

WHERE fk_OrderID = @OrderID AND fk_FacilityID = @FacilityID

?

【问题讨论】:

    标签: sql-server-2005 tsql indexing


    【解决方案1】:

    在 fk_FacilityID 和 fk_OrderID 上定义索引并将两者都传递给查询更好还是只使用 fk_OrderID。

    如果OrderId 是唯一的,则为给定场景添加其他字段并没有真正的额外好处。不过,最好为您的 FK 编制索引,因为它们始终是 JOIN 键。

    如果我使用上面的两列查询,我写 WHERE 子句列的顺序是否重要,或者引擎是否足够聪明,可以按照索引的顺序评估它们?

    不,这里的顺序无关紧要。重要的是字段的SETS匹配,即FieldA和FieldB都在索引和WHERE子句中。

    但是,索引中字段的顺序确实很重要。如果不知道第一个字段的值,就不能在索引中使用第二个字段。

    【讨论】:

    • 谢谢,很高兴知道!我一直在想这个问题。
    【解决方案2】:

    您应该为每个外键创建一个索引...不仅仅是这个问题的目的,而是因为indexing your foreign keys is good practice in general。

    回答你的第二个问题,这两个陈述是等价的。 SQL Server should internally re-order the statements to arrive at the optimal execution plan... 但是,您应该始终验证生成的执行计划,以确保其行为符合您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2015-12-06
      • 2013-01-28
      相关资源
      最近更新 更多