本帖最后由 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、多表连接,哪个速度更快相关推荐

  1. 恢复oracle中误删除delete的数据、drop掉的表

    oracle误删除数据的恢复方法 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答 ...

  2. SQL连接两张相同或不同的表,使用 UNION 和 UNION ALL 操作符

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  3. python使用加号运算符可以连接两个字符串_如何在Python连接两个字符串

    如何在Python连接两个字符串 Python字符串是Unicode字符的集合. Python提供了许多内置函数来进行字符串操作.字符串串联是一个字符串与另一字符串合并时的过程.可以通过以下方式完成. ...

  4. Power Point 2016 画图时取消直线或箭头连接两个图形操作时的自动连接

    一.环境 1.Power Point 2016 2.Windows 10 二.问题描述 PPT 绘制矢量图时,用直线或箭头连接两个图形时,直线或箭头靠近两个图形时会自动连接到图形的各个边的中间位置,给 ...

  5. oracle中只存储两年数据,Oracle中作为永久存储机制的嵌套表的数据追加

    头几天有人问了一个问题: --创建类型minutiae create OR REPLACE type minutiae_t as object(x number(3,0),y number(3,0), ...

  6. oracle中 使用不了,Oracle 中不使用NOT IN 和 NOT EXISTS的另一种方法

    用LEFT JOIN 代替NOT IN 或 NOT EXISTS: SQL> conn scott/tiger Connected. SQL> CREATE TABLE testa 2  ...

  7. Oracle中的emp、dept、bonus及salgrade表的新建及MySQL中的三种注释形式

    /*下面会包含三种mysql的注释形式 1.#... 2."-- ..."(--后需加一个空格) 3.*/ #1.创建dept表;插入dept表中的值 CREATE TABLE d ...

  8. 在MySQL中创建Oracle中的dept、emp、bonus、salgrade表

    1. 创建dept表 CREATE TABLE `dept`(`deptno` INT(2) NOT NULL, `dname` VARCHAR(14),`loc` VARCHAR(13),CONST ...

  9. oracle串连接,Oracle中串连接符||的使用心得(个人见解)

    Oracle中可以用串连接符||将若干个串连在一起(Oracle中也可以使用concat函数,但是它只最多连接两个串.而MySQL中concat可以连接多个串.在SQL Server中则使用+进行串连 ...

  10. mysql导出oracle_如何将mysql中的表结构导出放入oracle中

    展开全部 将mysql中的表结构导出放入oracle中的方法: 1.导出mysql的表结构sql脚本,然后修改mysql中的数据类型为oracle中的数据类型: MySql与Oracle数据类型的62 ...

最新文章

  1. LSA 安装及管理应用程序
  2. Java dispose()函数窗口无法关闭
  3. 【快乐水题】1816. 截断句子
  4. repeater 的解释说明 用法
  5. 【第二十七章】 springboot + zipkin(brave-okhttp实现)
  6. RDIFramework.NET — 系列目录 — 基于.NET的快速信息化系统开发框架
  7. linux内核中TCP接收的实现
  8. mui实现手机web前端拍照_Web前端中的常见技术名称及所实现的功能
  9. 安装教程之JDK下载与安装_更新2022
  10. TASKCTL连接不到服务端的几种情况和解决办法
  11. CAJ浏览器看论文如何设置背景为护眼色
  12. java应用程序由若干个_Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。...
  13. uniapp判断是不是微信浏览器
  14. 激活Windows Server 2003 2008终端授权服务器
  15. android 6.1 app闪退,手机软件闪退怎么办 具体解决方法【图文】
  16. 前端网页设计内容二《电商平台网站》
  17. 2022年3,4月份期间UE虚幻引擎的避坑指南
  18. mysql关联删除(删除不存在另一张表的记录)
  19. vue.runtime.esm.js:620 [Vue warn]: Error in nextTick: “TypeError: Cannot convert object to primitive
  20. 判断输入是否为电话号码

热门文章

  1. z变换判断稳定性和因果性_图像处理的仿射变换与透视变换
  2. React之类式组件
  3. emlog_toolkit.php,emlog 4.0版本IIS6下伪静态划定规矩
  4. php 生成树,PHP超牛逼无限极分类生成树方法
  5. oracle昨日时间,。。今日,昨日,上周,本月,本年,按时间统计总金额
  6. idea直接打开html报404,idea部署Tomcat启动成功了但是页面出现404
  7. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
  8. 数字滚动_告别单调!让PPT数字滚动起来。
  9. 项目助理这个工作怎么样_分析微信清理僵尸粉这个项目怎么样?
  10. 倒N字形排列java_Java排序8大算法实现