利用dbms_profile定位儲存過程或者package裡低效率語句

不一樣的天空w發表於2020-07-02

http://blog.chinaunix.net/uid-74941-id-85352.html


1.檢查是否安裝了dbms_profiler包

如果沒有安裝的話,執行下面的語句安裝,

@?/rdbms/admin/profload.sql


2.把dbms_profiler的執行許可權賦於測試使用者scott

grant execute on dbms_profiler to scott;


3.使用測試使用者scott登入,執行proftab.sql(建立跟蹤相關係統表) 

@?/rdbms/admin/proftab.sql


4.建立一個測試的過程,

DMMS_PROFILER的用發:

(1).DBMS_PROFILER.start_profiler啟動監控

(2).執行所需要分析的儲存過程,可以是多個

(3).DBMS_PROFILER.stop_profiler結束監控


--建立測試儲存過程

create or replace procedure sp_profiler_test1

as

begin

   for x in 1..10000

   loop

       insert into t_t1 values(x);

   end loop;

   commit;

end sp_profiler_test1;

/


--執行DMMS_PROFILER

set serverout on;

DECLARE

  v_run_number integer;

BEGIN

  --啟動profiler

  sys.DBMS_PROFILER.start_profiler(run_number => v_run_number);

  --顯示當前跟蹤的執行序號(後面查詢要用)

  DBMS_OUTPUT.put_line('run_number:' || v_run_number);

  --執行要跟蹤的PLSQL

  sp_profiler_test1; --前一步建立的測試樣例儲存過程

  --停止profiler

  sys.DBMS_PROFILER.stop_profiler;

END;

/


5.檢視結果

--使用測試使用者進行查詢

select d.line#, --原始碼行號

       s.text, --原始碼

       round(d.total_time/1000000000000,5) total_time , --總執行時間(單位秒)

       d.total_occur, --總共執行次數

       round(d.min_time/1000000000000,5) min_time, --單次最小執行時間

       round(d.max_time/1000000000000,5) max_time --單次最大執行時間        

  from plsql_profiler_data d, sys.all_source s, plsql_profiler_units u

 where d.runid = 2 --執行號

   and u.unit_name = 'SP_PROFILER_TEST1' --單元名,即被測試的儲存過程名

   and u.runid = d.runid

   and d.unit_number = u.unit_number

   and d.total_occur <> 0

   and s.type(+) = u.unit_type

   and s.owner(+) = u.unit_owner

   and s.name(+) = u.unit_name

   and d.line# = nvl(s.line, d.line#)

 order by u.unit_number, d.line#;


1秒=1000毫秒bai(ms)

1秒=1,000,000 微秒(μdus)

1秒=1,000,000,000 納秒(ns)

1秒 =1,000,000,000,000 皮秒(ps) (單位10000億分之一秒)

1秒=1,000,000,000,000,000飛秒(fs)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2701923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章