TSQL - 连接表的正确顺序是什么?

Iro*_*fin 12 t-sql database sql-server join join-hints

我的google-fu和so-fu在这里让我失望,所以我不妨问一下.

我有很多查询,其中有多个连接.

在一个查询中,我将标题/项目/详细信息一起加入,以及查找这些记录的各种信息.

加入时,我会尽量保持与其相关的顺序.例如:我的标题有两个查找表,所以在加入我的项目表之前我会加入那些.

那是对的吗?

在查找表之前加入更大的表是否更好?或相反亦然?

我是否应该loop在加入小表时使用提示,并merge在加入openrowsets时提示?

我确信答案是"它取决于",但有效和高效地加入的一些一般指导方针将非常有帮助.谢谢!

Mic*_*son 12

编辑:根据您的问题(和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
Run Code Online (Sandbox Code Playgroud)

但是,如果你用@DetailId开始查询,我会以相反的顺序加入.

FROM
    Details d
    JOIN Items i ON d.ItemId = i.ItemId
    JOIN Header h ON i.HeaderId = h.HeaderId
WHERE
    d.DetailId = @DetailId
Run Code Online (Sandbox Code Playgroud)

然而,这是主观的,只是我个人的偏好.

当你开始包含OUTER JOINs 时,它变得不那么主观了...尝试构造你的查询以避免任何RIGHT OUTER JOINs,而是使用LEFT OUTER JOIN's.

默认情况下不要使用连接提示......实际上你几乎从不使用它们.查询优化器在选择最佳执行计划方面做得非常好.我只遇到过一个需要提供连接提示来改进计划的实例...它在当时运行查询的服务器上有很大帮助,但是当数据库迁移到不同的服务器时,我的join提示破坏了查询的性能.因此,重申一下,提供联接提示通常是个坏主意.