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默认分析表的,这里比较迷惑,求解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...

据了解,很多中大型企事业单位的IT基础结构具有复杂、分散等特征,并且信息化程度越高,数据类型越繁杂,数据量也越庞大。许多单位不得不付出极大的人力、物力对网络进行管理。而一个单位的信息化的程度和IT部门的服务水平&#xff0…

oracle迁移undo表空间,oracle切换undo表空间

Oracle里的回滚表空间在数据库使用一段时间后,undo表空间的dbf文件往往会增长到比较大,这个时候我们需要切换undo表空间1.新建undo表空间SQL> create undo tablespace undotbs2 datafile /data/undotbs02.dbf size 10M autoextend on next 10M ;2.由于…

pppoe linux 配置文件,linux PPPOE服务端配置

查看pppo服务器安装包pm -qa | grep pppoe 可以看到系统中pppoe server安装包rpm -ql rp-pppoe-3.5-2 查看该安装包安装信息(如安装路径,配置文件等),如果有信息输出,你可以看到这一行:/sbin/pppoe-serverps -e | grep pppoe-serve 查看pppoe服务有没有运行,如果没有,则启动: p…

设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置

CentOS下PPPoE拨号设置1.查看并安装拨号软件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

Linux操作系统网络编程--原始套接字 (1)http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章 里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写…

linux上pyenv卸载,在Ubuntu 18.04系统下安装pyenv的方法

本文介绍在Ubuntu 18.04操作系统下安装pyenv的方法,使用它可以进行Python多版本管理,目的是防止不同的Python版本因为不兼容而出现错误。安装pyenv其实非常的简单,只需要在系统终端中运行一条命令即可,以下是操作方法,…

linux防火墙作用是什么,Linux防火墙操作1

什么是防火墙防火墙可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。简单来讲 就是防止外界通过网络攻击Linux服务器的一个软件本次学习目标:防火墙的启停&#xff0…

linux中touch命令的作用,Linux中touch命令的作用是什么

今天微子网络向你展示了触摸命令在Linux中的功能。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。linux的Touch命令不常用,但在使用make时可能会用到,make用于修改文件时间戳或创建一个不存在的新文…

linux打jar包xml文件,springboot打jar包部署外置配置文件

一、读取配置文件的优先级默认:Jar包同级目录的config目录Jar包同级目录classPath(即resources目录)的config目录classpath目录最高优先级的方式是项目启动时通过命令的方式指定项目加载核心配置文件,命令如下java –jar xxxx.jar -Dspring.config.locat…

linux将视频导入到iphone,如何将 IPhone 的文件导入 Linux

如何将 IPhone 的文件导入 Linux完全免费方案。方法一: 使用 Koder 的 Local File Access 功能这方法不需要在 Linux 端做任何配置。IPhone 端安装 koder进入应用 Koder点击右下角的 Settings进入 Local File Access选择 Enable Local File Access你可以看到一个链接…

lede 自定义linux,OpenWrt 和 LEDE 宣布正式合并

OpenWrt 和 LEDE 项目已在官网正式宣布合并,合并后的项目仍用 OpenWRT 命名。合并后的 OpenWrt 项目将按照 LEDE 制定的规范进行管理。原有的 LEDE 和 OpenWrt 项目的活跃成员将继续在合并后的 OpenWrt 上工作。LEDE 项目是 OpenWrt 的一个衍生项目,曾被…

centos系统linux复制命令行,linux系统CentOS7中find命令使用

一、作用查找文件或目录二、参数(常用)-atime 查找在指定时间曾被存取过的目录或文件,单位以24小时计算。(访问时间,执行文件等)-ctime 查找指定时间曾被更改的目录或文件,单位以24小时计算。(文件权限,用户组等等)-mtime 查看指定…

旧衣回收小程序搭建有什么优势?

今年以来,旧衣回收行业分外火热,不断有创业者进入到市场中,其中不乏有年轻人,足以可见行业的火爆。 我国是人口大国,每个人闲置的衣物加在一起的数量难以计算,旧衣回收行业具有巨大的发展空间。 此外&…

c语言程序兔子反之问题,C语言解决兔子产子问题代码及解析

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?问题分析兔子数的规律,如下表所示:月数小兔子对数中…

c语言程序设计数据存储方案,c语言程序设计“第02章数据的存储及运算.ppt

[Return] 第2章 数据的存储与运算 2.1 常量和变量 2.2 整型数据 2.3 实型数据 2.4 字符型数据 2.5 符号常量 2.6 算术运算符和算术表达式 2.7 C运算符和C表达式 [Return] 2.1 常量和变量 1 什么是常量? 在程序运行过过程中其值值不变变的量。 2 什么是变量&#xff…

6位密码锁的c语言编程,51单片机4*3矩阵键盘6位密码锁c语言程序

满意答案#include#include#define uchar unsigned charuchar key;int i0;char b[4]{0,0,0,0};//输入的密码放这里和初始的比较来判断是否密码正确void keyscan()//扫描按键是否按下{uchar temp;P30xfe;//扫描第一行tempP3;temptemp&0xf0;if(temp!0xf0)//判断按键是否按下{d…

c语言fork()创建线程,操作系统的创建原语是fork()还是creat()?

满意答案MythSwift2013.09.10采纳率:55% 等级:12已帮助:9461人一个进程就相当于一个主线程。fork一个进程与create一个线程的区别:fork进程:子进程复制父进程的进程环境。父进程结束不会影响子进程的运行。进程切换复制进程环境。create线…

android 最新 support,android support v7 下载-android support.v7包 官方最新版 - 河东下载站...

android support v7是一款功能非常实用的android在进行开发的过程中,必须要进行使用的一个包;这款软件作为一个功能非常全面的功能包,也是目前为止最新的功能包,是您这使用Android开发的时候,非常重要的一环&#xff1…

android aar jar制作,AndroidStudio aar、jar生成及其引用

aar生成新建项目,并在项目中新建Library module:banner,如图:在新建Module中编写完代码后,build整个工程后就会自动生成aar包,包的路径在新建Module 》 build 》outputs >aar目录下;aar引用在…

android 点击侧滑代码,代码分析Android实现侧滑菜单

Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单。最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout。1、实现效果2、动画类UgcAnimationspackage com.mmsx.base;import android.content.Context;import and…