oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快
本帖最后由 ghsau 于 2011-10-11 23:39 编辑
请看下面三个执行计划(Oracle10g)
1. 用IN
SQL> select ename from emp e where e.deptno in (select d.deptno from dept d where d.dname='SALES');
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 351108634
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 105 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 5 | 105 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | EMP | 14 | 126 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID | DEPT | 1 | 12 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("D"."DNAME"='SALES')
4 - access("E"."DEPTNO"="D"."DEPTNO")
2. 用EXISTS
SQL> select e.ename from emp e where exists (select 1 from dept d where e.deptno=d.deptno and d.dname='SALES');
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 90266402
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 105 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS SEMI | | 5 | 105 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | EMP | 14 | 126 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 12 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("D"."DNAME"='SALES')
4 - access("E"."DEPTNO"="D"."DEPTNO")
3. 用连接
SQL> select e.ename from emp e join dept d on e.deptno=d.deptno where d.dname='SALES';
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 351108634
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 105 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 5 | 105 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | EMP | 14 | 126 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID | DEPT | 1 | 12 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("D"."DNAME"='SALES')
4 - access("E"."DEPTNO"="D"."DEPTNO")
按我来看,正常的执行效率应该是3>2>1,但是竟然产生了三个一模一样的执行计划,我原来看过的一个文档是这样说得:
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了复制代码这是其一,在执行计划里没有体现其二:我们通常是自己选择优化器,还是用Oracle默认的优化器呢?
其三:Oracle10g有三种优化器,CHOOSE/COST/RULE,默认为CHOOSE,当表被analyze过时,选择COST,否则选择RULE,但是ORACLE10g默认分析表的,这里比较迷惑,求解
oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快相关推荐
- 恢复oracle中误删除delete的数据、drop掉的表
oracle误删除数据的恢复方法 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答 ...
- SQL连接两张相同或不同的表,使用 UNION 和 UNION ALL 操作符
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...
- python使用加号运算符可以连接两个字符串_如何在Python连接两个字符串
如何在Python连接两个字符串 Python字符串是Unicode字符的集合. Python提供了许多内置函数来进行字符串操作.字符串串联是一个字符串与另一字符串合并时的过程.可以通过以下方式完成. ...
- Power Point 2016 画图时取消直线或箭头连接两个图形操作时的自动连接
一.环境 1.Power Point 2016 2.Windows 10 二.问题描述 PPT 绘制矢量图时,用直线或箭头连接两个图形时,直线或箭头靠近两个图形时会自动连接到图形的各个边的中间位置,给 ...
- oracle中只存储两年数据,Oracle中作为永久存储机制的嵌套表的数据追加
头几天有人问了一个问题: --创建类型minutiae create OR REPLACE type minutiae_t as object(x number(3,0),y number(3,0), ...
- oracle中 使用不了,Oracle 中不使用NOT IN 和 NOT EXISTS的另一种方法
用LEFT JOIN 代替NOT IN 或 NOT EXISTS: SQL> conn scott/tiger Connected. SQL> CREATE TABLE testa 2 ...
- Oracle中的emp、dept、bonus及salgrade表的新建及MySQL中的三种注释形式
/*下面会包含三种mysql的注释形式 1.#... 2."-- ..."(--后需加一个空格) 3.*/ #1.创建dept表;插入dept表中的值 CREATE TABLE d ...
- 在MySQL中创建Oracle中的dept、emp、bonus、salgrade表
1. 创建dept表 CREATE TABLE `dept`(`deptno` INT(2) NOT NULL, `dname` VARCHAR(14),`loc` VARCHAR(13),CONST ...
- oracle串连接,Oracle中串连接符||的使用心得(个人见解)
Oracle中可以用串连接符||将若干个串连在一起(Oracle中也可以使用concat函数,但是它只最多连接两个串.而MySQL中concat可以连接多个串.在SQL Server中则使用+进行串连 ...
- mysql导出oracle_如何将mysql中的表结构导出放入oracle中
展开全部 将mysql中的表结构导出放入oracle中的方法: 1.导出mysql的表结构sql脚本,然后修改mysql中的数据类型为oracle中的数据类型: MySql与Oracle数据类型的62 ...
最新文章
- LSA 安装及管理应用程序
- Java dispose()函数窗口无法关闭
- 【快乐水题】1816. 截断句子
- repeater 的解释说明 用法
- 【第二十七章】 springboot + zipkin(brave-okhttp实现)
- RDIFramework.NET — 系列目录 — 基于.NET的快速信息化系统开发框架
- linux内核中TCP接收的实现
- mui实现手机web前端拍照_Web前端中的常见技术名称及所实现的功能
- 安装教程之JDK下载与安装_更新2022
- TASKCTL连接不到服务端的几种情况和解决办法
- CAJ浏览器看论文如何设置背景为护眼色
- java应用程序由若干个_Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。...
- uniapp判断是不是微信浏览器
- 激活Windows Server 2003 2008终端授权服务器
- android 6.1 app闪退,手机软件闪退怎么办 具体解决方法【图文】
- 前端网页设计内容二《电商平台网站》
- 2022年3,4月份期间UE虚幻引擎的避坑指南
- mysql关联删除(删除不存在另一张表的记录)
- vue.runtime.esm.js:620 [Vue warn]: Error in nextTick: “TypeError: Cannot convert object to primitive
- 判断输入是否为电话号码
热门文章
- z变换判断稳定性和因果性_图像处理的仿射变换与透视变换
- React之类式组件
- emlog_toolkit.php,emlog 4.0版本IIS6下伪静态划定规矩
- php 生成树,PHP超牛逼无限极分类生成树方法
- oracle昨日时间,。。今日,昨日,上周,本月,本年,按时间统计总金额
- idea直接打开html报404,idea部署Tomcat启动成功了但是页面出现404
- 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
- 数字滚动_告别单调!让PPT数字滚动起来。
- 项目助理这个工作怎么样_分析微信清理僵尸粉这个项目怎么样?
- 倒N字形排列java_Java排序8大算法实现