SQL in与exists的执行效率比较

筛选条件是在主查询上还是在子查询上
服务器君一共花费了552.806 ms进行了6次数据库查询>>,努力地为您提供了这个页面>。
试试阅读模式>?希望听取您的建议

SQL中in可以分为三类:

  • 形如select * from t1 where f1 in ('a','b')>>,应该和以下两种比较效率:select * from t1 where f1='a' or f1='b' 或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'>>>,你可能指的不是这一类,这里不做讨论。
  • 形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),其中子查询的where里的条件不受外层查询的影响>,这类查询一般情况下>,自动优化会转成exist语句,也就是效率和exist一样。
  • 形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx)>,其中子查询的where里的条件受外层查询的影响>,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少>,一般认为效率不如exists>。除了第一类in语句都是可以转化成exists 语句的SQL,一般编程习惯应该是用exists而不用in,而很少去考虑in和exists的执行效率>。

A,B两个表

  • 当只显示一个表的数据如A>>,关系条件只一个如ID时,使用IN更快:select * from A where id in (select id from B)
  • 当只显示一个表的数据如A>>>,关系条件不只一个如ID,col1时>,使用IN就不方便了,可以使用EXISTS:select * from A where exists (select 1 from B where id = A.id and col1 = A.col1)
  • 当只显示两个表的数据时>>,使用IN>,EXISTS都不合适>>,要使用连接:select * from A left join B on id = A.id

所以使用何种方式>,要根据要求来定>>。

这是一般情况下做的测试:

set statistics io on 
select * from sysobjects where exists (select 1 from syscolumns where id=syscolumns.id) 
select * from sysobjects where id in (select id from syscolumns ) 
set statistics io off 
(47 行受影响)
表'syscolpars'>>。扫描计数 1>>,逻辑读取 3 次>,物理读取 0 次,预读 2 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次>。
表'sysschobjs'>。扫描计数 1>>>,逻辑读取 3 次,物理读取 0 次,预读 0 次>>>,lob 逻辑读取 0 次>>,lob 物理读取 0 次>,lob 预读 0 次。
(1 行受影响)
(44 行受影响)
表'syscolpars'。扫描计数 47,逻辑读取 97 次,物理读取 0 次>>,预读 0 次>,lob 逻辑读取 0 次,lob 物理读取 0 次>,lob 预读 0 次>。
表'sysschobjs'>。扫描计数 1>,逻辑读取 3 次,物理读取 0 次>,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
set statistics io on 
select * from syscolumns where exists (select 1 from sysobjects where id=syscolumns.id) 
select * from syscolumns where id in (select id from sysobjects ) 
set statistics io off 
(419 行受影响)
表'syscolpars'>。扫描计数 1>,逻辑读取 10 次>,物理读取 0 次,预读 15 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次>。
表'sysschobjs'>。扫描计数 1,逻辑读取 3 次,物理读取 0 次>>,预读 0 次>,lob 逻辑读取 0 次>>,lob 物理读取 0 次,lob 预读 0 次>>。
(1 行受影响)
(419 行受影响)
表'syscolpars'。扫描计数 1>,逻辑读取 10 次,物理读取 0 次,预读 0 次>>,lob 逻辑读取 0 次>,lob 物理读取 0 次>,lob 预读 0 次。
表'sysschobjs'>。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次>>,lob 预读 0 次。
(1 行受影响)

测试结果(总体来讲exists比in的效率高):

效率:条件因素的索引是非常关键的

把syscolumns 作为条件:syscolumns 数据大于sysobjects

用in 扫描计数 47,逻辑读取 97 次>,用exists 扫描计数 1>,逻辑读取 3 次>。把sysobjects作为条件:sysobjects 的数据少于 syscolumns,exists 比 in 多预读 15 次>>。

如果要查询每个类别的最大sid 的话

select * from test a 
  where not exists(select 1 from test where sort = a.sort and sid > a.sid) 

select * from test a 
  where sid in (select max(sid) from test where sort = a.sort) 

的执行效率要高三倍以上。

sql优化中>,使用in和exist>? 主要是看你的筛选条件是在主查询上还是在子查询上>。

本文地址:http://www.jzjxzzjx.com/librarys/veda/detail/637,欢迎访问原出处。

不打个分吗?

转载随意>,但请带上本文地址:

http://www.jzjxzzjx.com/librarys/veda/detail/637

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏>。

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢>,学习效率低>>,我觉得一个重要原因是看的书少了>。多少是多呢?起码得看3、4>、5>、6米吧>>>。给个具体的数量>,那就100本书吧>。很多人知识结构不好而且不系统>>,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题>>。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么>,我们可以让他坐“上位”毕竟他是面试官>>,但是在知识结构体系以及心理上我们就居高临下>>。

所以>>,阅读一百本计算机著作吧,少年!

《编程之美:微软技术面试心得》 《编程之美》小组 (作者)

《编程之美:微软技术面试心得》是一本让人着迷的书!阅读起来。有些题目的内容会引起强烈的共鸣>,尤其是那些自己非常熟悉并且又深知解答的题目>;也有一些题目让我异常惊诧>,原来除了我所知道的解答思路之外,还有更好的解答以及更深层次的原因>>?>>;褂幸恍┨饽渴谴永疵幌氲焦?。阅读过程是一次愉快的享受>>,也是脑细胞持续活跃的过程。

更多计算机宝库...

ASP300源码下载 | 微信红包群 | 设计 | 厦门旅游景点 | 旅游中国新闻网 | 钛媒体 | 健康网hsdcba | 每天资讯 | 广西农业技术信息 | 农业种植技术 |