學習DBMS_PROFILER包診斷儲存過程及函式的情能及引申思考
1,學習DBMS_PROFILER包的用法
1,DBMS_PROFILE包的過程及步驟
1,以SYSDBA連線資料庫
@ORACLE_HOME/RDBMS/ADMIN/PROFLOAD.SQL ,建立包DBMS_PROFILER
2,建立PROFILER使用者
CREATE USER PROFILER IDENTIFIED BY SYSTEM ACCOUNT UNLOCK;
GRANT CONNECT,RESOURCE TO PROFILER;
3,以SYSDBA角色,創立PROFILER使用者對應PLSQL相關表的同義詞
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;
4,連線PROFILER用法,建立PLSQL相關的4個表,然後把
CONN PROFILER/SYSTEM
@ORACLE_HOME/RDBMS/ADMIN/PROFTAB.SQL 建立PLSQL相關的表
5,以PROFILER使用者,授權SELECT,INSERT,DELETE,UPDATE上述表的同義詞給PUBLIC,PUBLIC指所有使用者
這樣所有使用者就可以使用PROFILER功能了
GRANT SELECT ON PLSQL_PROFILER_RUNNUMBER TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_RUNS TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_UNITS TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_DATA TO PUBLIC;
2,DBMS_PROFILER診斷的各個表
1,關注上述PLSQL表的哪些列
2,這些PLSQL表之間的關係
3,這些PLSQL表每個列的含義
4,DBMS_PROFILER可以診斷除了儲存過程之類的匿名塊或者查詢及DML語句嗎,即DBMS_PROFILER包的適用範圍
5,學習DBMS_PROFILER包各個子函式及過程的作用及含義
問題:1,可能子過程沒有清空相關PLSQL表的功能
可直接DELETE 這些PLSQL表嗎
2,有直接檢視其用法
3,DBMS_PROFILER如何進行診斷
1,檢視哪些表的哪些列
2,如何比對這些效能資料
4,編寫儲存過程進行測試
5,引申思考:
1,學習一個技術要有遞進性即,比如先要掌握其技術的概念,概念之間的聯絡
然後進階學習,直到掌握此概念;進而是應用這些概念進行相關技術的一些操作,從操作層面理解這些概念
2,製作學習目標及目的時,一定要明確,要有可操作性,如不明確在測試前繼續分解,以免測試中迷失自己浪費時間;
以PLSQL_PROFILER包學習來說,目標要具體,即要掌握PLSQL_PROFILER_DATA,RUNS_UNITS表的含義及每個列的作用;
到哪兒去獲了這些資訊,一般是官方手冊或者上網查資料
3,往往一個技術要涉及到多個問題,在制定目標時,每進行一個小目標時,就進行專題分析,不要圖快,最終什麼也沒學好;
只有每個小目標學好,最終可以掌握這個技術的使用;比如PLSQL表的關係,PLSQL表的重要列的含義
----------------------------------------
SQL> conn scott/system
已連線。
1,DBMS_PROFILE包的過程及步驟
1,以SYSDBA連線資料庫
@ORACLE_HOME/RDBMS/ADMIN/PROFLOAD.SQL ,建立包DBMS_PROFILER
2,建立PROFILER使用者
CREATE USER PROFILER IDENTIFIED BY SYSTEM ACCOUNT UNLOCK;
GRANT CONNECT,RESOURCE TO PROFILER;
3,以SYSDBA角色,創立PROFILER使用者對應PLSQL相關表的同義詞
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;
4,連線PROFILER用法,建立PLSQL相關的4個表,然後把
CONN PROFILER/SYSTEM
@ORACLE_HOME/RDBMS/ADMIN/PROFTAB.SQL 建立PLSQL相關的表
5,以PROFILER使用者,授權SELECT,INSERT,DELETE,UPDATE上述表的同義詞給PUBLIC,PUBLIC指所有使用者
這樣所有使用者就可以使用PROFILER功能了
GRANT SELECT ON PLSQL_PROFILER_RUNNUMBER TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_RUNS TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_UNITS TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON PLSQL_PROFILER_DATA TO PUBLIC;
2,DBMS_PROFILER診斷的各個表
1,關注上述PLSQL表的哪些列
2,這些PLSQL表之間的關係
3,這些PLSQL表每個列的含義
4,DBMS_PROFILER可以診斷除了儲存過程之類的匿名塊或者查詢及DML語句嗎,即DBMS_PROFILER包的適用範圍
5,學習DBMS_PROFILER包各個子函式及過程的作用及含義
問題:1,可能子過程沒有清空相關PLSQL表的功能
可直接DELETE 這些PLSQL表嗎
2,有直接檢視其用法
3,DBMS_PROFILER如何進行診斷
1,檢視哪些表的哪些列
2,如何比對這些效能資料
4,編寫儲存過程進行測試
5,引申思考:
1,學習一個技術要有遞進性即,比如先要掌握其技術的概念,概念之間的聯絡
然後進階學習,直到掌握此概念;進而是應用這些概念進行相關技術的一些操作,從操作層面理解這些概念
2,製作學習目標及目的時,一定要明確,要有可操作性,如不明確在測試前繼續分解,以免測試中迷失自己浪費時間;
以PLSQL_PROFILER包學習來說,目標要具體,即要掌握PLSQL_PROFILER_DATA,RUNS_UNITS表的含義及每個列的作用;
到哪兒去獲了這些資訊,一般是官方手冊或者上網查資料
3,往往一個技術要涉及到多個問題,在制定目標時,每進行一個小目標時,就進行專題分析,不要圖快,最終什麼也沒學好;
只有每個小目標學好,最終可以掌握這個技術的使用;比如PLSQL表的關係,PLSQL表的重要列的含義
----------------------------------------
SQL> conn scott/system
已連線。
SQL> exec dbms_profiler.start_profiler('test profiler');
PL/SQL 過程已成功完成。
SQL> create table t_profiler(a int,b int);
表已建立。
SQL> insert into t_profiler(a,b) values(1,1);
已建立 1 行。
SQL> insert into t_profiler(a,b) values(12,12);
已建立 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_profiler.stop_profiler;
PL/SQL 過程已成功完成。
SQL> desc plsql_profiler_runs;
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
RUNID NOT NULL NUMBER
RELATED_RUN NUMBER
RUN_OWNER VARCHAR2(32)
RUN_DATE DATE
RUN_COMMENT VARCHAR2(2047)
RUN_TOTAL_TIME NUMBER
RUN_SYSTEM_INFO VARCHAR2(2047)
RUN_COMMENT1 VARCHAR2(2047)
SPARE1 VARCHAR2(256)
RELATED_RUN NUMBER
RUN_OWNER VARCHAR2(32)
RUN_DATE DATE
RUN_COMMENT VARCHAR2(2047)
RUN_TOTAL_TIME NUMBER
RUN_SYSTEM_INFO VARCHAR2(2047)
RUN_COMMENT1 VARCHAR2(2047)
SPARE1 VARCHAR2(256)
--RUN_TOTAL_TIME是以納秒計的執行時間
SQL> select runid,run_owner,to_char(run_date,'yyyymmdd hh24:mi:ss'),run_comment,
run_total_time,run_system_info from plsql_profiler_runs;
SQL> select runid,run_owner,to_char(run_date,'yyyymmdd hh24:mi:ss'),run_comment,
run_total_time,run_system_info from plsql_profiler_runs;
RUNID RUN_OWNER TO_CHAR(RUN_DATE,
---------- -------------------------------- -----------------
RUN_COMMENT
--------------------
---------- -------------------------------- -----------------
RUN_COMMENT
--------------------
RUN_TOTAL_TIME
--------------
RUN_SYSTEM_INFO
----------------------
--------------
RUN_SYSTEM_INFO
----------------------
2 SCOTT 20120911 10:08:10
test profiler
7.5532E+10
test profiler
7.5532E+10
---從如下分析看,DBMS_PROFILER包不能分析DML和SELECT單個語句的執行效能
SQL> select line#||' :'||text from all_source where wner='PROFILER';
select line#||' :'||text from all_source where wner='PROFILER'
*
第 1 行出現錯誤:
ORA-00904: "LINE#": 識別符號無效
SQL> select line||' :'||text from all_source where wner='PROFILER';
未選定行
SQL> show user
USER 為 "SCOTT"
SQL> select line||' :'||text from all_source where wner='SCOTT';
USER 為 "SCOTT"
SQL> select line||' :'||text from all_source where wner='SCOTT';
未選定行
--根據PLSQL_PROFILER_RUNS的RUNID及RUN_COMMENT從下2表獲取儲存過程執行的相關時間及執行次數資訊
1 select u.runid,u.unit_name,u.unit_type,d.line#,d.total_occur,d.total_time,d
max_time,d.min_time
2 from plsql_profiler_units u join
3 plsql_profiler_data d
4 on u.runid=d.runid and u.unit_number=d.unit_number
5* where u.runid=4 order by u.unit_name,d.line#
max_time,d.min_time
2 from plsql_profiler_units u join
3 plsql_profiler_data d
4 on u.runid=d.runid and u.unit_number=d.unit_number
5* where u.runid=4 order by u.unit_name,d.line#
UNID UNIT_NAME UNIT_TYPE LINE# TOTAL_OCCUR TOTAL_TIME MAX_TIME MIN_TIME
---- ------------ ---------- ----- ----------- ---------- ---------- ----------
4 ANONYMOUS 1 1 1152 1152 1152
BLOCK
4 ANONYMOUS 1 2 116605 109359 1653
BLOCK
4 ANONYMOUS 1 3 79497 71735 1763
BLOCK
4 ANONYMOUS 1 2 95798 89464 2219
BLOCK
UNID UNIT_NAME UNIT_TYPE LINE# TOTAL_OCCUR TOTAL_TIME MAX_TIME MIN_TIME
---- ------------ ---------- ----- ----------- ---------- ---------- ----------
4
BLOCK
4 PROC_ZXY PROCEDURE 1 0 5236 5236 5236
4 PROC_ZXY PROCEDURE 5 1 16421901 16421901 16421901
4 PROC_ZXY PROCEDURE 6 1 16420438 16420438 16420438
4 PROC_ZXY PROCEDURE 7 1 3167 3167 3167
已選擇9行。
上述測試問題:
1,為何執行儲存過程會出現UNIT_TYPE的ANONYMOUS BLOCK,它與PROCEDURE有何關係
1,測試下函式,會有此情況嗎
2,其它情況分析
3,經分析,執行FUNCTION函式時了, 也會產生2個匿名塊的RUNID而且LINE#全是1,
這種型別的資料不能在ALL_SOURCE中查出,因為沒有與之型別匹配
2,執行一個儲存過程為何會出現2個RUNID,要加深對於PLSQL_PROFILER_RUNS表的各個列理解
1,儲存過程及函式分別測試,是否會出現2個RUNID
1* select runid,to_char(run_date,'yyyymmdd hh24:mi:ss'),run_comment from plsql
profiler_runs
1,為何執行儲存過程會出現UNIT_TYPE的ANONYMOUS BLOCK,它與PROCEDURE有何關係
1,測試下函式,會有此情況嗎
2,其它情況分析
3,經分析,執行FUNCTION函式時了, 也會產生2個匿名塊的RUNID而且LINE#全是1,
這種型別的資料不能在ALL_SOURCE中查出,因為沒有與之型別匹配
2,執行一個儲存過程為何會出現2個RUNID,要加深對於PLSQL_PROFILER_RUNS表的各個列理解
1,儲存過程及函式分別測試,是否會出現2個RUNID
1* select runid,to_char(run_date,'yyyymmdd hh24:mi:ss'),run_comment from plsql
profiler_runs
RUNID TO_CHAR(RUN_DATE, RUN_COMMENT
--------- ----------------- ------------------------------
2 20120911 10:08:10 test profiler
3 20120911 11:09:26 test procedure
4 20120911 11:11:57 test procedure
5 20120911 14:12:14 other_func_zxy --表中儲存了執行一次函式FUNC_ZXY的RUNID為5的記錄了
--------- ----------------- ------------------------------
2 20120911 10:08:10 test profiler
3 20120911 11:09:26 test procedure
4 20120911 11:11:57 test procedure
5 20120911 14:12:14 other_func_zxy --表中儲存了執行一次函式FUNC_ZXY的RUNID為5的記錄了
--再次執行FUNC_ZXY函式,看是否另儲存一條記錄在上述的表中
QL> exec dbms_profiler.start_profiler('other_fun_zxy_2');
QL> exec dbms_profiler.start_profiler('other_fun_zxy_2');
L/SQL 過程已成功完成。
QL> select func_zxy from dual;
UNC_ZXY
-------------
1-9月 -12
-------------
1-9月 -12
QL> exec dbms_profiler.stop_profiler;
L/SQL 過程已成功完成。
QL> select runid,to_char(run_date,'yyyymmdd hh24:mi:ss'),run_comment from plsql
profiler_runs;
profiler_runs;
RUNID TO_CHAR(RUN_DATE, RUN_COMMENT
--------- ----------------- ------------------------------
2 20120911 10:08:10 test profiler
3 20120911 11:09:26 test procedure
4 20120911 11:11:57 test procedure
5 20120911 14:12:14 other_func_zxy
6 20120911 14:27:41 other_fun_zxy_2
--------- ----------------- ------------------------------
2 20120911 10:08:10 test profiler
3 20120911 11:09:26 test procedure
4 20120911 11:11:57 test procedure
5 20120911 14:12:14 other_func_zxy
6 20120911 14:27:41 other_fun_zxy_2
小結:同一個儲存過程或函式多次執行會儲存多條記錄,是以RUNID區別,以RUN_COMMENT及RUN_DATE來區別的
目標:學習表plsql_profiler_units
1,瞭解此表結構
此表與PLSQL_PROFILER_RUNS相對應關聯,即RUNID來關聯,一條PLSQL_PROFILER_RUNS對應一條PLSQL_PROFILER_UNITS記錄
另發現此表也儲存關於匿名塊的記錄,即儲存過程執行多次,在此表會出現多次記錄,即多個RUNID,但每次的UNIT_NAME和UNIT_NUMBER是一樣的
2,測試多次執行函式此表資料的變化規則,更好理解此表的結構含義
此表與PLSQL_PROFILER_RUNS相對應關聯,即RUNID來關聯,一條PLSQL_PROFILER_RUNS對應一條PLSQL_PROFILER_UNITS記錄
另發現此表也儲存關於匿名塊的記錄,即儲存過程執行多次,在此表會出現多次記錄,即多個RUNID,但每次的UNIT_NAME和UNIT_NUMBER是一樣的
2,測試多次執行函式此表資料的變化規則,更好理解此表的結構含義
SQL> select unit_name,unit_number from plsql_profiler_units
UNIT_NAME UNIT_NUMBER
-------------------------------- -----------
1
2
3
4
1
2
1
2
3
PROC_ZXY 4
5
-------------------------------- -----------
PROC_ZXY 4
UNIT_NAME UNIT_NUMBER
-------------------------------- -----------
6
1
FUNC_ZXY 2
3
1
FUNC_ZXY 2
3
-------------------------------- -----------
FUNC_ZXY 2
FUNC_ZXY 2
已選擇18行。
目標:學習PLSQL_PROFILER_DATA表
SQL> select unit_name,unit_number from plsql_profiler_units where runid=5;
SQL> select unit_name,unit_number from plsql_profiler_units where runid=5;
UNIT_NAME UNIT_NUMBER
-------------------------------- -----------
1
FUNC_ZXY 2 --確定執行過函式FUNC_ZXY的UNIT_NUMBER,用它和RUNID來唯一確定PLSQL_PROFILER_DATA關於執行此函式的相關資料
--如果不加UNIT_NUMBER,會有匿名塊的資料
3
-------------------------------- -----------
FUNC_ZXY 2 --確定執行過函式FUNC_ZXY的UNIT_NUMBER,用它和RUNID來唯一確定PLSQL_PROFILER_DATA關於執行此函式的相關資料
--如果不加UNIT_NUMBER,會有匿名塊的資料
SQL> select unit_name,unit_number from plsql_profiler_units where runid=5 and un
it_number=2;
it_number=2;
UNIT_NAME UNIT_NUMBER
-------------------------------- -----------
FUNC_ZXY 2
-------------------------------- -----------
FUNC_ZXY 2
--
SQL> select runid,unit_number,line#,total_occur,total_time from plsql_profiler_d
ata where runid=5 and unit_number=2;
SQL> select runid,unit_number,line#,total_occur,total_time from plsql_profiler_d
ata where runid=5 and unit_number=2;
RUNID UNIT_NUMBER LINE# TOTAL_OCCUR TOTAL_TIME
---------- ----------- ---------- ----------- ----------
5 2 1 0 7606
5 2 6 1 254246
5 2 7 1 1698
5 2 8 1 6594
---------- ----------- ---------- ----------- ----------
5 2 1 0 7606
5 2 6 1 254246
5 2 7 1 1698
5 2 8 1 6594
小結:
1,PLSQL_PROFILER_DATA與PLSQL_PROFILER_UNITS是1:N的關係,DATA表是執行過函式和過程的細節資料
2,透過關聯ALL_SOURCE可以定位每行函式或儲存過程的程式碼,進一步分析]
1,PLSQL_PROFILER_DATA與PLSQL_PROFILER_UNITS是1:N的關係,DATA表是執行過函式和過程的細節資料
2,透過關聯ALL_SOURCE可以定位每行函式或儲存過程的程式碼,進一步分析]
總結:
1,把複雜的問題分解化,而且分解要具體化,要有可操作性
這樣才能透過不同角度理解問題,進而掌握技術應用
2, 學習不能急,每碰到問題,標題每步碰到什麼問題,不能饒過
因為可能往往這個問題就和你下面要學習的某些知識點有關係
3,邊作測邊整理文件,不要測試完了再整理
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-743140/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PLSQL學習-【7儲存過程、函式】SQL儲存過程函式
- 儲存過程 函式儲存過程函式
- 儲存過程與儲存函式儲存過程儲存函式
- openGauss 函式及儲存過程支援函式儲存過程
- Mysql 的儲存過程和儲存函式MySql儲存過程儲存函式
- 用dbms_profiler調優儲存過程儲存過程
- 儲存過程與函式儲存過程函式
- mysql儲存過程及日期函式實踐MySql儲存過程函式
- 使用dbms_profiler測試儲存過程效能儲存過程
- day25-索引和函式及儲存過程索引函式儲存過程
- 我的MYSQL學習心得(10) : 自定義儲存過程和函式MySql儲存過程函式
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程 (即函式)MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- mySql 儲存過程與函式MySql儲存過程函式
- SQL server儲存過程函式SQLServer儲存過程函式
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- (Oracle)儲存過程、儲存函式和包的相關知識與例項Oracle儲存過程儲存函式
- mysql儲存函過程和儲存函式都屬於儲存程式MySql儲存函式
- 儲存過程和函式的區別儲存過程函式
- oracle 儲存過程學習Oracle儲存過程
- 儲存過程學習教材儲存過程
- Oracle儲存過程學習Oracle儲存過程
- 儲存過程vs.函式QM儲存過程函式
- mysql儲存過程基本函式(轉)MySql儲存過程函式
- Mysql 5.7儲存過程的學習MySql儲存過程
- DBMS_PROFILER 檢視儲存過程執行時間儲存過程
- mysql儲存過程procedure、函式function的用法MySql儲存過程函式Function
- PL/SQL 中的儲存過程與函式SQL儲存過程函式
- 【Mysql】Mysql儲存過程學習MySql儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- MySQL自定義函式與儲存過程MySql函式儲存過程
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- MySQL 5.5 建立儲存過程和函式MySql儲存過程函式
- MySQL4:儲存過程和函式MySql儲存過程函式
- 函式儲存過程併發控制-案例函式儲存過程
- 【MSSQL】sqlserver 各種判斷是否存在(表名、函式、儲存過程.......)SQLServer函式儲存過程
- Sql Server判斷資料庫、表、儲存過程、函式是否存在SQLServer資料庫儲存過程函式