Oracle學習筆記(三)----------執行計畫

來源:互聯網
上載者:User

標籤:des   io   ar   os   使用   sp   for   strong   檔案   

查看Oracle執行計畫的幾種方法

 

一、通過PL/SQL Dev工具

1、直接File->New->Explain Plan Window,在視窗中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。

2、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執行計畫了,看到的結果和1中的一樣,所以使用工具的時候推薦使用1方法。

注意:PL/SQL Dev工具的Command window中不支援set autotrance on的命令。還有使用工具方法查看計劃看到的資訊不全,有些時候我們需要sqlplus的支援。

 

二、通過sqlplus

1.最簡單的辦法

Sql> set autotrace on

Sql> select * from dual;

  執行完語句後,會顯示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‘);

 

5、使用tkprof格式化追蹤檔案: (根據下面SQL語句得到的檔案都不存在該目錄下,鬱悶啊,懵懂啊...)

 

一般,一次跟蹤可以分為以下幾步:

1、界定需要跟蹤的目標範圍,並使用適當的命令啟用所需跟蹤。

2、經過一段時間後,停止跟蹤。此時應該產生了一個跟蹤結果檔案。

3、找到追蹤檔案,並對其進行格式化,然後閱讀或分析。

 

--使用一下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

 

Oracle學習筆記(三)----------執行計畫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.