在 sql server 中的表连接中访问表的顺序是什么?
我们可以强制一些指定的顺序吗?
是的,使用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上。
如果我正确理解了这个问题,您可能会发现 CTE 或临时表是管理复杂连接场景的好方法。
我发现它们对于“预过滤”和控制连接表中的数据以及使查询更容易理解很有用。
尽管如果您能解释为什么要控制加入顺序,人们可能会提供更多帮助。