獲取SQL執行計劃的常見幾種方法 一、獲取庫緩衝區中的執行計劃 1. 查詢v$sql動態性能視圖,找到要查詢的SQL語句的sql_id。 2. 調用dbms_xplan包的display_cursor方法,查看該語句執行時的執行計劃。 例如: SELECT dname FROM emp, dept ...
獲取SQL執行計劃的常見幾種方法
一、獲取庫緩衝區中的執行計劃
1. 查詢v$sql動態性能視圖,找到要查詢的SQL語句的sql_id。
2. 調用dbms_xplan包的display_cursor方法,查看該語句執行時的執行計劃。
例如:
SELECT dname FROM emp, dept WHERE emp.deptno=dept.deptno;
SELECT sql_id FROM v$sql WHERE sql_text='SELECT dname FROM emp, dept WHERE emp.deptno=dept.deptno';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('00gyc848k0q4v'));
直接調用display_cursor,不指定sql_id,就可以將剛剛當前會話執行的SQL命令執行計劃從library cache中查詢出來。
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());
註意:display_cursor支持format參數,可以進行詳細執行計劃信息的抽取。
只能在sqlplus或者sqlplusw上使用,如果是TOAD、PL/SQL develop等其它第三方工具,可能調用程式包dbms_xplan不能正常使用。
二、獲取SQL預執行的執行計劃
Explain plan for 命令在Oracle中,可以對後面的SQL語句進行直接的解析,將執行計劃保存在一個plan_table的中間表中,之後通過dbms_xplan包的display方法進行獲取。
例如:
EXPLAIN PLAN FOR SELECT dname FROM emp, dept WHERE emp.deptno=dept.deptno;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
通過指定參數,Explain plan for命令可以顯示更詳細的信息。
例如:
EXPLAIN PLAN FOR SELECT dname FROM emp, dept WHERE emp.deptno=dept.deptno;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'advanced'));
使用EXPLAIN PLAN FOR 需要註意的是:
explain plan for是單純對SQL語句進行優化器分析,獲取並產生到的執行計劃。
這個過程中,並沒有真正執行。
所以,生成的執行計劃有時候會可能有問題,而且進行統計的信息情況沒有autotrace的準確度高。
三、使用autotrace工具分析SQL的執行計劃
1.配置autotrace工具
配置AUTOTRACE 的方法不止一種,以下是其中一種的方式:
(1)cd [ORACLE_HOME]/sqlplus/admin;
(2)作為SYS 或SYSDBA 登錄SQL*Plus;
(3)運行@plustrce.sql;
(4)運行GRANT PLUSTRACE TO PUBLIC。
註:ORACLE_HOME是指Oracle的安裝路徑,如果是在Windows系統下,可以進入到相應路徑再運行腳本。
如果願意,可以把GRANT TO PUBLIC 中的PUBLIC 替換為某個用戶。
通過將PLAN_TABLE置為public,任何人都可以使用SQL*Plus 進行跟蹤。
這麼一來,就不需要每個用戶都安裝自己的計劃表。
以下是腳本plustrce.sql中的內容:
set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$mystat to plustrace;
grant plustrace to dba with admin option;
set echo off
大概意思如下:
創建角色plustrace。
將在動態性能視圖v_$sesstat,v_$statname,v_$mystat上的SELECT許可權授予該角色。
把該角色授權給DBA用戶,並使其有許可權將該角色授予其它用戶。
註:v$_開頭的動態性能視圖是以v_$開頭的視圖的同義詞。
可以通過查詢視圖dba_objects確認相關對象的類型。
例如:
select object_type from dba_objects where object_name=upper('v_$sesstat');
select object_type from dba_objects where object_name=upper('v$sesstat');
2. 關於如何使用autotrace工具
用法1:查看執行計劃、統計信息並且返回sql結果集:
SET AUTOTRACE ON
用法2:查看執行計劃、統計信息不返回sql結果集:
SET AUTOTRACE TRACEONLY
用法3:查看執行計劃不返回統計信息、不返回sql結果集:
SET AUTOTRACE TRACEONLY EXPLAIN
用法4:查看統計信息不返回執行計劃、不返回sql結果集:
SET AUTOTRACE TRACEONLY STATISTICS
以上是查看SQL執行計劃的幾種方式。
關於如何分析Oracle SQL執行計劃
舉例說明一下:
explain plan for SELECT dname, ename FROM emp, dept WHERE emp.deptno=dept.deptno;
select * from table(dbms_xplan.display());
Plan hash value: 351108634
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 15 | 330 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 15 | 330 | 4 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | EMP | 15 | 135 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
Statistics
-----------------------------------------------------------
195 recursive calls
11 db block gets
2 consistent gets
0 physical reads
716 redo size
594 bytes sent via SQL*Net to client
381 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
一、通過執行計劃查看SQL語句執行先後順序
看執行計劃時,首先從縮進最大的行讀取,它是最先被執行的步驟。在執行計劃中:id=4是最先被執行的,
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
兩行縮進一樣的,最上面的最先被執行,在這裡就是id=2
| 2 | TABLE ACCESS FULL | EMP | 15 | 135 | 3 (0)| 00:00:01 |
然後是id=3
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 00:00:01 |
選擇次之縮進的行數id=1
| 1 | NESTED LOOPS | | 15 | 330 | 4 (0)| 00:00:01 |
最後是id=0
| 0 | SELECT STATEMENT | | 15 | 330 | 4 (0)| 00:00:01 |
二、執行計劃中欄位解釋:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
Id: 一個序號,但不是執行的先後順序。
Operation:當前操作的內容。
Name :涉及的對象名稱。
Rows :前操作的Cardinality(基數),Oracle估計當前操作的返回結果集。
Bytes :操作涉及內容的大小。
Cost (%CPU):Oracle計算出來的一個數值(代價),用於說明sql執行的代價。
Time: Oracle估算當前操作的時間。
三、謂詞說明:
Access: 表示這個謂詞條件的值將會影響數據的訪問路勁(表還是索引)。
Filter:表示謂詞條件的值不會影響數據的訪問路勁,只起過濾的作用。