继续,我想知道为什么它产生巨大的文件,而不应该产生?

时间:2012-08-08 15:11:10

标签: sql-server-2008 inner-join

Continuation

select a.artno, a.name 
from Art a 
inner join store s on a.Artno <> s.Artno` 

运行此查询花了我超过1分钟产生更多899K行,而本应带出7.9K结果。

select artno 
from art 
except 
(select artno from store)

这行代码为我提供了7.9K行,这对我来说是正确的。

第一个代码似乎是工作代码,但需要花费一些时间并生成一个大的结果集。想知道为什么?

2 个答案:

答案 0 :(得分:2)

<>运算符与INNER JOIN一起使用通常不是一个好主意,除非您确实知道您需要大量记录。换句话说,JOIN是一个很好的包含工具,而不是排除。

当您使用<>运算符(尤其是键)执行INNER JOIN时,查询会返回artstore条记录的每个组合,但{{1}除外}匹配。

因此,如果您有4条Artno条记录和5条art条记录,其中只有一条记录具有匹配的store值,则最终会得到4 x 5 - 1 = 19记录。

第二个查询只显示不在任何商店中的所有ArtNo条记录。

答案 1 :(得分:0)

两个查询不同。第一个查询是连接两个表的结果,并且条件可能相同,根据您的结果,它是两个表之间的一对多关系。

相比之下,第二个查询没有加入两个结果,而是从ART表中选择并排除您从另一个表中提供的艺术数字。

最后,第二个查询在不了解您的数据库的情况下需要花费更长时间的原因是一个猜测,但我会试一试。

第一个瓶颈是它加入了两个显然不是一对一的表,但第二个瓶颈可能是索引或左手表的大小。请记住,在您所拥有的JOIN中,扫描左手表,理想情况下,右手是搜索。

这有意义吗?