添加第二个ID列是否有利于索引?

时间:2012-03-12 18:55:03

标签: sql-server-2005 tsql indexing

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

第二个问题是,如果我使用上面的两个columnn查询,那么我在WHERE子句列中编写的内容是物质还是引擎足够聪明,可以按照索引的顺序对它们进行评估?

E.G。是:

WHERE fk_facilityID = @FacilityID AND fk_OrderID = @OrderID

相当于:

WHERE fk_OrderID = @OrderID AND fk_FacilityID = @FacilityID

2 个答案:

答案 0 :(得分:7)

  

在fk_FacilityID上定义索引然后fk_OrderID更好,并将两者都传递给查询或仅使用fk_OrderID。

如果OrderId是唯一的,那么为给定的方案添加其他字段没有任何实际的额外好处。不过,对你的FK进行索引是一个好主意,因为它们始终是JOIN键。

  

如果我正在使用上面的两个columnn查询,那么我在物质中编写WHERE子句列的顺序是否是足够的引擎以按索引的顺序评估它们?

不,订单与此无关。重要的是字段的SETS匹配,即FieldA和FieldB都在索引和WHERE子句中。

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

答案 1 :(得分: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 ...但是,您应该始终验证生成的执行计划,以确保其行为符合您的预期。