如果表可以基本上是内连接的,因为where子句排除了所有不匹配的记录,所以使用以下2个查询语句语法样式中的第一个确切地说有多糟糕:
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
我不确定这是否仅限于Microsoft SQL,甚至是特定版本,但我的理解是第一个场景执行全外连接以使所有可能的关联都可访问。< / p>
我过去使用过第一种方法来优化查询,这些查询访问两个大型数据存储,每个数据存储都连接到外围表,这些连接的产品在查询的后期汇集在一起。通过允许每个“较大”表连接到它们各自的查找表,并且只组合每个较大表的特定子集,我发现在特定过滤之前将大表引入彼此有显着的速度改进
在正常(简单连接)情况下,使用第二种情况会不会更好?我发现它更容易阅读,看起来它会更快。
答案 0 :(得分:7)
答案 1 :(得分:2)
回答这个问题的最佳方法是查看数据库如何在内部处理查询。如果您使用的是SQL Server,请使用Profiler查看每个查询所需的读取次数以及查询计划,以查看通过数据采用的路径。统计,倾斜等也很可能发挥作用。
答案 2 :(得分:2)
第一个查询不会产生完整的OUTER连接(这是LEFT和RIGHT连接的并集)。基本上除非有一些[内部] SQL解析器特定的优化,否则两个查询都是相同的。
答案 3 :(得分:1)
我个人不会使用第一种语法。它可能在性能上相同,但是当事情变得复杂时,它更难以维护并且更容易受到意外交叉连接的影响。如果您错过了ON条件,它将无法进行语法检查,如果您错过了一个等同于ON条件的WHERE条件,它将很乐意进行交叉连接。对于善意而言,它也是一种过时了17年的语法!
此外,旧语法中的左右连接语法在SQL Server中被破坏,并且不总是返回正确的结果(它有时可以将结果作为corss join而不是outerjoin进行插入)并且它们已被弃用并且在下一个版本中根本不可用。如果你需要更改其中一个查询以使用外部联接,那么你可以在重大改写中进行操作,因为尝试混合使用这两种语法特别糟糕。