ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

关于sql中in 和 exists 的效率问题,in真的效率低吗

2019-04-27 08:49:21  阅读:299  来源: 互联网

标签:STATUS exists 效率 INDIVIDUAL sql where ID select


 原文: http://www.cnblogs.com/AdamLee/p/5054674.html

在网上看到很多关于sql中使用in效率低的问题,于是自己做了测试来验证是否是众人说的那样。

群众:

对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。


这里我找到两张表,一个是用户信息表[INDIVIDUAL] 47万条数据,一个状态类型表[STATUS] 88条数据,对应上面所述的一多一少


然后进行两种查询 (not exists 和 not in一组)(exists 和 in一组)
select * from STATUS s where not exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID)

select * from STATUS s where s.STATUS_ID not in(select i.STATUS_ID from INDIVIDUAL i )
select * from STATUS s where  exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID)

select * from STATUS s where s.STATUS_ID  in(select i.STATUS_ID from INDIVIDUAL i )

查看执行计划后发现,结果貌似是一样的,令人意外,可能大家认为in 比较慢的原因就是 IN先执行子查询 ,但是事实并不是这样的。





但是如果你使用join,就会发现真的对用户表全盘扫描了.....

标签:STATUS,exists,效率,INDIVIDUAL,sql,where,ID,select
来源: https://www.cnblogs.com/xiaoshen666/p/10777597.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有