0

继续

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 行,这对我来说是正确的。

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

4

2 回答 2

2

<>除非你真的知道你想要很多记录,否则将运算符与 INNER JOIN一起使用通常不是一个好主意。换句话说,JOIN 是一个很好的包含而不是排除的工具。

当您使用<>运算符(特别是在键上)执行 INNER JOIN 时,查询会返回 和 的每个组合,art但键匹配store的位置除外。Artno

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

第二个查询仅显示art不在任何存储中的所有记录。

于 2012-08-08T16:12:52.210 回答
0

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

相比之下,第二个查询不是连接两个结果,而是从 ART 表中选择并排除您从另一个表提供的艺术编号。

最后,第二个查询花费更长的时间而不知道很多关于您的数据库的原因是一个猜测,但我会试一试。

第一个瓶颈是它连接两个显然不是一对一的表,但第二个瓶颈可能是索引或左侧表的大小。请记住,在像这样的 JOIN 中,左手表被扫描,理想情况下右手是搜索。

那有意义吗?

于 2012-08-08T16:14:29.553 回答