【问题标题】:Order of table in JOINJOIN 中的表顺序
【发布时间】:2013-09-02 10:25:09
【问题描述】:

sql server中表的join是按什么顺序访问表的?

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

【问题讨论】:

  • 您可以使用 order by 子句更改顺序,即使使用 JOIN 也是如此。
  • @aleroot ORDER BY 更改结果的顺序,而不是访问原始表的顺序。
  • 这取决于表和需求之间的关系
  • @Barmar 您可以使用 order by 子句连接两个子查询 ...
  • @aleroot 这仍然只是订购连接的结果。它不控制数据库引擎如何优化查询。

标签: sql sql-server-2008 join


【解决方案1】:

是的,使用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);

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

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

上述架构和查询位于SQL Fiddle

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • CTE 在this fiddle 中不会保证任何事情,即使我已将表 B 和 C 移动到 CTE 并应用了过滤器,但没有任何提示 SQL-Server 仍然从 A 上的表扫描开始,在加入 B 然后再加入 C
    猜你喜欢
    • 2019-12-09
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2013-11-05
    • 2011-04-27
    相关资源
    最近更新 更多