oracle: 执行计划3--如何解读

 

本篇解释执行计划怎么解读。

举个例子:

 

1.   SQL> explain plan for  

2.     2  select a.name,b.name  

3.     3  from t1 a,t2 b  

4.     4  where a.id=b.id  

5.     5  and a.id='1';  

6.     

7.   Explained.  

8.     

9.   SQL> set lines 200  

10.  SQL> set pagesize 0  

11.  SQL> select * from table(dbms_xplan.display());  

12.  Plan hash value: 2680223496  

13.    

14.  --------------------------------------------------------------------------------------  

15.  | Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |  

16.  --------------------------------------------------------------------------------------  

17.  |   0 | SELECT STATEMENT             |       |     1 |    20 |     5   (0)| 00:00:01 |  

18.  |   1 |  NESTED LOOPS                |       |     1 |    20 |     5   (0)| 00:00:01 |  

19.  |   2 |   TABLE ACCESS BY INDEX ROWID| T1    |     1 |    10 |     1   (0)| 00:00:01 |  

20.  |*  3 |    INDEX UNIQUE SCAN         | T1_PK |     1 |       |     0   (0)| 00:00:01 |  

21.  |*  4 |   TABLE ACCESS FULL          | T2    |     1 |    10 |     4   (0)| 00:00:01 |  

22.  --------------------------------------------------------------------------------------  

23.    

24.  Predicate Information (identified by operation id):  

25.  ---------------------------------------------------  

26.    

27.     3 - access("A"."ID"=1)  

28.     4 - filter("B"."ID"=1)  

29.    

30.  17 rows selected.  

 

1       确定执行顺序

 

对于Oracle执行计划,在执行计划列表中,operation列中缩进最多的先执行(即靠右的先执行),缩进一样的(即并列的行)行从上往下执行

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

 

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

 

2       执行计划中各列的含义

Id: 每个操作的唯一序列号

Operation:每个操作的名称和方式

Name:操作对象

Rows:当前操作影响的行数

Bytes:当前操作的影响的数据量

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

Timeoracle计算出来的该操作花费的时间

 

3       执行计划中各行的关系

 

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

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

Id为2的操作是tableaccess by index rowed, name 是T1,表示它是通过索引的rowid来访问表T1的,而索引上rowid则需要通过其子操作3来获取。

Id为3的操作是indexunique scan,name 是T1_PK表面那是通过主键唯一键值来获取其父操作2需要的rowid。

Id为4的操作是tableaccess full, name是T2,表面是对T2做的全表扫描。

 

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

 

如上面的:

1.   Predicate Information (identified by operation id):  

2.   ---------------------------------------------------  

3.     

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

5.      4 - filter("B"."ID"=1)  

Access filter的区别:

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

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

你可能感兴趣的:(oracle,数据库)