在我2014年總結的“SQL Tuning 基礎概述”中,其實已經介紹了一些查看SQL執行計划的方法,但是不夠系統和全面,所以本次SQL優化專題,就首先要系統的介紹一下查看SQL執行計划的方法。
本文示例SQL為:
--set lines 1000 pages 1000
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
-
3.dbms_xplan
3.1 dbms_xplan.display_cursor(null,null,'allstats last')
3.2 dbms_xplan.display_cursor('&sql_id',null,'advanced')
3.3 dbms_xplan.display_awr('&sql_id')
1.explain plan for SQL;
通過explain plan for命令查看SQL的執行計划,這種方法SQL並不真實執行,一般適用於 上線前的SQL預審,尤其對DML語句,由於SQL不執行,不用擔心對生產數據造成影響。這種方法查看的執行計划 有Predicate Information,無Statistics,查看到的執行計划不一定真實 ,第三方工具PL/SQL Developer中F5查看執行計划也是調用的這個方法。 使用explain plan for命令查看SQL的執行計划:explain plan for
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
select * from table(dbms_xplan.display);
示例如下:
JINGYU@jyzhao1 >explain plan for
2 select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
Explained.
Elapsed: 00:00:00.01
JINGYU@jyzhao1 >select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 74 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Note
-----
- dynamic sampling used for this statement (level=2)
20 rows selected.
Elapsed: 00:00:00.03
JINGYU@jyzhao1 >
2.set autotrace
通過set autotrace查看SQL的執行計划,這種方法SQL真實執行(除set autot trace exp針對select語句也不執行,但對DML語句還是會執行的),這種方法查看的執行計划 有Predicate Information,有Statistics,查看的執行計划是准確的(注意:如果SQL中包含有綁定變量,那么用該方法所獲取到的執行計划,也有可能不是真實的) 。但由於SQL需要真實執行,所以對於有綁定變量值的SQL,還需要輸入對應的變量值才可以執行,比較麻煩。 使用set autotrace查看SQL的執行計划:set autotrace on
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
set autotrace off
示例如下:
JINGYU@jyzhao1 >set autotrace on
JINGYU@jyzhao1 >select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
EMPNO ENAME DNAME JOB SAL
---------- ---------- -------------- --------- ----------
7788 SCOTT RESEARCH ANALYST 3000
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 74 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
7 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
814 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
JINGYU@jyzhao1 >set autotrace off
JINGYU@jyzhao1 >
3.dbms_xplan
dbms_xplan下面有很多函數可以調用,其中最常用的是display_cursor和display_awr函數,下面依次介紹。3.1 dbms_xplan.display_cursor(null,null,'allstats last')
通過dbms_xplan.display_cursor(null,null,'allstats last')查看SQL的執行計划,SQL會真實執行(對應的缺點不再贅述),這種方法查看的執行計划 有Predicate Information,無Statistics,查看的執行計划是准確的,並且有每一步真實處理行數和時間。 使用dbms_xplan.display_cursor(null,null,'allstats last')查看SQL的執行計划:--需要確認statistics_level設置為ALL,否則SQL語句第一個關鍵字后就需要加上/*+ gather_plan_statistics */,我習慣用前者
show parameter statistics_level(一般數據庫默認是TYPICAL)
alter session set statistics_level = ALL;
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
示例如下:
JINGYU@jyzhao1 >alter session set statistics_level = ALL;
Session altered.
JINGYU@jyzhao1 >select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
EMPNO ENAME DNAME JOB SAL
---------- ---------- -------------- --------- ----------
7788 SCOTT RESEARCH ANALYST 3000
JINGYU@jyzhao1 >select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 39dv3d8jkzyuw, child number 1
-------------------------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 7 | | | |
|* 1 | HASH JOIN | | 1 | 1 | 1 |00:00:00.01 | 7 | 1214K| 1214K| 762K (0)|
|* 2 | TABLE ACCESS FULL| EMP | 1 | 1 | 1 |00:00:00.01 | 3 | | | |
| 3 | TABLE ACCESS FULL| DEPT | 1 | 4 | 4 |00:00:00.01 | 4 | | | |
----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Note
-----
- dynamic sampling used for this statement (level=2)
26 rows selected.
JINGYU@jyzhao1 >
3.2 dbms_xplan.display_cursor('&sql_id',null,'advanced')
通過dbms_xplan.display_cursor('&sql_id',null,'advanced')查看SQL的執行計划,這種方法查看的執行計划 有Predicate Information,無Statistics,SQL是數據庫中之前真實執行過的,對應執行計划是之前SQL真實執行過的執行計划,是准確的。使用這種方法的前提是需要SQL的cursor沒有被刷出shared pool,否則查不到結果。 使用dbms_xplan.display_cursor('&sql_id',null,'advanced')查看SQL的執行計划:--查詢sql_id
select sql_id, sql_text from v$sql where sql_text like 'select a.empno%';
39dv3d8jkzyuw
--根據查詢的sql_id查看執行計划
select * from table(dbms_xplan.display_cursor('&sql_id',null,'advanced'));
--附:函數DISPLAY_CURSOR的參數說明
FUNCTION DISPLAY_CURSOR RETURNS DBMS_XPLAN_TYPE_TABLE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SQL_ID VARCHAR2 IN DEFAULT
CURSOR_CHILD_NO NUMBER(38) IN DEFAULT
FORMAT VARCHAR2 IN DEFAULT
示例如下:
JINGYU@jyzhao1 >select * from table(dbms_xplan.display_cursor('&sql_id',null,'advanced'));
Enter value for sql_id: 39dv3d8jkzyuw
old 1: select * from table(dbms_xplan.display_cursor('&sql_id',null,'advanced'))
new 1: select * from table(dbms_xplan.display_cursor('39dv3d8jkzyuw',null,'advanced'))
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 39dv3d8jkzyuw, child number 0
-------------------------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
|* 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / A@SEL$1
3 - SEL$1 / B@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "A"@"SEL$1")
FULL(@"SEL$1" "B"@"SEL$1")
LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
USE_HASH(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=1) "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
2 - "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "A"."DEPTNO"[NUMBER,22]
3 - "B"."DEPTNO"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
Note
-----
- dynamic sampling used for this statement (level=2)
SQL_ID 39dv3d8jkzyuw, child number 1
-------------------------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
|* 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / A@SEL$1
3 - SEL$1 / B@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "A"@"SEL$1")
FULL(@"SEL$1" "B"@"SEL$1")
LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
USE_HASH(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=1) "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
2 - "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "A"."DEPTNO"[NUMBER,22]
3 - "B"."DEPTNO"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
Note
-----
- dynamic sampling used for this statement (level=2)
SQL_ID 39dv3d8jkzyuw, child number 2
-------------------------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
|* 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / A@SEL$1
3 - SEL$1 / B@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "A"@"SEL$1")
FULL(@"SEL$1" "B"@"SEL$1")
LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
USE_HASH(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
2 - filter("EMPNO"=7788)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=1) "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
2 - "EMPNO"[NUMBER,22], "A"."ENAME"[VARCHAR2,10],
"A"."JOB"[VARCHAR2,9], "A"."SAL"[NUMBER,22], "A"."DEPTNO"[NUMBER,22]
3 - "B"."DEPTNO"[NUMBER,22], "B"."DNAME"[VARCHAR2,14]
Note
-----
- dynamic sampling used for this statement (level=2)
177 rows selected.
JINGYU@jyzhao1 >
由於上面沒有指定CURSOR_CHILD_NO,所以全部都會顯示出來,當然也可以指定某個CURSOR_CHILD_NO,比如說:
select * from table(dbms_xplan.display_cursor('&sql_id',0,'advanced'));
這樣結果就只會顯示CURSOR_CHILD_NO=0的執行計划。
3.3 dbms_xplan.display_awr('&sql_id')
通過dbms_xplan.display_awr('&sql_id')查看SQL的執行計划,這種方法查看的執行計划 無Predicate Information,無Statistics,查看的執行計划是准確的。如果對應SQL沒有被抓取到AWR中,就查不到結果。 使用dbms_xplan.display_awr('&sql_id')查看SQL的執行計划:--查詢sql_id
39dv3d8jkzyuw
--根據查詢的sql_id查看執行計划
select * from table(dbms_xplan.display_awr('&sql_id'));
--附:函數DISPLAY_AWR的參數說明
FUNCTION DISPLAY_AWR RETURNS DBMS_XPLAN_TYPE_TABLE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SQL_ID VARCHAR2 IN
PLAN_HASH_VALUE NUMBER(38) IN DEFAULT
DB_ID NUMBER(38) IN DEFAULT
FORMAT VARCHAR2 IN DEFAULT
示例如下:
JINGYU@jyzhao1 >select * from table(dbms_xplan.display_awr('&sql_id'));
Enter value for sql_id: 39dv3d8jkzyuw
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
SQL_ID 39dv3d8jkzyuw
--------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
| 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
20 rows selected.
JINGYU@jyzhao1 >
也可以加參數顯示更多的信息,比如可以顯示出Outline Data,但沒有Predicate Information,沒有Statistics:
JINGYU@jyzhao1 >select * from table(dbms_xplan.display_awr('&sql_id',NULL,NULL,'advanced'));
Enter value for sql_id: 39dv3d8jkzyuw
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
SQL_ID 39dv3d8jkzyuw
--------------------
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where
a.deptno = b.deptno and empno = 7788
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
| 1 | HASH JOIN | | 1 | 74 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 1 | 52 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / A@SEL$1
3 - SEL$1 / B@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "A"@"SEL$1")
FULL(@"SEL$1" "B"@"SEL$1")
LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
USE_HASH(@"SEL$1" "B"@"SEL$1")
END_OUTLINE_DATA
*/
Note
-----
- dynamic sampling used for this statement (level=2)
44 rows selected.
JINGYU@jyzhao1 >
4.awrsqrpt
通過awrsqrpt查看SQL的執行計划,這種方式是導出SQL的awr報告,這種方法查看的執行計划 無Predicate Information,但有Statistics,並且同時包含SQL單次和整體的統計信息,查看的執行計划是准確的。 使用awrsqrpt查看SQL的執行計划: @?/rdbms/admin/awrsqrptSpecify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 240
Begin Snapshot Id specified: 240
Enter value for end_snap: 244
End Snapshot Id specified: 244
Specify the SQL Id
~~~~~~~~~~~~~~~~~~
Enter value for sql_id: 39dv3d8jkzyuw
SQL ID specified: 39dv3d8jkzyuw
...
Report written to awrsqlrpt_1_240_244.html
這種執行計划的顯示結果如下圖:
5.10046 event
通過10046 event的跟蹤文件查看SQL的執行計划,這種方法查看的 執行計划是准確的,語句中函數,遞歸調用都會被詳細列出,但沒有謂詞信息,而且這種方法獲取執行計划比較麻煩。 使用10046 event查看SQL的執行計划:alter session set events '10046 trace name context forever, level 12';
select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
alter session set events '10046 trace name context off';
--使用tkprof美化10046 event的跟蹤文件,使其更易讀:
tkprof jyzhao1_ora_14139.trc jyzhao1_ora_14139.txt sys=no
示例如下:
JINGYU@jyzhao1 >alter session set events '10046 trace name context forever, level 12';
Session altered.
JINGYU@jyzhao1 >select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788;
EMPNO ENAME DNAME JOB SAL
---------- ---------- -------------- --------- ----------
7788 SCOTT RESEARCH ANALYST 3000
JINGYU@jyzhao1 >alter session set events '10046 trace name context off';
Session altered.
--使用tkprof美化10046 event的跟蹤文件相關內容如下:
SQL ID: 39dv3d8jkzyuw Plan Hash: 1123238657
select a.empno, a.ename, b.dname, a.job, a.sal
from
emp a, dept b where a.deptno = b.deptno and empno = 7788
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.02 0 8 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 7 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.02 0 15 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 91
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
1 1 1 HASH JOIN (cr=7 pr=0 pw=0 time=274 us cost=6 size=74 card=1)
1 1 1 TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=67 us cost=3 size=52 card=1)
4 4 4 TABLE ACCESS FULL DEPT (cr=4 pr=0 pw=0 time=15 us cost=3 size=88 card=4)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
SQL*Net message from client 2 6.55 6.56
********************************************************************************
關於閱讀這個tkprof美化后文件的方法可以參考MOS文檔:
- TKProf Interpretation (9i and above) (文檔 ID 760786.1)