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