`
wei5201
  • 浏览: 187585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle in与exist个人见解

阅读更多
  
  如果使用IN,执行过程将如同下列所示:
  
  
Select * from T1 where x in ( select y from T2 )
  
  LIKE:
  
  select *
  from t1, ( select distinct y from t2 ) t2
  where t1.x = t2.y;
 
 
  如果使用EXISTS,如同上述的查询结果,我们改写成:
  
 
 select * from t1 where exists ( select null from t2 where y = x )
  
  LIKE:
  
  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
  

  所以能想想其中差异,当子查询的表格是个储存巨大资料量的表格时,则使用第一个方法的效能将比较差,因为他的执行计画是使用SORT MERGE JOIN,相对的如果子查询的TABLE相对比较小,使用IN的执行效率应该比较佳。
  
  而如果外部的表格(例如t1)是相对的储存大量资料,则?用第一个方法IN的效率将会比较好,如果你使用EXISTS,则除了会对t1这个bigtable进行full scan外,还会一笔一笔读取所有t1的资料列,效能自然较差。简单的一句话,外大内小=IN,外小内大=EXISTS,这是个实用的概略评估方法,在大部分的情况下是适用的。

有两个简单例子,以说明 “exists”和“in”的效率问题
  1)
 select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
  T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

  2)
select * from T1 where T1.a in (select T2.a from T2) ;
  T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。

  exists 用法:

  请注意 1)句中的有颜色字体的部分 ,理解其含义;

  其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于

  “select 1 from T1,T2 where T1.a=T2.a”

  但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。

  “exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。

  因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。

  in 的用法:

  继续引用上面的例子

  “2)
select * from T1 where T1.a in (select T2.a from T2)


  这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

  打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:

 
 “select * from T1 where T1.ticketid in (select T2.id from T2) ”

  Select name from employee where name not in (select name from student);

  Select name from employee where not exists (select name from student);
  第一句SQL语句的执行效率不如第二句。

  通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

IN(...)里面的列表 "数据量大 "的话,恐怕楼主得注意限制哟:)
9i的限制是1000~~~~不然会出错的


分享到:
评论

相关推荐

    IN 和 EXIST的区别

    当与子查询结合使用时,“IN”会将外部查询中的每一行与子查询结果集中的所有行进行比较,以确定是否存在匹配项。然而,“IN”与子查询结合时,其执行效率受到限制,尤其是在处理大型数据集时,因为它可能无法有效地...

    in exist not_in

    IN、EXISTS、NOT EXISTS、NOT IN 在 SQL 语句中的应用和区别 IN 语句和 EXISTS 语句都是 SQL 语句中用来判断是否存在某个值的语句,但是它们的实现机制和应用场景是不同的。 IN 语句是通过 hash 连接来实现的,它...

    简述Oracle中in和exists的不同

    一直以来,大家认为exists比in速度快,其实是不准确的。且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么...

    presto-oracle

    Presto OraclePlugin This is a plugin for Presto that allow ...Oracle Driver is not available in common repositories, so you will need to download it from Oracle and install manually in your repository.

    Oracle In和exists not in和not exists的比较分析

    in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

    oracle10g提示oracle not available的一些个人总结

    ### Oracle 10g 提示 Oracle Not Available 的个人总结与解决方案 #### 一、问题概述 在使用 Oracle 10g 数据库时,可能会遇到“ORA-01034: ORACLE not available”和“ORA-27101: shared memory realm does not ...

    Centos 7.4 配置 oracle 自启动

    # If the executables do not exist -- display error if [ ! -f $ORACLE_HOME/bin/dbstart ] || [ ! -d $ORACLE_HOME ]; then echo "Oracle startup: cannot start" exit 1 fi # Depending on parameter -- ...

    Some projects cannot be imported because they already exist in the workspace

    在使用Eclipse或MyEclipse等集成开发环境(IDE)时,可能会遇到“Some projects cannot be imported because they already exist in the workspace”的问题。这个错误提示表明,你试图导入的项目与当前工作空间...

    SQL中对not in和not exist查询的替代算法.pdf

    "SQL中对not in和not exist查询的替代算法.pdf" 本文主要讨论了SQL中对not in和not exist查询的替代算法。首先,作者简要介绍了SQL语言的基本概念和特点,然后讨论了not in和not exist查询的低效性及其原因。接着,...

    Oracle安装单机后自启动参数配置.txt

    # if the executables do not exist -- display error if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ] then echo "Oracle startup: cannot start" exit 1 fi # depending on parameter -- startup, ...

    oracle 10g提示oracle not available

    在使用Oracle 10g数据库时,可能会遇到一个常见的错误提示:“ORA-01034: Oracle not available”以及“ORA-27101: shared memory realm does not exist”。这个错误通常出现在尝试启动数据库实例时,表明Oracle服务...

    第04章 Oracle数据库创建与表空间维护

    第04章 Oracle数据库创建与表空间维护 oracle学习资料

    oracle开机自启脚本

    - 查找与当前Oracle实例相关的行(如:`orcl:/usr/oracle/app/product/11.2.0/dbhome_1:N`)。 - 将该行最后的`N`改为`Y`,表示此实例应该在系统启动时自动启动(例如:`orcl:/usr/oracle/app/product/11.2.0/...

    创建oracle的后台服务OracleServiceORCL

    如果出现错误提示 ERROR:ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist,说明 Oracle 数据库没有启动,可以使用 sysdba 连接: conn sys/admin as sysdba 然后,发出 startup ...

    Exist交互流程图1

    Exist交互流程图1知识点解析 Exist交互流程图1是描述Exist系统中交互流程的图表,涉及到系统中多个组件之间的交互,包括Mother登记、SSD列表通知、CPU请求、数据请求、读数据请求、写数据请求、忽略请求、断开连接...

    解决oracle用户连接失败的解决方法

    安装完 Oracle11g 之后,想打开自带的 SQL Plus 来学习,然后按照提示用 sys 用户来连接数据库,可输了好几次都提示一个错误: error: the account is locked 可能是下面几个原因。 1. 尝试多次登录未成功(可能密码...

    eXist原生XML数据库和应用平台

    - **原生XML存储**:与关系型数据库不同,eXist将XML文档作为一个整体进行存储,而不是将其分解为行和列。这保留了XML的结构信息,便于进行结构化查询和操作。 - **XPath和XQuery支持**:eXist支持XPath(XML路径...

    ubuntu 8.0.4 server 安装oracle10.2成功

    2. 这些软件包包含了编译Oracle软件所需的工具与库,例如编译器、链接器等。 #### 四、配置PuTTY支持X11转发 为了能够在远程连接时显示Oracle的GUI安装程序,需要配置PuTTY支持X11转发。 1. 在Ubuntu的`/etc/ssh/...

Global site tag (gtag.js) - Google Analytics