解读Oracle执行计划

本篇解释执行计划中基本项的含义

关于生成和显示Oracle执行计划的方法请阅读

http://blog.csdn.net/laoshangxyc/article/details/8629123

下面举例进行解释

SQL> explain plan for
  2  select a.name,b.name
  3  from t1 a,t2 b
  4  where a.id=b.id
  5  and a.id='1';

Explained.

SQL> set lines 200
SQL> set pagesize 0
SQL> select * from table(dbms_xplan.display());
Plan hash value: 2680223496

--------------------------------------------------------------------------------------
| Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |       |     1 |    20 |     5   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |       |     1 |    20 |     5   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T1    |     1 |    10 |     1   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN         | T1_PK |     1 |       |     0   (0)| 00:00:01 |
|*  4 |   TABLE ACCESS FULL          | T2    |     1 |    10 |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("A"."ID"=1)
   4 - filter("B"."ID"=1)

17 rows selected.
对于Oracle执行计划,并列的行从上往下执行,非并列的行,靠右的先执行。

例如本例中:

id为3的操作最靠右,所以最先执行,其次是id为2和4的操作较靠右,而且并列,那么按照并列从上往下执行的原则,id为2的操作比id为4的操作先执行。

然后执行id为1的操作。

那么本例中执行计划按id排序为 3>2>4>1

---------------------------------------------------------------------------------------------------------------

本例中使用的DBMS_XPLAY显示的执行计划,其中:

id:为每个操作的唯一序列号,

operation:为每个操作的名称和方式,

name:是操作对象

Rows:Oracle估算当前操作影响的行数

bytes:Oracle估算当前操作的影响的数据量(单位byte)

Cost:Oracle计算出来的执行该操作的代价

Time:Oracle估算出来的该操作花费的时间

-----------------------------------------------------------------------------------------------------------------

id为0的操作为SELECT STATEMENT表示这条语句的类型为一条select语句,而非一个真实的操作。

id为1的操作表示它需要对id为2和4的操作得来的结果集以嵌套循环的方式进行数据关联。

id为2的操作是TABLE ACCESS BY INDEX ROWID,name是T1,表示它是通过索引的ROWID来访问表T1的。而索引上的ROWID则需要通过其子操作3来获取。

id为3的操作是INDEX UNIQUE SCAN,name是T1_PK表明那是通过主键唯一键值来获取其父操作2需要的Rowid。

id为4的操作是TABLE ACCESS FULL,name是T2,表明是对T2做的一个全表扫描。

注意:id为3和4的前面有*,表示这个操作有谓词条件:访问条件(access)或过滤条件(filter)

如上面的

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("A"."ID"=1)
   4 - filter("B"."ID"=1)

访问条件access和过滤条件filter的区别

访问条件是帮助操作在对象上定位到符合条件的数据,然后再读取数据。

过滤条件是操作已经从对象上获取了数据,然后根据条件将不符合要求的数据过滤掉。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值