查看執行計劃的方法ios
D:\instantclient_12_2>sqlplus scott/tiger@clonepdb_plugsql
SQL*Plus: Release 12.2.0.1.0 Production on Fri Jan 12 13:54:31 2018數據庫
Copyright (c) 1982, 2016, Oracle. All rights reserved.session
Last Successful login time: Fri Jan 12 2018 11:18:59 +08:00分佈式
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Productionide
SCOTT@clonepdb_plug>set linesize 180
SCOTT@clonepdb_plug>set pagesize 0
SCOTT@clonepdb_plug>alter session set STATISTICS_LEVEL = ALL;工具
Session altered.優化
SCOTT@clonepdb_plug>select * from emp where ename='SMITH';
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20this
select * from emp where ename='SMITH'線程
Plan hash value: 3956160932
1 - filter("ENAME"='SMITH')
18 rows selected.
SCOTT@clonepdb_plug>
須要受權
grant select on v$session to scott;
grant select on v$sql to scott;
grant select on v_$sqlplan to scott;
grant select on v$sql_plan_statistics_all to scott;
Id 執行計劃中每個操做(行)的標識符。若是數字前面帶有星號,意味着將在隨後提供這行包含的謂詞信息
Operation 對應執行的操做。也叫行源操做
Name 操做的對象名稱
2.查詢優化器評估信息
Rows(E-Rows) 預估操做返回的記錄條數
Bytes(E-Bytes) 預估操做返回的記錄字節數
TempSpc 預估操做使用臨時表空間的大小
Cost(%CPU) 預估操做所需的開銷。在括號中列出了CPU開銷的百分比。注意這些值是經過執行計劃計算出來的。換句話說,父操做的開銷包含子操做的開銷
Time 預估執行操做所須要的時間(HH:MM:SS)
3.分區(僅當訪問分區表時下列字段可見)
Pstart 訪問的第一個分區。若是解析時不知道是哪一個分區就設爲KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
Pstop 訪問的最後一個分區。若是解析時不知道是哪一個分區就設爲KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
4.並行和分佈式處理(僅當使用並行或分佈式操做時下列字段可見)
Inst 在分佈式操做中,指操做使用的數據庫連接的名字
TQ 在並行操做中,用於從屬線程間通訊的表隊列
IN-OUT 並行或分佈式操做間的關係
PQ Distrib 在並行操做中,生產者爲發送數據給消費者進行的分配
5.運行時統計(當設定參數statistics_level爲all或使用gather_plan_statistics提示時,下列字段可見)
Starts 指定操做執行的次數
A-Rows 操做返回的真實記錄數
A-Time 操做執行的真實時間(HH:MM:SS.FF)
6.I/O 統計(當設定參數statistics_level爲all或使用gather_plan_statistics提示時,下列字段可見)
Buffers 執行期間進行的邏輯讀操做數量
Reads 執行期間進行的物理讀操做數量
Writes 執行期間進行的物理寫操做數量
7.內存使用統計
OMem 最優執行所需內存的預估值
1Mem 一次經過(one-pass)執行所需內存的預估值
0/1/M 最優/一次經過/屢次經過(multipass)模式操做執行的次數
Used-Mem 最後一次執行時操做使用的內存量
Used-Tmp 最後一次執行時操做使用的臨時空間大小。這個字段必須擴大1024倍才能和其餘衡量內存的字段一致(好比,32k意味着32MB)
Max-Tmp 操做使用的最大臨時空間大小。這個字段必須擴大1024倍才能和其餘衡量內存的字段一致(好比,32k意味着32MB)
例
SCOTT@clonepdb_plug>explain plan for
2 select * from emp e,dept d
3 where e.deptno=d.deptno
4 and e.ename='SMITH';
Explained.
3 - SEL$1 / E@SEL$1 -E@SEL$1,對應到執行計劃中的操做ID爲3上,即在表E上的查詢,E爲別名,下面類同 SEL$爲select 的縮寫,位於塊1,相應的還有DEL$,INS$,UPD$等
4 - SEL$1 / D@SEL$1
5 - SEL$1 / D@SEL$1
/+
BEGIN_OUTLINE_DATA
NLJ_BATCHING(@"SEL$1" "D"@"SEL$1") --指示優化器以嵌套循環關聯預提取的方式訪問表
USE_NL(@"SEL$1" "D"@"SEL$1") --使用USE_NL提示,即嵌套循環
LEADING(@"SEL$1" "E"@"SEL$1" "D"@"SEL$1") --指明前導表
INDEX(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO"))-指明對於D上的訪問方式爲使用索引
FULL(@"SEL$1" "E"@"SEL$1") --指明對於E上的訪問方式爲全表掃描 br/>OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('12.2.0.1')
OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
/
3 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")
1 - (#keys=0) "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10],
"E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7],
"E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22],
"D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13]
2 - (#keys=0) "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10],
"E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7],
"E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22],
"D".ROWID[ROWID,10], "D"."DEPTNO"[NUMBER,22]
3 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9],
"E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22],
"E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22]
4 - "D".ROWID[ROWID,10], "D"."DEPTNO"[NUMBER,22]
5 - "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13]
64 rows selected.
例
SCOTT@clonepdb_plug>select /+ gather_plan_statistics / * from emp e,dept d
2 where e.deptno=d.deptno
3 and e.ename='SMITH';
--注意此處增長了提示gather_plan_statistics而且該語句被執行 等同於alter session set STATISTICS_LEVEL = ALL;
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 20 RESEARCH
DALLAS
select /+ gather_plan_statistics / * from emp e,dept d
where e.deptno=d.deptno and e.ename='SMITH'
Plan hash value: 3625962092
3 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")
this is an adaptive plan
28 rows selected.
select /+ gather_plan_statistics / * from emp e,dept d
where e.deptno=d.deptno and rownum<20 and ename like
'%I%'
Plan hash value: 2662388210
1 - SEL$1
3 - SEL$1 / E@SEL$1
4 - SEL$1 / D@SEL$1
/+
BEGIN_OUTLINE_DATA
FULL(@"SEL$1" "D"@"SEL$1")
USE_HASH(@"SEL$1" "D"@"SEL$1")br/>IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
DB_VERSION('12.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "E"@"SEL$1" "D"@"SEL$1")
END_OUTLINE_DATA
/
1 - filter(ROWNUM<20)
2 - access("E"."DEPTNO"="D"."DEPTNO")
3 - filter(("ENAME" LIKE '%I%' AND "ENAME" IS NOT NULL))
1 - "E"."DEPTNO"[NUMBER,22], "D"."DEPTNO"[NUMBER,22], "E"."EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9],
"E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "D"."LOC"[VARCHAR2,13],
"D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13], "D"."DNAME"[VARCHAR2,14]
2 - (#keys=1) "E"."DEPTNO"[NUMBER,22], "D"."DEPTNO"[NUMBER,22], "E"."EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9],
"E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "D"."LOC"[VARCHAR2,13],
"D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13], "D"."DNAME"[VARCHAR2,14]
3 - "E"."EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7],
"E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22]
4 - "D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13]
66 rows selected.
SCOTT@clonepdb_plug>