3

在 sql server 中的表连接中访问表的顺序是什么?

我们可以强制一些指定的顺序吗?

4

2 回答 2

4

是的,使用FORCE ORDER 查询提示,例如:

SELECT  *
FROM    C
        INNER JOIN B
            ON B.BID = C.BID
        INNER JOIN A
            ON A.AID = B.AID
OPTION (FORCE ORDER);

这可确保在查询优化期间保留查询语法指示的连接顺序。在以下两个执行计划中,顶部计划没有查询提示,而底部计划则有:

在此处输入图像描述

您可以看到,在第一个优化器应用它认为最好的顺序(A 然后 B 然后 C),而在第二个中保持原始顺序(C 然后 B 然后 A)。作为一般规则,我会说,除非您足够了解优化器以了解优化器为什么选择某个计划,为什么另一个计划会更有效,以及为什么优化器没有选择这个更好的计划,否则我会远离通过使用提示来强制执行计划,优化器通常最清楚,在它不知道的地方更有可能是陈旧的统计信息或碎片索引等,而不是应该通过强制执行计划来解决的问题。

上面的架构和查询位于SQL Fiddle上。

于 2013-09-02T10:50:17.440 回答
0

如果我正确理解了这个问题,您可能会发现 CTE 或临时表是管理复杂连接场景的好方法。

我发现它们对于“预过滤”和控制连接表中的数据以及使查询更容易理解很有用。

尽管如果您能解释为什么要控制加入顺序,人们可能会提供更多帮助。

于 2013-09-02T10:51:17.897 回答