exists真的就比in的效率高吗?

转载 2007年09月27日 17:09:00

系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists

 

修改方法如下:

in的SQL语句

SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
category_id in (select id from tab_oa_pub_cate where no='1')
order by begintime desc

修改为exists的SQL语句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')
order by begintime desc

 

分析一下exists真的就比in的效率高吗?

 

     我们先讨论IN和EXISTS。
     select * from t1 where x in ( select y from t2 )
     事实上可以理解为:
     select *
       from t1, ( select distinct y from t2 ) t2
      where t1.x = t2.y;
     ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。
     select * from t1 where exists ( select null from t2 where y = x )
     可以理解为:
     for x in ( select * from t1 )
     loop
        if ( exists ( select null from t2 where y = x.x )
        then
           OUTPUT THE RECORD!
        end if
     end loop
     ——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。
     综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是相对的 

相关文章推荐

查询性能优化

优化数据访问查询性能低下的最基本的原因是访问的数据太多,对于低效的查询,可以从下面两个步骤来分析:(1)确认应用程序是否在检索大量超过需要的行,这通常意味着访问了太多的行,但有时候也有可能访问了太多的...

in和exists的区别与SQL执行效率分析

SQL中in可以分为三类:   1、形如select * from t1 where f1 in ('a','b'),应该和以下两种比较效率   select * from t1 wher...

基于bootstrap的jQuery左右移动多选框插件 multiselect

用户项目管理 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootst

数据库in/exists用法和效率大揭密

之前没注意到这两者的差别。 其实,这里还是有一定的陷阱的。 先看下代码: select count(*) from ( ( select sc.xh from "JISUANJI"."S...

IN和EXISTS、not in 和not exists的效率详解

从效率来看:1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;T1数据量小而T2数据量非常大时,T1<>T2 时,...
  • shooke
  • shooke
  • 2016-09-21 10:28
  • 2766

java对象之间赋值详解

赋值是用等号运算符(=)进行的。它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的、已命名的变量。也就是说,它必须有一...

oracle中的 exists 和 in 的效率问题

转自:http://www.cnblogs.com/ztf2008/archive/2009/02/01/1381996.html 有两个简单例子,以说明 “exists”和“in”的效率问...

mysql in和exists性能比较和使用

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那...

Sql中EXISTS与IN的效率问题

根据两张表大小不同选择EXSIST、IN

关于EXISTS的使用及效率

本文参考了不过的ORACLE博客http://www.cnblogs.com/yf520gn/archive/2009/01/12/1374359.html 后根据自己的理解来写的。创建两张表T1、T...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)