2011-08-25 153 views
0

可能重复:
SQL JOIN: is there a difference between USING, ON or WHERE?SQL查询优化

考虑一下,如果我有一个名为A和B两个表,一个有2万行和B只有100行,当我使用这些SELECT声明,我需要知道这两个区别

SELECT A.C1, B.C1 
FROM A, B 
WHERE A.C1 = B.C2 

第二个是

SELECT A.C1, B.C1 
FROM A 
INNER JOIN B ON A.C1 = B.C2 

我在看性能水平,我需要知道这个之间的核心区别。当我和我的同事谈话时,他告诉我第一个问题是交叉加入会降低性能,但我不是那样想的。

请帮忙。

哪个查询你在这里建议,为什么?

回答

9

性能没有任何区别。第一个是而不是交叉连接,因为它似乎是有效的WHERE子句。

唯一的区别是第二个遵循ANSI-92标准。我个人更喜欢使用第二个符合ANSI的查询,但这真的取决于您。

还可以阅读:ANSI vs. non-ANSI SQL JOIN syntax

+0

+1是,**总是**使用第二个版本 - 具有JOIN条件的'INNER JOIN'更清晰。另外:使用第一个(遗留)JOIN语法,您总是有忘记指定连接条件(您必须)的危险可能性,因此最终会产生不需要的笛卡尔积... –

+1

我以为它们都是ANSI 。 ANSI 89与ANSI 92至少这是我从以前关于这个主题的问题中得到的结果...... –

+0

对于内部连接,这两种语法都是从SQL92开始的ANSI标准。 –

3

我会建议第二个查询,因为它看起来更好,反映了你的数据库逻辑。大多数(如果不是全部的话)SQL服务器为两者生成完全相同的查询计划,因此性能应该相同。

+0

反映你的数据库逻辑手段? –

+0

这意味着它反映了数据库逻辑,因为where条件在逻辑上不是真正的“过滤器”,而是连接条件。 – TomTom

0

正如大家都知道,有一个SQL查询执行的各个阶段。首先执行的是From子句,然后将结果集传递给Where子句,然后Select子句仅从Where子句最终返回的一组行中选择所提到的字段。

在第一种情况下,交叉连接确实被创建并存储在内存中,然后这些记录被传递给Where子句。这意味着即使结果集中存在不符合条件的记录。所以占用的内存量更大。

在第二种情况下,From子句只保留匹配条件的记录并将结果集传递给Where子句。很容易看到记录数量会相当少。

从A中选择,B是一个非常古老的构造,仅保留用于不可避免的情况。 Join条款已被引入以获得更好的性能,并且肯定是首选。

希望这有助于:)

+0

我真的很期待这个..请你分享一些有力的证据来证明这一点吗?我打算辩论.. :) –

+0

你有什么记录吗? –

+0

-1这是一个平坦的谎言。 – NullUserException