编辑:根据您的问题(和 Kirk Woll 的)评论,您应该了解连接的顺序是美观的,并且不会直接影响生成的执行计划。查询优化器将以最有效的顺序执行连接,并在绝大多数时间使用适当的连接操作,无需任何提示。
当涉及到您的连接顺序的美学时,这有点主观,但我会说在阅读查询时以任何合乎逻辑的顺序将您的表连接在一起......如果您从@HeaderId开始,则从该表开始,然后JOIN
到子表:
FROM
Header h
JOIN Items i ON h.HeaderId = i.HeaderId
JOIN Details d ON i.ItemId = d.ItemId
WHERE
h.HeaderId = @HeaderId
但是,如果您使用@DetailId 开始查询,我将以相反的顺序加入。
FROM
Details d
JOIN Items i ON d.ItemId = i.ItemId
JOIN Header h ON i.HeaderId = h.HeaderId
WHERE
d.DetailId = @DetailId
然而,这是主观的,只是我个人的喜好。
当您开始包含OUTER JOIN
s 时,它变得不那么主观了...尝试构造您的查询以避免任何RIGHT OUTER JOIN
s,而是使用LEFT OUTER JOIN
's。
默认情况下不要使用连接提示......事实上你几乎永远不会使用它们。查询优化器在选择最佳执行计划方面做得非常好。我只遇到过一个实例,我需要提供一个连接提示来改进计划......它对当时正在运行查询的服务器有很大帮助,但是当数据库迁移到不同的服务器时,我的加入提示破坏了查询的性能。因此,重申一下,提供连接提示通常不是一个好主意。