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

表1 T1,表2 T2其中T1.Blah=T2.Blah-VS-internaljoin

  •  0
  • Joshua  · 技术社区  · 15 年前

    SELECT {COLUMN LIST}
    FROM TABLE1 t1, TABLE2 t2, TABLE3 t3, TABLE4 t4 (etc)
    WHERE t1.uid = t2.foreignid
    AND t2.uid = t3.foreignid
    AND t3.uid = t4.foreignid
    etc
    

    而不是

    SELECT {COLUMN LIST}
    FROM TABLE1 t1
    INNER JOIN TABLE2 t2 ON t1.uid = t2.foreignid
    INNER JOIN TABLE3 t3 ON t2.uid = t3.foreignid
    INNER JOIN TABLE4 t4 ON t3.uid = t4.foreignid
    

    完全外接 使所有可能的关联都可访问。

    我在过去使用了第一种方法来优化查询,这些查询访问两个非常大的数据存储,每个数据存储都有外围表连接到它们,这些连接的产物在查询的后期聚集在一起。通过允许每个“较大”表连接到它们各自的查找表,并且只合并每个较大表的特定子集,我发现与在特定过滤之前相互引入较大表相比,速度有显著提高。

    在正常(简单连接)情况下,使用第二种场景不是更好吗

    4 回复  |  直到 15 年前
        1
  •  7
  •   Community CDub    8 年前
        2
  •  2
  •   davek    15 年前

    回答这个问题的最佳方法可能是查看数据库如何在内部处理查询。如果您在SQL Server上,请使用探查器查看每个查询执行了多少次读取等操作,并使用查询计划查看通过数据执行的路径。统计、倾斜等也很可能发挥作用。

        3
  •  2
  •   Anax    15 年前

    第一个查询不生成完整的外部联接(即左联接和右联接的并集)。本质上,除非有一些[内部]SQL解析器特定的优化,否则这两个查询是相等的。

        4
  •  1
  •   HLGEM    15 年前

    就我个人而言,我永远不会使用第一种语法。它的性能可能是相同的,但维护起来更困难,而且在事情变得复杂时更容易发生意外的交叉连接。如果您错过了一个ON条件,它将无法通过语法检查,如果您错过了一个与ON条件等价的WHERE条件,它将愉快地进行交叉连接。看在上帝的份上,它的语法已经过时17年了!

    此外,旧语法中的左连接和右连接语法在SQL Server中被破坏,并且并不总是返回正确的结果(有时它可以将结果作为一个交叉连接而不是外部连接进行交互),并且它们已被弃用,在下一个版本中根本不可用。如果您需要将其中一个查询更改为使用外部联接,那么您可以尝试进行一次主要的重写,因为尝试混合这两种语法尤其糟糕。