Oracle PL/SQL高級編程(第五彈:性能優化:使用DBMS_PROFILER包)

對於已經存在的代碼,找出影響性能的問題點至關重要,Oracle提供的DBMS_PROFILER包可以方便地發現其瓶頸所在。

安裝DBMS_PROFILER

在使用DBMS_PROFILER之前,要以管理員身份進入數據庫系統進行安裝。
1. 使用管理員身份登錄,使用DESC命令判斷DBMS_PROFILER包是否存在:DESC DBMS_PROFILER;
2. 如果DESC命令提示DBMS_PROFILER包不存在,則需要使用如下命令安裝:@?/rdbms/admin/profload.sql
3. 再次運行DESC DBMS_PROFILER,可以看到這個包中包含的子程序的信息。使用的函數主要有兩個:start_profiler用來啓動PROFILER,stop_profiler用來停止PROFILER。

配置PROFILER方案

創建一個用來存放跟蹤信息的用戶,以及PROFILER相關的表的同義詞:

CREATE USER profiler IDENTIFIED BY 12345;
grant connect, resource to profiler;
CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;
CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;
CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;
CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;

配置PROFILER表

在創建了需要的同義詞以後,接下來在profiler方案下創建所需的表,以profiler登錄執行如下的配置代碼:
@?/rdbms/admin/proftab.sql
接下來爲這些表分配PUBLIC角色,以便任何人都可以對這幾個表僅訪問:

GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_data TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_units TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_runs TO PUBLIC;

這幾個表的含義如下:
- plsql_profiler_runs:保存在PROFILER的運行信息
- plsql_profiler_units:保存每個單元的PROFILER信息
- plsql_profiler_data:保存了每個單元的詳細數據
- plsql_profiler_runnumber:用來生成PROFILER唯一運行編號的序列

執行PROFILER獲取配置信息

在創建了過程之,就可以使用PROFILER來檢測程序代碼了。下面的代碼創建了一個sp_test的過程,該過程將向pro_tst_table添加10000條記錄:

CREATE TABLE pro_tst_table (a INT);        --創建測試表
CREATE OR REPLACE PROCEDURE sp_test        --創建測試過程
AS
BEGIN
   FOR i IN 1 .. 10000
   LOOP
      INSERT INTO pro_tst_table            --向表中插入10000行記錄
           VALUES (i);
   END LOOP;
   COMMIT;
END;
/

編寫了要測試的過程後,就可以使用DBMS_PROFILER包提供的相關功能來進行測試了:

DECLARE
   v_run_number   integer;            --保存PROFILER的運行號碼
BEGIN
   --啓動PROFILER
   DBMS_PROFILER.start_profiler (run_number => v_run_number);
   --顯示當前跟蹤的運行序號(後面查詢要用)
   DBMS_OUTPUT.put_line ('run_number:' || v_run_number);
   --運行要跟蹤的PLSQL
   sp_test;
   --停止profiler
   DBMS_PROFILER.stop_profiler;
END;
/

查詢PROFILER獲取結果

要使用SQL語句查詢本次執行的信息,可以先查詢plsql_profiler_runs表獲取本次執行的基本信息,查詢plsql_profiler_units表可以得到本次PROFILER時的單元信息,查詢plsql_profiler_data表可以根據行號和單元號獲得執行的存儲過程的每一行的統計信息。
儘管通過查詢這些表可以獲得統計的信息,但是數據看起來比較複雜,因此可以先通過PL/SQL Developer等可視化工具來進行PROFILER。

使用PL/SQL Developer來觀察PROFILER結果

先打開一個空白的測試窗口,將前面使用了DBMS_PROFILER包的代碼複製進來,按F9執行並調試代碼,在代碼執行完成後,切換到概覽圖標籤頁,可以看到在概覽圖中產生的PROFILER單元信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章