2009-09-29 62 views
0

前提是表格本质上可以加入内,因为where子句排除不匹配,只是究竟有多糟的所有记录用以下2查询语句的语法风格第一:的TABLE1 T1,T2 TABLE2 WHERE T1.Blah = T2.Blah - VS - INNER JOIN

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 

我不知道这是否是有限的微软SQL,甚至是特定的版本,但我理解是第一种情况是全外连接使所有可能的相关性都可以访问。

我已经在过去使用第一种方法来优化访问两个显著大数据的存储,每个具有外围表查询加入他们,与那些产品加入后期走到一起查询。通过允许每个“较大”表中的加入到它们各自的查找表,并且只结合每个较大的表中的一个特定子集,我发现有超过引入大表来之前彼此特定的过滤是显着的速度提升。

在正常情况下(简单连接)的情况下,使用第二种场景会不会更好?我发现它更容易阅读,看起来会更快。

+0

我不会用来优化,有办法做你所描述的使用派生表的例子或通过改变连接顺序。 – HLGEM 2009-09-29 22:05:05

回答

2

也许回答这个最好的办法就是看看在数据库内部是怎样处理的查询。如果你使用的是SQL Server,可以使用Profiler来查看每个查询需要多少次读取以及查询计划来查看通过数据采取的路径。统计数据,偏差等也很可能发挥作用。

2

第一个查询不会产生一个完全外部连接(这是左,右加入的工会)。本质上,除非有[内部] SQL解析器特定的优化,否则两个查询都是相同的。

1

个人而言,我永远不会使用第一种语法。它在性能上可能是相同的,但当事情变得复杂时,它更难以维持,并且更容易受到意外交叉连接的影响。如果你错过了一个ON条件,它将会失败语法检查,如果你错过了WHERE条件之一,就等于ON条件,它会很乐意做一个交叉连接。这也是一个句法,17年过时了,为善!

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

相关问题