代码之家  ›  专栏  ›  技术社区  ›  ram

左联接的最佳联接顺序

  •  3
  • ram  · 技术社区  · 15 年前

    我有3张表,表1(有1020690条记录),表2(有289425条记录),表3(有83692条记录),我有类似的东西

    SELECT * FROM Table1 T1 /* OK fine select * is bad when not all columns are needed, this is just an example*/
    LEFT JOIN Table2 T2 ON T1.id=T2.id
    LEFT JOIN Table3 T3 ON T1.id=T3.id
    

    像这样的查询

    SELECT * FROM Table1 T1
    LEFT JOIN Table3 T3 ON T1.id=T3.id
    LEFT JOIN Table2 T2 ON T1.id=T2.id
    

    查询计划向我显示,它对两个联接都使用2个合并联接。对于第一个查询,第一个合并是与T1和T2合并,然后与T3合并。对于第二个查询,第一个合并是与T1和T3合并,然后与T2合并。

    这两个查询花费的时间大致相同(大约40秒),或者有时query1花费的时间更长一些。

    所以我的问题是,加入顺序有关系吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Bill Karwin    15 年前

    像这样的简单查询的连接顺序应该不重要。如果有一种方法可以重新排序联接以提高性能,那么这就是查询优化器的工作。

    理论上,您不应该担心它——这就是SQL的要点。试图超越自己的想法,查询优化器通常不会给出更好的结果。特别是在MS SQL Server中,它有一个非常好的查询优化器。

    我不希望这个查询需要40秒。您可能没有定义正确的索引。你应该使用像 SQL Server Profiler SQL Server Database Engine Tuning Advisor 看看它是否可以推荐任何新的索引。

        2
  •  2
  •   Brian Gideon    15 年前

    查询优化器将使用在表上收集的约束、索引和统计信息的组合来构建执行计划。在大多数情况下,这很有效。但是,我偶尔会遇到执行计划选择不当的场景。通常,调整查询可以有效地迫使优化器选择更好的计划。不过,我不能提供做这件事的一般规则。当所有其他的失败时,你可以求助于 FORCE ORDER query hint .

    是的,连接顺序会对查询的执行时间产生重大影响。其思想是,通过连接首先产生最小结果的表,将使下一个连接的计算速度更快。 编辑: 然而,重要的是要注意,在 强制令 在所有其他条件相同的情况下,您在查询中指定的顺序可能与优化器构建执行计划的方式没有关联。

        3
  •  1
  •   HLGEM    15 年前

    通常,SQL Server足够聪明,可以选择最佳的联接方式,它不仅使用您在查询中编写的顺序。也就是说,如果所有的内部联接都是先连接,然后是左连接,那么我发现更容易理解复杂的查询。