PL/SQL性能優(yōu)化工具profiler的部署和使用
摘要... 2
PL/SQL性能優(yōu)化工具profiler的部署和使用... 2
產(chǎn)品名稱,產(chǎn)品版本... 2
適用平臺... 2
創(chuàng)建及維護日期... 2
引言... 2
執(zhí)行環(huán)境:... 2
訪問權(quán)限:... 3
用法... 3
簡介... 3
描述... 3
先決條件... 3
附錄1 調(diào)用范例... 4
測試過程創(chuàng)建... 4
調(diào)用過程腳本... 5
結(jié)果分析... 5
profiler.sql - PL/SQL Profiler (MetaLink Note:243755.1) 5
Profiled Run 3 (plsql_profiler_runs) 5
Profiled PL/SQL Libraries (plsql_profiler_units) 5
Top 10 profiled source lines in terms of Total Time (plsql_profiler_data) 5
Unit:2 DRP.SP_PROCESS_GATHER_JAX1 (all_source) 6
摘要 PL/SQL性能優(yōu)化工具profiler的部署和使用
當(dāng)用戶等待時間與SQL進程消耗的時間有較大差距,并且這個過程中有PL/SQL腳本的參與,這時,PL/SQL的事件探查器profiler將能在很大程度上給你提供幫助。她能幫助DBA識別出那些耗時較長的sql語句。
比如,一個使用PL/SQL對象(包,過程,函數(shù),觸發(fā)器)的事務(wù)執(zhí)行了超過1個小時,但10046和tkprof的跟蹤分析結(jié)果只檢測出10分鐘的sql執(zhí)行時間。這種情況下通過使用pl/sql事件探查器profiler,將能提供一個逐行解析的pl/sql程序腳本報告,給出每行程序的具體執(zhí)行時間信息。
實際的PL/SQL事件探查器是隨著RDBMS核心代碼一起提供的,這些都可以通過oracle提供的PL/SQL包的類型參考手冊上查詢得到。事件探查器的包名稱為DBMS_PROFILER。
本文主要介紹PL/SQL profiler在8i或者更高版本上的安裝及用法。主要是為了提供對plsql程序?qū)ο蟮男阅苷{(diào)試。本文主要適用于oracle的8i或者更高版本,但她的使用并不僅僅只限于oracle。
本文描述的主要數(shù)據(jù)庫腳本(profiler.sql)將提供一個由dbms_profiler包提取的完整的性能報告。
產(chǎn)品名稱,產(chǎn)品版本本文涉及的profiler.sql和profgsrc.sql只能使用在oracle 8i及更高的oracle數(shù)據(jù)庫實例上,包括oracle 10g和oracle11g。
適用平臺與平臺無關(guān)。
創(chuàng)建及維護日期創(chuàng)建時間:2003-07-14
創(chuàng)建人:carlos Sierra
最后修改時間:2008-04-29
引言 執(zhí)行環(huán)境:SQL * PLUS
訪問權(quán)限:需要SQL* PLUS用戶和密碼,如果使用的是oracle應(yīng)用數(shù)據(jù)庫,那么使用APPS連接,否則使用主程序用戶和密碼。
用法$ sqlplus APPS/
SQL > @profiler.sql
這里的run_id是第一次安裝dbms_profile包時的返回值。
如果不知道run_id,那么執(zhí)行無參數(shù)的@profiler,腳本將會返回一個run_id列表。
簡介要安裝DBMS_PROFILER和生成PL/SQL事件探查器數(shù)據(jù),請先閱讀下面一節(jié)的先決條件。
一旦為某個pl/sql程序?qū)ο髨?zhí)行了dbms_profiler.start_profiler和dbms_profiler.stop_profiler,之后就可以執(zhí)行profler.sql腳本產(chǎn)生一個HTML類型的完整報告,報告中將會標(biāo)示跟蹤期間耗時較長的sql腳本。她也會表明腳本執(zhí)行的次數(shù)。詳細可以參考prof.zip中的示例。
DBA可以使用profiler.sql生成的HTML來調(diào)試執(zhí)行期間最為耗時的plsql腳本。
描述 先決條件1,如果是第一次使用,則需要先行判斷dbms_profiler是否已經(jīng)安裝了。
$ sqlplus APPS/
SQL> DESC DBMS_PROFILER;
如果DBMS_PROFILER沒有安裝,使用sys用戶連接數(shù)據(jù)庫服務(wù)器,并執(zhí)行下面的腳本來創(chuàng)建對應(yīng)的程序包。
$ sqlplus sys/
SQL> @$ORACLE_HOME/rdbms/admin/profload.sql
2,如果是第一次使用,在安裝完dbms_profiler之后,使用應(yīng)用程序用戶登錄sql plus,運行$ORACLE_HOME/rdbms/admin目錄下的proftab.sql腳本,創(chuàng)建相關(guān)的數(shù)據(jù)表如plsql_profiler_runs,plsql_profiler_units,plsql_profiler_data。
$ sqlplus apps/
SQL> @proftab.sql
3,由于本文檔描述的主要腳本profiler.sql的產(chǎn)生依靠dbms_profiler的支持,所以在運行下面的腳本對數(shù)據(jù)庫對象執(zhí)行跟蹤前腰確認已經(jīng)安裝了對應(yīng)的程序包。
下面腳本的主要功能是開啟和關(guān)閉事件探查功能,可以放置到任何plsql腳本塊之中。
Begin
? Dbms_profiler.start_profiler(‘a(chǎn)ny comment to identify this execution’);
? …
? Dbms_profiler.stop_profiler;
?
Exception
?? …
End;
4,為了要修改plsql庫的腳本,dba首先要找到他的定義腳本,備份他,然后執(zhí)行修改將dbms_profiler的start和stop調(diào)用加入其中。
如果無法找到package,procedure,function和trigger等對象的調(diào)用,可以使用profgsrc.sql獲得定義的腳本,過程調(diào)用時需要傳入plsql庫的對象名稱。
$ sqlplus apps/
SQL> start profgsrc.sql
上面的腳本將訪問user_source并獲得對象的定義腳本,生成的腳本存放到一個sql類型文件中。
5,一旦將包含start和stop過程的腳本重新編譯后,可以執(zhí)行它來完成對腳本的跟蹤。每次執(zhí)行將會產(chǎn)生一個新的run_id,這個run_id就是后面生成報告的profiler.sql的參數(shù)。
?
附錄1 調(diào)用范例 測試過程創(chuàng)建create or replace procedure sp_process_gather_jax1
?is
?temp_str varchar2(100);
begin
?? select count(*)
??? into temp_str
??? from gather_header gh;???
??? select max(table_name)
??? into temp_str
??? from dba_tables dt;
exception?
?? when others then
????? null;
end sp_process_gather_jax1;
declare
? a_str varchar2(20);
begin
? dbms_profiler.start_profiler('this is the first execution of dbms_profiler.');
? -- Call the procedure
? sp_process_gather_jax1;
? dbms_profiler.stop_profiler;
? dbms_output.put_line(a_str);
end;
Run
Date
Total Time1
Comment
3
10-AUG-10 10:40:17
17.05
this is the first execution of dbms_profiler.
Note 1: Total Time is in seconds
Profiled PL/SQL Libraries (plsql_profiler_units)Unit
Owner
Name
Type
Timestamp
Total Time1
Text Header
2
DRP
SP_PROCESS_GATHER_JAX1
PROCEDURE
10-AUG-10 10:40:09
17.04
?
Note 1: Total Time is in seconds
Top 10 profiled source lines in terms of Total Time (plsql_profiler_data)Top
Total Time1
Times Executed
Min Time2
Max Time2
Unit
Owner
Name
Type
Line
Text
1
16.66
1
16.66
16.66
2
DRP
SP_PROCESS_GATHER_JAX1
PROCEDURE
13
select count(*)
2
0.38
1
0.38
0.38
2
DRP
SP_PROCESS_GATHER_JAX1
PROCEDURE
17
select max(table_name)
Note 1: Total Time is in seconds
Note 2: Min and Max Time for one execution of this line (in seconds)
Line
Total Time1
Times Executed
Text
1
?
?
procedure sp_process_gather_jax1
2
?
?
?is
3
?
?
?temp_str varchar2(100);
4
?
?
begin
5
?
?
/*
6
?
?
create by jaxzhang 2010.08.06
7
?
?
1, 跟蹤性能:10046 & prof
8
?
?
2,邏輯審核:人
9
?
?
*/
10
?
?
-- add by jaxzhang 20100810 事件探查器的
11
?
?
?-- dbms_profiler.start_profiler;
12
?
?
???
13T1
16.66
1
???select count(*)
14
?
?
????into temp_str
15
?
?
????from gather_header gh;
16
?
?
????
17T2
0.38
1
????select max(table_name)
18
?
?
????into temp_str
19
?
?
????from dba_tables dt;
20
?
?
??
21
?
?
-- add by jaxzhang 20100810 關(guān)閉事件探查
22
?
?
?-- dbms_profiler.stop_profiler;
23
?
?
??
24
?
?
?-- rollback;
25
?
?
?
26
?
?
exception
27
?
?
???when others then
28
?
?
??????null;
29
0.00
1
end sp_process_gather_jax1;
Note 1: Total Time is in seconds
Note Tn: Top "n" Line in terms of Total Time
?