JOIN中的表顺序

时间:2013-09-02 10:25:09

标签: sql sql-server-2008 join

在sql server中连接表时访问哪些顺序表?

我们可以强制指定一些订单吗?

2 个答案:

答案 0 :(得分:4)

是的,请使用FORCE ORDER query hint例如:

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

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

enter image description here

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

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

答案 1 :(得分:0)

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

我发现它们对“预过滤”和“预过滤”非常有用。控制来自联合表格的数据&使查询更容易理解。

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