oracle查询时候exists 和in 的用法及比较
In和exists对比:参考
https://blog.****.net/baidu_37107022/article/details/77278381
https://blog.****.net/elvis_dataguru/article/details/8426886
如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
我的理解:
in是先查里面的(子查询),拿里面查出来的数据和外面的一一匹配,适用于子查询结果集较少的情况。
exists是先查外面的,拿外面查询的数据和里面进行一一匹配,适用于外面的结果集较少的情况。
参考:
若用in,则oracle会优先查询子查询,然后匹配外层查询,
若使用exists,则oracle会优先查询外层表,然后再与内层表匹配。最优化
匹配原则,拿最小记录匹配大记录。
若子查询结果集比较小,优先使用in,若外层查询比子查询小,优先使用exists。
not exists 和not in
not exists 在使用时依然会用到表上的索引,但是not in会进行全盘扫描
因此,not exists 始终比not in 的效率高。
此外:
在Oracle中,not in (…) 括号中的返回值不能存在null值,如果不能确定返回结果一定无null值,还是改为not esists吧。而且not in效率低下,一般不能用到索引,生产环境的程序最好不要使用。
table1
table2:
not exists 和 not in
exists 和 in
查看执行计划:plsql 快捷键:F5
树型分析图:
HTML分析图: