本篇解释执行计划怎么解读。
举个例子:
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.
对于Oracle执行计划,在执行计划列表中,operation列中缩进最多的先执行(即靠右的先执行),缩进一样的(即并列的行)行从上往下执行。
在上面的例子中,id为3的操作最靠右,所以最先执行,其次是id为2和4的操作较靠右,而且并列,那么按照从上往下执行的原则,id为2的操作比id为4的操作先执行。然后执行id为1的操作。
那么本例的执行计划按id排序为 3>2>4>1
Id: 每个操作的唯一序列号
Operation:每个操作的名称和方式
Name:操作对象
Rows:当前操作影响的行数
Bytes:当前操作的影响的数据量
Cost:计算出来的执行该操作的代价
Time:oracle计算出来的该操作花费的时间
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的区别:
访问条件是帮助操作在对象上定位到符合条件的数据,然后再读取数据。
过滤条件是操作已经从对象上获取了数据,然后根据条件将不符合要求的数据过滤。