SQL查询比较

时间:2013-04-24 18:59:56

标签: sql

Tables A and B in action.
A [commonfield, otherfields]
B [commonfield]

查询1

select
        A.otherfields
from
        A,B
where
        A.commonfield = B.commonfield
        and some filters ( A.commonfield )

查询2

select
        A.otherfields
from
        A
where
        A.commonfield in ( select B.commonfield from B )
        and some filters ( A.commonfield )

查询1相当于查询2.关于(a)内存使用和(b)速度,哪个更好?

4 个答案:

答案 0 :(得分:5)

最好的和ANSI标准的做法是

查询#3:

select
        A.otherfields
from
        A
inner join
        B ON A.commonfield = B.commonfield
where
        some filters ( A.commonfield )

答案 1 :(得分:1)

另一种可能性:

SELECT
        A.otherfields
FROM
        A
WHERE EXISTS (SELECT * FROM B WHERE A.commonfield = B.commonfield)
        AND some filters ( A.commonfield )

存在的位置往往在SQL Server中最快,但在所有数据库中都不是。

我会测试所有可能性(除了使用隐式连接的一个,这是一个糟糕的编程技术本身并且不应该使用,除非你有这样一个旧的数据库,你不能使用显式连接))来确定使用您的特定数据库和设置获得最佳性能。

答案 2 :(得分:0)

这两个查询将在执行前编译。

性能取决于查询编译器的SQL Server Vendor实现。

一个供应商可能会优化两个要执行的相同代码。

我正在使用SQL Server 2000,两个表达式都产生了具有相同性能的等效代码。

答案 3 :(得分:0)

查询1 等同于查询2!

当B中存在多个匹配时,Query1将返回多行。查询2将仅返回A中的行,没有重复。

由于这些不会返回相同的结果集,我认为比较它们的表现并不是一个好主意。

但是,查询1可能会表现得更好,因为它没有进行重复删除。另一方面,如果你有适当的索引,那么两者可能相似,或者查询2甚至可能更好。