SQLSERVER语句 in和exists和in的效率哪个效率高本人测试证明

sql 中,exists 和 in 的区别?效率?
[问题点数:50分,结帖人yzb123]
sql 中,exists 和 in 的区别?效率?
[问题点数:50分,结帖人yzb123]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年1月 Oracle大版内专家分月排行榜第一2015年6月 Oracle大版内专家分月排行榜第一2015年4月 Oracle大版内专家分月排行榜第一2015年3月 Oracle大版内专家分月排行榜第一2015年2月 Oracle大版内专家分月排行榜第一2014年6月 Oracle大版内专家分月排行榜第一2009年11月 Oracle大版内专家分月排行榜第一2009年10月 Oracle大版内专家分月排行榜第一
2015年9月 Oracle大版内专家分月排行榜第二2015年7月 Oracle大版内专家分月排行榜第二2015年1月 Oracle大版内专家分月排行榜第二2014年12月 Oracle大版内专家分月排行榜第二2014年11月 Oracle大版内专家分月排行榜第二2014年8月 Oracle大版内专家分月排行榜第二2014年7月 Oracle大版内专家分月排行榜第二2014年5月 Oracle大版内专家分月排行榜第二2010年1月 Oracle大版内专家分月排行榜第二2009年9月 Oracle大版内专家分月排行榜第二
2005年11月 扩充话题大版内专家分月排行榜第三
2009年11月 Oracle大版内专家分月排行榜第二2009年10月 Oracle大版内专家分月排行榜第二
2009年5月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。> SQL中IN跟EXISTS到底哪个更快
SQL中IN跟EXISTS到底哪个更快
tangbohu214 & &
发布时间: & &
浏览:105 & &
回复:1 & &
悬赏:0.0希赛币
SQL中IN和EXISTS到底哪个更快我有几个查询用到了in ,然后有人告诉我exists 比 in 快 又有人说一样的
到底哪个更快
sql in与exists区别IN确定给定的值是否与子查询或列表中的值相匹配。EXISTS指定一个子查询,检测行的存在。比较使用 EXISTS 和 IN 的查询这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。USE pubsGOSELECT DISTINCT pub_nameFROM publishersWHERE EXISTS(SELECT *FROM titlesWHERE pub_id = publishers.pub_idAND type = 'business')GO-- Or, using the IN clause:USE pubsGOSELECT distinct pub_nameFROM publishersWHERE pub_id IN(SELECT pub_idFROM titlesWHERE type = 'business')GO下面是任一查询的结果集:pub_name----------------------------------------Algodata InfosystemsNew Moon Books(2 row(s) affected) &exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大。全文: &in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)效率高,用到了B表上cc列的索引。相反的2:select * from B where cc in (select cc from A)效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)效率低,用到了A表上cc列的索引。not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。in 与 =的区别select name from student where name in ('zhang','wang','li','zhao');与select name from student where name='zhang' or name='li' or name='wang' or name='zhao'的结果是相同的。tangchangjun & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & && 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
【精品】informix exists与in效率测试记录
下载积分:750
内容提示:【精品】informix exists与in效率测试记录
文档格式:DOC|
浏览次数:36|
上传日期: 00:03:29|
文档星级:
该用户还上传了这些文档
【精品】informix exists与in效率测试记录
官方公共微信在sql语句多表连接中,in、exists、join那个效率更高一点.
永恒de奥特曼21
EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑.在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:EXISTS
为您推荐:
其他类似问题
扫描下载二维码1、in和exists
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
例如:表A(小表),表B(大表)
select * from A where cc in(select cc from B)  --&效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)  --&效率高,用到了B表上cc列的索引。
select * from B where cc in(select cc from A)  --&效率高,用到了B表上cc列的索引
select * from B where exists(select cc from A where cc=B.cc)  --&效率低,用到了A表上cc列的索引。
2、not in 和not exists
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG,请看下面的例子:
create table #t1(c1 int,c2 int);
create table #t2(c1 int,c2 int);
insert into #t1 values(1,2);
insert into #t1 values(1,3);
insert into #t2 values(1,2);
insert into #t2 values(1,null);
select * from #t1 where c2 not in(select c2 from #t2);  --&执行结果:无
select * from #t1 where not exists(select 1 from #t2 where #t2.c2=#t1.c2)  --&执行结果:1  3
正如所看到的,not in出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select 语句的执行计划,也会不同,后者使用了hash_aj,所以,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
3、in 与 = 的区别
select name from student where name in('zhang','wang','zhao');
select name from student where name='zhang' or name='wang' or name='zhao'
的结果是相同的。
阅读(...) 评论()

我要回帖

更多关于 mysql exists in 效率 的文章

 

随机推荐