對於已經存在的代碼,找出影響性能的問題點至關重要,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單元信息。