2013-04-24 122 views
3
Tables A and B in action. 
A [commonfield, otherfields] 
B [commonfield] 

查询1SQL查询比较

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)中速度?

+3

[不良习惯踢:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 旧式*逗号分隔的表*样式列表已停止使用ANSI - ** 92 ** SQL标准(超过** 20年前**) – 2013-04-24 19:01:02

+0

内存使用情况第二个查询更好,因为你已经限制你对B的选择,然后根据你查询的结果A. – 2013-04-24 19:02:36

+2

请进入21世纪并停止使用隐式连接。他们是SQL反模式,难以维护,并且容易出错。 – HLGEM 2013-04-24 19:04:37

回答

5

最好的和做的ANSI标准方式将是

查询#3:

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

另一种可能:

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

凡存在往往是最快的SQL服务器但不是在所有数据库中。

我会测试所有可能性(除了一个使用隐式联接的应用程序(这是一种很差的编程技术本身,不应该使用,除非您有这样一个旧数据库,您不能使用显式联接))来确定您的特殊数据库和设置的最佳性能。

0

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

性能将取决于您的SQL Server供应商实现的查询编译器。

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

我正在使用SQL Server 2000,并且这两个表达式都导致了等效代码的等效性能。

0

查询1是而不是等价于查询2!

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

由于这些不会返回相同的结果集,所以我不认为比较它们的性能是个好主意。

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