`

Oracle exists in

阅读更多
有两个简单例子,以说明 “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和exists性能解析

    oracle in和exists性能解析

    oracle中exists_和in的效率问题详解

    oracle中exists_和in的效率问题详解

    oracle数据库关于exists使用

    oracle数据库关于exists使用方法与in的比较

    简述Oracle中in和exists的不同

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

    in和exists的区别

    “exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。

    sql in,exists,not in,not exists区别

    里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。

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

    一个是问in exist的区别,一个是not in和not exists的区别

    Oracle: minus | in | exists

    NULL 博文链接:https://wuaner.iteye.com/blog/1671927

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的...

    oracle高级sql讲解课程

    with子句使用,集合操作,case应用,行列互换,4 exists与in、not exists与not in

    oracle管理及优化文档 粗略整理

    尽量用not exists 或者外连接替代 not in 操作符。因为not in不能 应用表的索引 3。尽量不用&lt;&gt; 或者!= 操作符。不等于操作符是永远不会用到索引的,因此 对它的处理只会产生全表扫描,改为 a&gt; XX or a 4.在设计...

    Oracle内部培训汇总

    oracle进阶教程 1、优化器 2、连接 3、in和exists 4、hint 5、index 6、收集统计信息 7、优化技巧

    oracle语句优化.docx

    oracle语句优化:多表关联,exists ,in ORACLE对每个SQL都会对其进行分析,占用共享内存,服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息

    oracle rac日常基本维护命令

    WHERE group_number IN (select group_number from v$asm_diskgroup where name = 'ORCL_DATA1'); PATH ---------------------------------- ORCL:VOL1 ORCL:VOL2  二: 启动/停止RAC集群 确保是以 oracle ...

    oracle学习日志总结

    尽量使用“&gt;=”,不要使用“&gt;”,用EXISTS代替IN(外表数据小情况),用大于或小于代替不等于,用右模糊查询(LIKE ‘…%’)代替模糊查询,用UNION ALL代替UNION,union代替or,trancate代替delete等. 7. count(1)比...

    oracle的sql优化

    用Exist或Not Exists来代理In。In进行子查询效率很差。 5.SQL语句分析  通过SQLPLUS中的SET TRACE 功能对Sql语句的性能进行分析  通过Toad或PL/SQL Developer对语句的性能进行和索引的使用情况进行分析  对Oracle...

    Oracle数据库Sql性能调优

    1.20 用NOT EXISTS替代NOT IN 12 1.21 用表连接替换EXISTS 13 1.22 用EXISTS替换DISTINCT 13 1.23 识别’低效执行’的SQL语句 14 1.24 用索引提高效率 14 1.25 索引的操作 15 1.26 多个平等的索引 16 1.27 等式比较...

Global site tag (gtag.js) - Google Analytics