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)速度,哪个更好?
答案 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甚至可能更好。