in:表之间使用的是Hash Join的方式
exists:表之间使用的是Nested Loop方式
(什么事Hash Join ,什么事Nested Loop 请参看上一篇文章)
知道了两者的链接方式,那就很好理解了。
in将内表放入内存,然后再通过链接查找符合要求的记录。
exists则将对外表进行循环(扫描每一行),然后去内表查找相应的数据。一般来说,外表与内表通过索引进行关联,这个也就是我们平时说的用exists比用in效率高的原因。
这种情况一般只针对外表比较小,内表比较大而言。
还有一种情况要注意,如果外表比较大,但可以对其进行并行操作,此时也可将大表作为外表(也叫驱动表)。