該文檔爲根據相關資料整理、總結而成,主要講解Oracle數據庫中,獲取SQL語句執行計劃的最權威、最正確的方法、步驟,此外,還詳細說明了每種方法中可選項的意義及使用方法,以方便你們和本身平常工做中查閱使用,因本人未發現本博客支持附件上傳功能,須要PDF文件格式的朋友可向我要,也可到羣裏下載,轉載請註明出處。sql
一、查詢v$sql_plan:數據庫
SQL> col "Query Plan_Table" format a100session
SQL> select id,lpad(' ', 2*(level-1))||operation||''||options||' '||object_name||' '||decode(id, 0, 'Cost='||cost) "QueryPlan_Table"oracle
fromv$sql_plan分佈式
startwith id = 0函數
andsql_id = '&&sql_id'性能
andplan_hash_value = &&plan_hash優化
connect byprior id = parent_idcode
andsql_id = '&&sql_id'orm
andplan_hash_value = &&plan_hash;
--注::SQL_ID可查v$sqltext和dba_hist_sqltext,也可經過其餘途徑得到。
二、經過包DBMS_XPLAN
1)DISPLAY
SQL>explain plan for select * from t_users whereuser_id='TEST';
SQL>select * from table(dbms_xplan.display());
SQL>select * fromtable(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));
--注:
1.TABLE_NAME:存儲查詢計劃的表名,默認值爲PLAN_TABLE。
2.STATEMENT_ID :SQL 語句ID。可在執行ExplainPlan 命令時,經過SetStatement_
id 子句來指定。如爲NULL,則取最近一條被解釋的語句。
3.FORMAT:輸出格式。在DISPLAY 函數中,有如下預約義格式選:
1)'BASIC' :基本格式。輸出的內容最少,僅輸出查詢計劃中每一個操做的ID、名稱和選項及操做對象名。
2)'TYPICAL':典型格式。除了基本格式中的內容外,還輸出每一個操做的記錄行數、
字節數、代價和時間,以及相關的提示信息(如遠程SQL、優化器建議等)。如
存在謂詞,還輸出每一個操做中的過濾條件和訪問條件。此外,如涉及分區表,還輸出分區裁剪信息;如涉及並行查詢,還輸出並行操做信息(如表隊列信息、並行查詢分佈方式等)。爲默認格式。
3)'SERIAL':串行執行格式。這種格式和典型格式的輸出內容基本一致,不一樣之處在於,對並行查詢,它不會輸出相關的並行內容。
4)'ALL':徹底格式。輸出的內容相對完整。除了典型格式的內容之外,還會輸出字段投影信息和別名信息。
此外,用戶還可經過在格式化字符串中添加或屏蔽一些關鍵詞進行細化輸出,
例如:「BASICROWS」,「TYPICAL-PREDICATE」等
1)ROWS:優化器估算出的記錄行數;
2)BYTES:優化器估算出的字節數;
3)COST:優化器估算出的代價;
4)PARTITION:分區裁剪;
5)PARALLEL:並行查詢;
6)PREDICATE:謂詞;
7)PROJECTION:字段投射;
8)ALIAS:別名;
9)REMOTE:分佈式查詢信息;
10)NOTE:相關注釋信息。
2)DISPLAY_CURSOR
SQL>select /*+gather_plan_statistics*/* fromt_users where user_id='TEST';
SQL>select * fromtable(dbms_xplan.display_cursor(null,null,'BASIC LAST ALLSTATS'));
--注:
1.DISPLAY_CURSOR 函數能夠顯示內存中一個或者多個遊標的執行計劃;
2.用戶須對視圖V$SQLV、$SQL_PLAN 和V$SQL_PLAN_STATISTICS_ALL 的SELECT有權限;
3.參數:
1)SQL_ID:若是沒有指定SQL_ID(指定NULL),則默認會顯示當前會話中最後一條執行的SQL 語句。
2)CURSOR_CHILD_NO:語句的子游標序號,若是不指定,則會顯示該語句的全部子游標的執行計劃。
3)FORMAT:格式化控制字符串。DISPLAY 函數的格式化控制字符串的全部選項都適用於DISPLAY_CURSOR 函數。如運行語句時經過GATHER_PLAN_STATISTICS或設置系統參數STATISTICS_LEVEL 爲「ALL」收集語句運行的性能統計數據,則在細化選項中還有額外的選項,以選擇是否輸出這些數據。
4)IOSTATS:是否輸出計劃的輸入輸出(IO)統計數據;
5)MEMSTATS :在啓用了PGA 自動管理的狀況下,是否輸出計劃的輸入內存統計數據(內存使用量、內存讀次數等);
6)ALLSTATS:包含了IOSTATS和MEMSTATS 的所有內容;
7) LAST :以上三個選項輸出的是該遊標全部執行所產生的數據的總和。也可增長LAST選項以限定僅顯示最後一次運行的統計數據。
此外,還有一些選項可用於該函數的輸出控制:
8)'ADVANCED' :高級格式。高級格式除了會輸出徹底格式中的全部內容外,還會視狀況輸出綁定變量窺視信息和計劃概要信息;
9) OUTLINE:是否以提示方式顯示計劃概要;
10)PEEKED_BINDS:是否顯示綁定變量窺視信息;
11)BUFFSTATS:是否顯示內存讀次數(包括一致性讀和當前讀次數),該信息爲IOSTATS 的一部分;
12)PLAN_HASH:是否顯示計劃的哈希值,該選項一樣適用於DISPLAY函數。
3)DISPLAY_AWR
SQL>select sql_id, to_char(substr(sql_text,0,2000))
fromdba_hist_sqltext
whereupper(sql_text) like 'SELECT * FROM TEST%';
SQL>select * fromtable(dbms_xplan.display_awr('&sql_id'));
--注:
1.DISPLAY_AWR 函數顯示存儲在AWR歷史數據的執行計劃。
2.須對如下視圖有SELECT權限:DBA_HIST_SQL_PLAN 和DBA_HIST_SQLTEXT。
3.參數:
1)SQL_ID :能夠從DBA_HIST_SQL_PLAN.SQL_ID或DBA_HIST_SQLTEXT.SQL_ID 得到,該參數必須指定非空值,沒有默認值;
2)PLAN_HASH_VALUE :若是該參數未指定或爲NULL,則會顯示語句的全部執行計劃;
3)DB_ID:指定顯示哪一個數據庫的執行計劃,默認爲本地數據庫ID。頁可將其餘數據庫的AWR導入本地庫進行分析。
4)FORMAT:格式化控制字符串。與DISPLAY的相同選項相似。
4)DISPLAY_SQLSET
SQL>declare
2 ss_name varchar2(60);
3 begin
4 ss_name :=dbms_sqltune.create_sqlset();
5 dbms_sqltune.capture_cursor_cache_sqlset(ss_name,600,100);
6 dbms_output.put_line(ss_name);
7 end;
8 /
SQL>select sqlset_name,sql_id,sql_text fromDBA_SQLSET_STATEMENTS where upper(sql_text)
like 'SELECT * FROM TEST%';
SQL>select * fromtable(dbms_xplan.display_sqlset('STS_6','abcdefg',null,'BASIC ROWS COST'));
--注:
1.DISPLAY_SQLSET函數顯示存儲在一個SQL調優集中的語句的執行計劃。
2.參數:
1)SQLSET_NAME:SQL 集的名稱。每一個SQL 集都有一個單獨的名稱(可在建立時
用戶指定,也可系統自動生成),需指定從哪一個SQL集中讀取和顯示語句的執行計劃,該參數沒有默認值,必須指定;
2)SQL_ID :可從USER/DBA/ALL_SQLSET_PLANS.SQL_ID得到,該參數必須指定非空值,沒有默認值;
3)PLAN_HASH_VALUE:若是未指定或爲NULL,則會顯示語句的全部執行計劃;
4)FORMAT:格式化控制字符串。與DISPLAY的FORMAT 選項相同;
5)SQLSET_OWNER:SQL集的全部者,默認爲當前用戶名。
5)DISPLAY_SQL_PLAN_BASELINE
SQL>select * fromtable(dbms_xplan.display_sql_plan_baseline(sql_handle =>
'SYS_SQL_66cc81707e560a32'));
--注:
1.DISPLAY_SQL_PLAN_BASELINE 函數顯示存儲在數據字典當中SQL 執行計劃基線的計劃。
2.參數:
1)SQL_HANDLE:執行計劃基線所屬SQL的句柄名稱,由Oracle在建立或載入執行計劃到基線當中時自動生成,能夠經過視圖dba_sql_plan_baselines查詢,默認爲NULL;
2)PLAN_NAME :執行計劃基線中某個執行計劃的名稱,由Oracle 建立或載入執行計劃到基線當中時自動生成,能夠經過視圖dba_sql_plan_baselines查詢,默認爲NULL;
3)FORMAT :格式化控制字符串。DISPLAY_SQLSET 函數的格式化選項與DISPLAY
的選項相同。
4)當SQL_HANDLE和PLAN_NAME 都爲空時,顯示全部基線數據中的所有執行計劃。
三、AUTOTRACE
1)配置test用戶使用autot
SQL>conn sys/sys as sysdba
SQL>@?/SQLPLUS/ADMIN/PLUSTRCE.SQL
SQL>grant plustrace totest;
2)使用方法
1.SET AUTOTRACE ON:打開AUTOTRACE,並輸出全部內容,包括語句自己的查詢結果、執行計劃,以及性能統計數據。
2.SET AUTOTRACE ON EXPLAIN :打開AUTOTRACE,並輸出語句自己的查詢結果和執行計劃,不輸出性能統計數據。
3.SET AUTOTRACE ON STATISTICS :打開AUTOTRACE,並輸出語句自己的查詢結果和性能統計數據,不輸出執行計劃。
4.SET AUTOTRACE TRACE :打開AUTOTRACE,並輸出執行計劃和性能統計數據,不輸出語句自己的查詢結果。
5.SET AUTOTRACE TRACE EXPLAIN :打開AUTOTRACE,並輸出執行計劃,不輸出語句自己的查詢結果和性能統計數據。
6.SET AUTOTRACE TRACESTATISTICS:打開AUTOTRACE,並輸出性能統計數據,不輸出語句自己的查詢結果和執行計劃。
7.SET AUTOTRACE OFF:關閉AUTOTRACE。
四、其餘方法
1)SQL_TRACE(或者10046 跟蹤事件):該方法會在跟蹤文件裏顯示執行計劃及相關統計信息:
SQL>alter session set sql_trace=true;
SQL>select * from t_users where user_id=’TEST’;
SQL>alter session set sql_trace=false;
SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;
SQL>show parameter user_dump_dest
SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc
2)OPTIMIZER_TRACE(或者10053 跟蹤事件):該方法會在跟蹤文件裏記錄優化器分析選擇執行計劃的過程:
SQL>alter session set"_optimizer_trace"=ALL;
SQL>explain plan for select * from t_users whereusername=’TEST’;
SQL>alter session set"_optimizer_trace"=NONE;
SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;
SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc