简述Oracle中in和exists的不同
一直以来,大家认为exists比in速度快,其实是不准确的。且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。
如果两张表大小差不多,那么exists和in的效率差不多。
例如: 一张大表为A,一张小表B
一、第一种情况
select * from A where mm in (select mm from B)
效率高,这里用到的是大表A上的索引
select * from B exists (select mm from A where mm=B.mm)
效率高,这里用到的是小表B上的索引
二、第二种情况
select * from B where mm in (select mm from A)
效率低,这里用到的是小表B上的索引
select * from A exists (select mm from B where mm=A.mm)
效率高,这里用到的是大表A上的索引
三、第三种情况
not exists 在使用时依然会用到表上的索引,但是not in会进行全盘扫描
因此,not exists 始终比not in 的效率高
四、第四种情况
in与==效果是相同的
总结
以上所述是小编给大家介绍的Oracle中in和exists的不同,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
相关推荐
-
Oracle In和exists not in和not exists的比较分析
把这两个很普遍性的网友比较关心的问题总结回答一下. in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就无所谓了 in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,外表如果也很大就很慢了,这时候exists才真正的会快过in的方式. not in和not exists的区别
-
linux系统oracle数据库出现ora12505问题的解决方法
说明: (1)Linux版本 Linux version 2.6.32.12-0.7-default (geeko@buildhost) (gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux) ) #1 SMP 2010-05-20 11:14:20 +0200 1.查看数据库是否已经启动 命令:ps -ef|grep ora 截图: 2.查看监听(要连接到相应用户(su - oracle),例如:oracle) 命令:l
-
Plsql Developer连接Oracle时出现Could not initialize oci.dll解决方案
用plsql developer连接远程Oracle时会出现Could not initalize oci.dll警告,原因分析:安装完后Oracle的 oci.dll 是64位的,而32位应用程序 PLSQL Developer 无法加载,或者相反.因为之前实习遇到这个问题,我没有做好记录,最近又有同事遇到,问我,然后我就要重新搜索解决这个问题,所以现在就写成博客,做好记录. 步骤: 1.去http://www.oracle.com/technetwork/database/features/
-
Oracle minus用法详解及应用实例
Oracle minus用法 "minus"直接翻译为中文是"减"的意思,在Oracle中也是用来做减法操作的,只不过它不是传统意义上对数字的减法,而是对查询结果集的减法.A minus B就意味着将结果集A去除结果集B中所包含的所有记录后的结果,即在A中存在,而在B中不存在的记录.其算法跟Java中的Collection的removeAll()类似,即A minus B将只去除A跟B的交集部分,对于B中存在而A中不存在的记录不会做任何操作,也不会抛出异常. Ora
-
oracle中not exists对外层查询的影响详解
前言 最近同事发现了一个问题,在12c中跑的buffer get很高,但是在10g中跑的buffer很低.怀疑是不是12c的优化器有问题. 这个10g的环境和12c的环境,数据量大致一样,只是有很少部分的不同,但是就是这个很少部分不同,造成了not exists中的子查询返回不同的值,进而对外层查询产生不同的影响. 我们来用如下的代码模拟一下. 初始化数据: --10g drop table t1; drop table t2; create table t1 (id number,name v
-
简述Oracle中in和exists的不同
一直以来,大家认为exists比in速度快,其实是不准确的.且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询. 如果两张表大小差不多,那么exists和in的效率差不多. 例如: 一张大表为A,一张小表B 一.第一种情况 select * from A where mm in (select mm from B) 效率高,这里用到的是大表A上的索引 select * from B exists (sel
-
oracle中通配符和运算符的使用方法介绍
用于where比较条件的有: 等于:=.<.<=.>.>=.<> 包含:in.not in exists.not exists 范围:between...and.not between....and 匹配测试:like.not like Null测试:is null.is not null 布尔链接:and.or.not 通配符: 在where子句中,通配符可与like条件一起使用.在Oracle中: %(百分号): 用来表示任意数量的字符,或者可能根本没有字符. _(
-
详解oracle中通过触发器记录每个语句影响总行数
详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响.有测试人员反应,原来抽过的数,偶尔就无缘无故的找不到了,有时又会出来重复行.这个问题产生肯定是抽数逻辑问题以及并行的问题了!但他们提了一个简单的需求:想知道什么时候数据被删除了,什么时候插入了,我需要监控"表的每一次变更"! 技术选择: 第一就想到触发器,这样能在不涉及业务系统的代码情况
-
在SQL Server和Oracle中创建job
首先说下ms server,因为我也是新手,所以首先选择了使用企业管理器进行任务设定,然后再导出设计完毕的任务脚本,这样就可以在其他数据库中直接通过执行脚本的形式来新建任务了(需要适当修改其中的一些任务名称和数据库名称等值),下面说下具体的操作步骤以及获得的任务脚本: 1. 保证启动ms server的"SQL Server代理服务"(即agent service) 2. 打开企业管理器 -> 连接数据服务器 -> 右键"SQL Server agent"
-
oracle中utl_file包读写文件操作实例学习
在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create or replace directory TESTFILE as '/home/oracle/zxx/test'; --给用户授权 grant read, write on directory TESTFILE to zxx; 详细介绍 http://download.oracle.com/docs
-
Mysql、Oracle中常用的多表修改语句总结
今天在sql训练题库中看到了这题,这是一道很有代表性的多表修改题,其实解出这道题并不难,无论是mysql中还是oracle中都有很多种解法,接下来就好好归纳一下这些解法. msyql中多表修改 对于mysql中常用的多表修改语句,还是用例子来解释一下吧. //建表 create table aaa(id int,value1 int(5),value2 int(5),value3 int(5),value4 int(5)); create table bbb like aaa; //插入数据 i
-
Oracle中PL/SQL复合数据类型
一.PL/SQL记录:一条记录 可简化单行多列的数据的处理.当使用pl/sql记录时,应用开发人员即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量. 1.当使用自定义的pl/sql记录时,需要分别定义pl/sql记录类型和记录变量. declare type emp_record_type is record( name emp.ename%type,salary emp.sal%type ); emp_record emp_record_type; begin s
-
Oracle中case when函数的用法
一.case when 的基本用法见: PL/SQL 使用控制流程 二.case when在select语句中的用法 SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 ELSE NULL END) 男生数, COUNT (CASE WHEN sex = 2 THEN 1 ELSE NULL END) 女生数 FROM students GROUP BY grade; 1.在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXIST
-
Oracle中PL/SQL的用法总结
目录 一.PLSQL基本结构 1.基本数据类型变量 1. 基本数据类型 2. 基本数据类型变量的定义方法 2.表达式 1. 数值表达式 2. 字符表达式 3. 关系表达式 4. 逻辑表达式 3.PLSQL函数 4.系统输出打印 5.PL/SQL中的变量声明 二.变量赋值方式 三.PLSQL复合类型 1.记录类型record 2.表类型变量table 1. 定义一维表类型变量 2. 定义多维表类型变量 四. %type和%rowtype 五.PLSQL变量的可见空间 六.PLSQL流程控制 if判
-
oracle中decode函数的使用方法示例
decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn
随机推荐
- prototype.js常用函数详解
- asp.net操作javascript:confirm返回值的两种方式
- javascript如何使用bind指定接收者
- ASP.NET中的Menu控件的应用及XmlDataSource的了解
- 利用php + Laravel如何实现部署自动化详解
- Android编程实现对电池状态的监视功能示例
- vue 2.0封装model组件的方法
- php中Y2K38的漏洞解决方法实例分析
- PHP操作MySQL事务实例
- headjs实现网站并行加载但顺序执行JS
- 深入浅析Java中的final关键字
- 如何将mybatis配置到springmvc中
- TabLayout关联ViewPager后不显示文字的解决方法
- Python线性回归实战分析
- C#中字符串优化String.Intern、IsInterned详解
- 解决异常FileNotFoundException:class path resource找不到资源文件的问题
- 微信小程序实现图片滚动效果示例
- python实现爬山算法的思路详解
- 如何给asp.net core写个简单的健康检查
- redis适合场景八点总结