6
回答
oracle not exists 与 not in 比较
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
在网上查了很多资料,都说not exists 比 not in的效率高,但具体原因说的含糊不清,请教高手讲解一下撒........
举报
南北024
发帖于6年前 6回/1K+阅
共有6个答案 最后回答: 6年前
in和exists

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
 
not同理

引用来自“穿衣服比较麻烦”的答案

有找的时间,建立2个大表测试下就行了。

效率高低更多的和写法有关系。

 

穿衣服比较麻烦

exists和in 不太好比较,虽然都说exists是 nested loops, in 是hash join,但实际上在 CBO下面,优化器会自己选择的,并不见得一定就是那种算法。

not in 和  not exists 之间则比较容易区分高下。理由很简单:not in 不会走索引。

exists效率高,是因为其不会返回真正的数据行,只会返回一个布尔值。一旦结果能够确定,就停止内层子查询的执行。一般可以使用常量放在SELECT的列名表中可加速语句执行,因为EXISTS不需要返回具体的列值。
顶部