查看Oracle執行計劃的幾種方法sql
1、經過PL/SQL Dev工具c#
一、直接File->New->Explain Plan Window,在窗口中執行sql能夠查看計劃結果。其中,Cost表示cpu的消耗,單位爲n%,Cardinality表示執行的行數,等價Rows。session
二、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)即可以看到oracle的執行計劃了,看到的結果和1中的同樣,因此使用工具的時候推薦使用1方法。oracle
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。還有使用工具方法查看計劃看到的信息不全,有些時候咱們須要sqlplus的支持。工具
2、經過sqlplusfetch
1.最簡單的辦法優化
Sql> set autotrace on命令行
Sql> select * from dual;orm
執行完語句後,會顯示explain plan 與 統計信息。進程
這個語句的優勢就是它的缺點,這樣在用該方法查看執行時間較長的sql語句時,須要等待該語句執行成功後,才返回執行計劃,使優化的週期大大增加。若是不想執行語句而只是想獲得執行計劃能夠採用:
Sql> set autotrace traceonly
這樣,就只會列出執行計劃,而不會真正的執行語句,大大減小了優化時間。雖然也列出了統計信息,可是由於沒有執行語句,因此該統計信息沒有用處,若是執行該語句時遇到錯誤,解決方法爲:
(1)在要分析的用戶下:
Sqlplus > @ ?
dbmsadminutlxplan.sql
(2) 用sys用戶登錄
Sqlplus > @ ?sqlplusadminplustrce.sql
Sqlplus > grant plustrace to user_name;
- - user_name是上面所說的分析用戶
2.用explain plan命令
(1) sqlplus > explain plan for select * from testdb.myuser
(2) sqlplus > select * from table(dbms_xplan.display);
上面這2種方法只能爲在本會話中正在運行的語句產生執行計劃,即咱們須要已經知道了哪條語句運行的效率不好,咱們是有目的只對這條SQL語句去優化。其實,在不少狀況下,咱們只會聽一個客戶抱怨說如今系統運行很慢,而咱們不知道是哪一個SQL引發的。此時有許多現成的語句能夠找出耗費資源比較多的語句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions>0 AND buffer_gets > 100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- ------------------------------------------------------------
66D83D64 select t.name, (sel 421531 60104 7.01336017
66D9E8AC select t.schema, t.n 1141739 2732 417.913250
66B82BCC select s.synonym_nam 441261 6 73543.5
從而對找出的語句進行進一步優化。固然咱們還能夠爲一個正在運行的會話中運行的全部SQL語句生成執行計劃,這須要對該會話進行跟蹤,產生trace文件,而後對該文件用tkprof程序格式化一下,這種獲得執行計劃的方式頗有用,由於它包含其它額外信息,如SQL語句執行的每一個階段(如Parse、Execute、Fetch)分別耗費的各個資源狀況(如CPU、DISK、elapsed等)。
3、啓用SQL_TRACE跟蹤全部後臺進程活動:
全局參數設置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
當前session中設置:
SQL> alter session set SQL_TRACE=true;
SQL> select * from dual;
SQL> alter session set SQL_TRACE=false;
對其餘用戶進行跟蹤設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
開啓跟蹤:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
關閉跟蹤:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
而後使用oracle自帶的tkprof命令行工具格式化跟蹤文件。
4、使用10046事件進行查詢:
10046事件級別:
Lv1 - 啓用標準的SQL_TRACE功能,等價於SQL_TRACE
Lv4 - Level 1 + 綁定值(bind values)
Lv8 - Level 1 + 等待事件跟蹤
Lv12 - Level 1 + Level 4 + Level 8
全局設定:
OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
當前session設定:
開啓:SQL> alter session set events '10046 trace name context forever, level 8';
關閉:SQL> alter session set events '10046 trace name context off';
對其餘用戶進行設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');
五、使用tkprof格式化跟蹤文件: (根據下面SQL語句獲得的文件都不存在該目錄下,鬱悶啊,懵懂啊...)
通常,一次跟蹤能夠分爲如下幾步:
一、界定須要跟蹤的目標範圍,並使用適當的命令啓用所需跟蹤。
二、通過一段時間後,中止跟蹤。此時應該產生了一個跟蹤結果文件。
三、找到跟蹤文件,並對其進行格式化,而後閱讀或分析。
--使用一下SQL找到當前session的跟蹤文件:
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
from
( select p.spid from v$mystat m,v$session s, v$process p
where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
( select t.instance from v$thread t,v$parameter v
where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
( select value from v$parameter where name = 'user_dump_dest' ) d;
-- 其它用戶的 session
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
from
( select p.spid from v$session s, v$process p
where s.sid= '27' and s. SERIAL#= '30' and p.addr = s.paddr) p,
( select t.instance from v$thread t,v$parameter v
where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
( select value from v$parameter where name = 'user_dump_dest' ) d;
--查找後使用tkprof命令,將TRACE文件格式爲到D盤的explain_format.txt文件中
SQL> $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc d:/explain_format.txt
文件內容大體以下(看不太懂....懵懂啊.....天啊....神啊.....過幾時就懂了/////////////)
TKPROF: Release 9.2.0.1.0 - Production on 星期二 4月 20 13:59:20 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
alter session set events '10046 trace name context forever, level 8'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.00 0.00 0 0 0 0
Misses in library cache during parse: 0
Misses in library cache during execute: 1
Optimizer goal: CHOOSE
Parsing user id: SYS