当前位置:  数据库>sqlserver

sql server中exists与in、not exists与not in

    来源: 互联网  发布时间:2014-08-29

    本文导语:          要求对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists。 修改方法如下: in的SQL语句   代码如下: SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime...

        要求对效率比较低的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适合于外表小而内表大的情况。

您可能感兴趣的文章:
sql语句中in与exists的区别
sql server中Exists的用法举例


    
 
 

您可能感兴趣的文章:

  • if exists和if not exists关键字用法(sql server)
  • sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
  • sql server中Exists的用法举例
  • sql not in 与not exists使用中的细微差别
  • sql语句中exists用法举例
  • SQL SERVER中关于exists 和 in的简单分析
  • SQL中exists的使用方法
  • sql语句中in与exists的区别
  • SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化
  • SQL查询中in和exists的区别分析
  • java.sql.SQLException:Can not open connection with full database pool(20)
  • sql语句not and or执行顺序(实例解析)
  • 在64位机器上使用plSQL连接Oracle的问题(SQL*Net not properly installed)
  • jsp表单数据不能通过jdbc把数据输入到sql server中去,在tomcat控制台上显示:"not suitable driver"
  • SQLServer 优化SQL语句 in 和not in的替代方案
  • sql server中Execpt和not in在性能上的区别
  • SQL 复合查询条件(AND,OR,NOT)对NULL值的处理方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • 微软网站下载的Ms SQL Server2000 JDBC Driver,必须用英文版的SQL server2000吗?
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • 安装sql server 2008 management提示已安装 SQL Server 2005 Express的解决方法
  • SQL Server 2008 事件探查器(SQL SERVER Profiler) 列的说明
  • (X86/X64)安装sql server 2005 过程中提示“无法启动sql server的 启动”的解决方法
  • SQL Server降权运行 SQL Server 2000以GUESTS权限运行设置方法
  • MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • sql server不存在 sql server拒绝访问第1/3页
  • SQL Server误区30日谈 第5天 AWE在64位SQL SERVER中必须开启
  • 一定得帮我看看sql server2000通过sql server2000jdbc driver的代码
  • SQL Server统计SQL语句执行时间的脚本
  • SQL Server误区30日谈 第21天 数据损坏可以通过重启SQL Server来修复
  • SQL Server误区30日谈 第3天 即时文件初始化特性可以在SQL Server中开启和关闭
  • 创建 sql server 链接服务器的sql代码
  • jsp jdbc为什麽不能把数据insert到sql server 中,也不能从sql server中提取数据?!
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql server 2005 三个常用的小sql
  • SQL Server 中查看SQL句子执行所用的时间
  • 推荐SQL Server 重新恢复自动编号列的序号的sql代码
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • sql2005 大数据量检索分页的sql代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3