在oracle11g中执行计划的显示结果:

按照the rightmost-uppermost(最右最上) operation of an explain 规则来分析执行计划。
在oracle9i中执行计划如下分析:

SQL> select ename,dname from emp, dept
where emp.deptno=dept.deptno and dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');
  
  Execution Plan
  ----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE
  1  0  NESTED LOOPS
  2  1   TABLE ACCESS (FULL) OF 'EMP'
  3  1   TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
  4  3    INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
  
  关于前面的两个数字,第一个是状态ID,第二个是父ID。
  
  就是如下所示:0-->1-->2
             |
             |-->3-->4
  在上图里,0的执行依靠1,1的执行又依赖2和3,2是没有子ID的,所以2最先执行,然后是4,在然后是3;然后2和3的结果传回1。

一、什么是执行计划
An explain plan is a representation of the access path that is taken when a query is executed within Oracle.

二、如何访问数据
At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:
Full Table Scan (FTS)    --全表扫描
Index Lookup (unique & non-unique)    --索引扫描(唯一和非唯一)
Rowid    --物理行id

三、执行计划层次关系
When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行
1.看一个简单的例子:
Query Plan
-----------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1234
**TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED] --[:Q65001]表示是并行方式,[ANALYZED]表示该对象已经分析过了
优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO:
SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采用CBO
SELECT STATEMENT [CHOOSE] Cost= --Cost为空,采用RBO
2.层次的父子关系,看比较复杂的例子:

PARENT1
**FIRST CHILD
****FIRST GRANDCHILD
**SECOND CHILD
Here the same principles apply, the FIRST GRANDCHILD is the initial operation then the FIRST CHILD followed by the SECOND CHILD and finally the PARENT collates the output.

四、例子解说
Execution Plan
----------------------------------------------------------
0 **SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
1 0 **HASH JOIN (Cost=3 Card=8 Bytes=248)
2 1 ****TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=36)
3 1 ****TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=16 Bytes=304) 
左侧的两排数据,前面的是序列号ID,后面的是对应的PID(父ID)。
A shortened summary of this is:
Execution starts with ID=0: SELECT STATEMENT but this is dependand on it's child objects
So it executes its first child step: ID=1 PID=0 HASH JOIN but this is dependand on it's child objects
So it executes its first child step: ID=2 PID=1 TABLE ACCESS (FULL) OF 'DEPT'
Then the second child step: ID=3 PID=2 TABLE ACCESS (FULL) OF 'EMP'
Rows are returned to the parent step(s) until finished

五、表访问方式
1.Full Table Scan (FTS) 全表扫描
In a FTS operation, the whole table is read up to the high water mark (HWM). The HWM marks the last block in the table that has ever had data written to it. If you have deleted all the rows then you will still read up to the HWM. Truncate resets the HWM back to the start of the table. FTS uses multiblock i/o to read the blocks from disk.   --全表扫描模式下会读数据到表的高水位线(HWM即表示表曾经扩展的最后一个数据块),读取速度依赖于Oracle初始化参数db_block_multiblock_read_count
Query Plan
------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
**INDEX UNIQUE SCAN EMP_I1   --如果索引里就找到了所要的数据,就不会再去访问表了
2.Index Lookup 索引扫描
There are 5 methods of index lookup:
index unique scan   --索引唯一扫描
Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index. 
eg:
SQL> explain plan for select empno,ename from emp where empno=10;

index range scan   --索引局部扫描
Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) .
eg:
SQL> explain plan for select mgr from emp where mgr = 5;
index full scan   --索引全局扫描
Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order. 
eg: 
SQL> explain plan for select empno,ename from big_emp order by empno,ename;
index fast full scan   --索引快速全局扫描,不带order by情况下常发生
Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index. 
eg: 
SQL> explain plan for select empno,ename from big_emp;

index skip scan   --索引跳跃扫描,where条件列是非索引的前导列情况下常发生
Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.
eg:
SQL> create index i_emp on emp(empno, ename);
SQL> select /*+ index_ss(emp i_emp)*/ job from emp where ename='SMITH';
3.Rowid 物理ID扫描
This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式

六、表连接方式
有三种连接方式:
1.Sort Merge Join (SMJ)    --由于sort是非常耗资源的,所以这种连接方式要避免
Rows are produced by Row Source 1 and are then sorted Rows from Row Source 2 are then produced and sorted by the same sort key as Row Source 1. Row Source 1 and 2 are NOT accessed concurrently. 
SQL> explain plan for
select /*+ ordered */ e.deptno,d.deptno
from emp e,dept d
where e.deptno = d.deptno
order by e.deptno,d.deptno;

Query Plan
-------------------------------------
SELECT STATEMENT [CHOOSE] Cost=17
**MERGE JOIN
****SORT JOIN
******TABLE ACCESS FULL EMP [ANALYZED]
****SORT JOIN
******TABLE ACCESS FULL DEPT [ANALYZED]
Sorting is an expensive operation, especially with large tables. Because of this, SMJ is often not a particularly efficient join method.
2.Nested Loops (NL)    --比较高效的一种连接方式
Fetches the first batch of rows from row source 1, Then we probe row source 2 once for each row returned from row source 1.
For nested loops to be efficient it is important that the first row source returns as few rows as possible as this directly controls the number of probes of the second row source. Also it helps if the access method for row source 2 is efficient as this operation is being repeated once for every row returned by row source 1.
SQL> explain plan for
select a.dname,b.sql
from dept a,emp b
where a.deptno = b.deptno;
Query Plan
-------------------------
SELECT STATEMENT [CHOOSE] Cost=5
**NESTED LOOPS
****TABLE ACCESS FULL DEPT [ANALYZED]
****TABLE ACCESS FULL EMP [ANALYZED]
3.Hash Join    --最为高效的一种连接方式
New join type introduced in 7.3, More efficient in theory than NL & SMJ, Only accessible via the CBO. Smallest row source is chosen and used to build a hash table and a bitmap The second row source is hashed and checked against the hash table looking for joins. The bitmap is used as a quick lookup to check if rows are in the hash table and are especially useful when the hash table is too large to fit in memory.
SQL> explain plan for
select /*+ use_hash(emp) */ empno
from emp,dept
where emp.deptno = dept.deptno;
Query Plan
----------------------------
SELECT STATEMENT [CHOOSE] Cost=3
**HASH JOIN
****TABLE ACCESS FULL DEPT
****TABLE ACCESS FULL EMP
Hash joins are enabled by the parameter HASH_JOIN_ENABLED=TRUE in the init.ora or session. TRUE is the default in 7.3.
3.Cartesian Product    --卡迪尔积,不算真正的连接方式,sql肯定写的有问题
A Cartesian Product is done where they are no join conditions between 2 row sources and there is no alternative method of accessing the data. Not really a join as such as there is no join! Typically this is caused by a coding mistake where a join has been left out.
It can be useful in some circumstances - Star joins uses cartesian products.Notice that there is no join between the 2 tables:
SQL> explain plan for
select emp.deptno,dept,deptno
from emp,dept
Query Plan
------------------------------
SLECT STATEMENT [CHOOSE] Cost=5
**MERGE JOIN CARTESIAN
****TABLE ACCESS FULL DEPT
****SORT JOIN
******TABLE ACCESS FULL EMP
The CARTESIAN keyword indicate that we are doing a cartesian product. 
七、运算符
1.sort    --排序,很消耗资源
There are a number of different operations that promote sorts:
order by clauses
group by
sort merge join
2.filter    --过滤,如not in、min函数等容易产生
Has a number of different meanings, used to indicate partition elimination, may also indicate an actual filter step where one row source is filtering, another, functions such as min may introduce filter steps into query plans.
3.view    --视图,大都由内联视图产生
When a view cannot be merged into the main query you will often see a projection view operation. This indicates that the 'view' will be selected from directly as opposed to being broken down into joins on the base tables. A number of constructs make a view non mergeable. Inline views are also non mergeable.
eg: 
SQL> explain plan for
select ename,tot
from emp,(select empno,sum(empno) tot from big_emp group by empno) tmp
where emp.empno = tmp.empno;
Query Plan
------------------------
SELECT STATEMENT [CHOOSE]
**HASH JOIN
**TABLE ACCESS FULL EMP [ANALYZED]
**VIEW
****SORT GROUP BY
******INDEX FULL SCAN BE_IX 
4.partition view     --分区视图
Partition views are a legacy technology that were superceded by the partitioning option. This section of the article is provided as reference for such legacy systems.

[转]怎样看懂Oracle的执行计划相关推荐

  1. 怎样看懂Oracle的执行计划

    尽量用鸟语描述了,翻译成中文反而容易误解. 一.什么是执行计划 An explain plan is a representation of the access path that is taken ...

  2. oracle sql 执行计划分析_《真正读懂Oracle SQL执行计划》

    maclean_0071人评论1235人阅读2013-10-25 15:18:12 [视频教学:性能优化]Maclean Liu的Oracle性能优化讲座第一回<真正读懂Oracle SQL执行 ...

  3. 如何看懂Postgres的执行计划

    如何看懂Postgres的执行计划test=# insert into test select id from (select generate_series(1,10000000))ids(id); ...

  4. 查看正在执行的事务_看懂sql_trace--分析执行计划及CBO行为

    概述 Oracle数据库排查问题.实验测试.优化的时候一般都会用到trace文件来分析,这里面就涉及到sql_trace跟10046事件了,下面分别做一下介绍. SQL_TRACE SQL_TRACE ...

  5. MySQL进阶之路(二十)—— 5分钟看懂SQL的执行计划

    5分钟看SQL的执行计划 一.概述 ​ 如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引.用的是什么索引.是否 ...

  6. 学习如何看懂SQL Server执行计划(三)——连接查询篇

    三.连接查询部分 --------------------嵌套循环-------------------- /* UserInfo表数据少.Coupon表数据多 嵌套循环可以理解为就是两层For循环, ...

  7. mysql执行计划缓存在哪_怎么去看懂mysql的执行计划

    mysql的查看执行计划的语句很简单,explain+你要执行的sql语句就OK了. 举一个例子 EXPLAIN SELECT * from employees where employees.gen ...

  8. [Hive]看懂Hive的执行计划

    关于Hive执行计划简述 一般执行计划有两个部分:  stage dependencies 各个stage之间的依赖性  stage plan 各个stage的执行计划 一个stage并不一定是一个M ...

  9. 看懂Oracle执行计划(转载)

    转载自 写的很好,屯一波 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Or ...

最新文章

  1. 分享你的见解与经验|RocketMQ Summit 2022 议题征集中
  2. mysql怎么使用sql语句查看表的编码_MySQL中使用SQL语句查看某个表的编码
  3. VTK:图像投射用法实战
  4. T-SQL备忘(6):常用内置函数
  5. python cmp函数未定义_python用plt画图时,cmp设置方法
  6. 如何保养与维护笔记本硬盘
  7. 微信支付curl: (60) SSL certificate problem: unable to get local issuer certificate 解决方法
  8. MySQL内核月报 2014.10-MySQL· 捉虫动态·binlog重放失败
  9. 精益生产理论学习总结(一)
  10. double类型判断是否相等
  11. mac DOSBox快捷键
  12. KDL简介---KDL、PyKDL、pykdl_utils之间关系
  13. screenX、clientX、pageX三者间的区别
  14. android 获取视频编码,Android视频编码
  15. [jQuery.FQcomputer] 分期商城汇率计算器
  16. SQL Server - 设置主键自增
  17. matlab设置图片背景透明_Matlab ---- 有透明度的png图像的显示与图层叠加方法
  18. 测试普通话水平的软件,求测试普通话标准的软件?6款普通话软件推荐
  19. leetcode 21.合并有序列表(js)
  20. React-Native之手势基础篇

热门文章

  1. VIM_shortcut_Cheat_sheet
  2. leetcode-237-删除链表中的节点
  3. linux 使用 FIO 测试磁盘的iops
  4. W: Possible missing firmware /lib/firmware/i915/bxt_guc_ver8_7.bin for module i915
  5. C/C++ strict-aliasing
  6. ●BZOJ 4556 [Tjoi2016Heoi2016]字符串
  7. Hash(4) hashtable,hashmap
  8. 面向对象编程(Object Oriented Programming)概念总结及延伸(一)
  9. 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)
  10. s6-7 TCP 传输策略