使用DBMS HPROF包收集PL SQL效能資訊

2022-04-08 20:32:19 字數 4054 閱讀 3663

使用dbms_hprof包收集pl/sql效能資訊

dbms_hprof包是oracle 11g出現的工具,是dbms_profiler和dbms_trace的綜合.

這裡簡單演示如何使用dbms_hprof包來分析儲存過程效能資訊.

首先我們需要執行乙個指令碼來生成儲存相關資訊的表.

使用sys使用者執行

$oracle_home/rdbms/admin/dbmshptab.sql

然後建立directory,

create directory log_file_dir as '/home/oracle';

先用scott使用者建立乙個用於測試的儲存過程insert_emp.

[sql]

23:58:57 @orcl> conn scott/tiger@orcl

connected.

23:59:35 scott@orcl> create or replace procedure insert_emp(pempno number, pename varchar2) is

23:59:45 2 stmt varchar2(2000);

23:59:45 3 begin

23:59:45 4 stmt := 'insert into emp_bak '

23:59:45 5 || '(empno,ename) '

23:59:45 6 || 'select :empno,:ename'

23:59:45 7 || ' from dual';

23:59:45 8 dbms_output.put_line(stmt);

23:59:45 9 execute immediate stmt

23:59:45 10 using pempno, pename;

23:59:45 11 end insert_emp;

23:59:46 12 /

procedure created.

elapsed: 00:00:00.44

這裡演示是在sys使用者下進行,如果要到指定使用者執行,需要將dbms_hprof包的執行許可權以及目錄的讀寫許可權賦予給該使用者.

收集剛建立的儲存過程的效能指標

[sql]

00:06:11 sys@orcl> declare

00:10:42 2 v_runid dbmshp_runs.runid%type;

00:10:42 3 v_plshprof_dir all_directories.directory_name%type := 'log_file_dir';

00:10:42 4 v_plshprof_file varchar2(30) := 'insert_emp';

00:10:42 5 begin

00:10:42 6 -- start the profiling session

00:10:42 7 dbms_hprof.start_profiling(v_plshprof_dir, v_plshprof_file);

00:10:42 8 scott.insert_emp(9990,'cryking!');

00:10:42 9 -- stop the profiling session

00:10:42 10 dbms_hprof.stop_profiling;

00:10:42 11 -- analyze the raw output and create the table data

00:10:42 12 v_runid := dbms_hprof.analyze(v_plshprof_dir, v_plshprof_file);

00:10:42 13 dbms_output.put_line('this run: ' || to_char(v_runid));

00:10:42 14 end;

00:10:42 15 /

insert into emp_bak (empno,ename) select :empno,:ename from dual

this run: 1

pl/sql procedure successfully completed.

elapsed: 00:00:00.26

執行完後,會在對應目錄生成乙個insert_emp的檔案,直接檢視檔案的話,內容很凌亂也很簡短,如下:

p#! pl/sql timer started

p#c plsql."scott"."insert_emp"::7."insert_emp"#762ba075453b8b0d #1

p#x 1331

p#c plsql."sys"."dbms_output"::11."put_line"#5892e4d73b579470 #109

p#x 4

p#c plsql."sys"."dbms_output"::11."put"#5892e4d73b579470 #77

p#x 220

p#rp#x 2

p#c plsql."sys"."dbms_output"::11."new_line"#980980e97e42f8ec #117

p#x 4

p#rp#x 3

p#rp#x 83

p#c sql."scott"."insert_emp"::7."__dyn_sql_exec_line9" #9

p#x 39858

p#rp#x 14

p#rp#c plsql."sys"."dbms_hprof"::11."stop_profiling"#980980e97e42f8ec #59

p#rp#! pl/sql timer stopped

這裡需要使用工具plshprof對其進行分析,如下:

[oracle@oracleserver ~]$ plshprof insert_emp

plshprof: oracle database 11g enterprise edition release 11.2.0.1.0 - production

[6 symbols processed]

[report written to 'insert_emp.html']

[oracle@oracleserver ~]$ ls *.html

insert_emp_2c.html insert_emp_fn.html insert_emp_mf.html insert_emp_nsf.html insert_emp_tc.html insert_emp_ts.html

insert_emp_2f.html insert_emp.html insert_emp_ms.html insert_emp_nsp.html insert_emp_td.html

insert_emp_2n.html insert_emp_md.html insert_emp_nsc.html insert_emp_pc.html insert_emp_tf.html

然後我們再檢視檔案insert_emp.html的內容,如下:

[html]

pl/sql elapsed time (microsecs) analysis for 'insert_emp'

通過瀏覽器檢視,我們可以點選各個鏈結,檢視,如點選function elapsed time (microsecs) data sorted by total subtree elapsed time (microsecs)後,結果如下圖:

從圖可知,函式最耗時的語句為scott.insert_emo._dyn_sql_exec_line9(即為執行動態sql那一行),耗時39858微秒,整個函式共耗時41519微秒.

還可以點選function name列檢視更詳細的內容.

ps:其實生成的html大部分資訊都是來自dbmshp_function_info和dbmshp_parent_child_info表.

日誌收集及網路包收集方案

日誌收集機制 logfile filebeat kafka logstash elasticsearch kibana filebeat部署在每台機器上負責抓取日誌檔案的資料 logstash也可以抓取資料,但是太重。用清量的filebeat方便部署在每台機器上。kafaka作為佇列快取,以防過大日...

jQuery使用收集

size x large b jquery使用收集 b size 獲取一組radio被選中項的值 var item input name items checked val 獲取select被選中項的文字 var item select name items option selected text...

jQuery使用收集

獲取一組radio被選中項的值 var item input name items checked val 獲取select被選中項的文字 var item select name items option selected text select下拉框的第二個元素為當前選中值 select id ...