學習DBMS_PROFILER包診斷儲存過程及函式的情能及引申思考

wisdomone1發表於2012-09-11
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
已連線。
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)
--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;
     RUNID RUN_OWNER                        TO_CHAR(RUN_DATE,
---------- -------------------------------- -----------------
RUN_COMMENT
--------------------
RUN_TOTAL_TIME
--------------
RUN_SYSTEM_INFO
----------------------
         2 SCOTT                            20120911 10:08: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';
未選定行
--根據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#

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   ANONYMOUS      1           2   32016467   31893888       8288
                  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
    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的記錄了
 
--再次執行FUNC_ZXY函式,看是否另儲存一條記錄在上述的表中
QL> exec dbms_profiler.start_profiler('other_fun_zxy_2');
L/SQL 過程已成功完成。
QL> select func_zxy from dual;
UNC_ZXY
-------------
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;
    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
小結:同一個儲存過程或函式多次執行會儲存多條記錄,是以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,測試多次執行函式此表資料的變化規則,更好理解此表的結構含義
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
UNIT_NAME                        UNIT_NUMBER
-------------------------------- -----------
                                6
                                1
FUNC_ZXY                                   2
                                3
                                1
FUNC_ZXY                                   2
                                3
已選擇18行。
 
目標:學習PLSQL_PROFILER_DATA表
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
SQL> select unit_name,unit_number from plsql_profiler_units where runid=5 and un
it_number=2;
UNIT_NAME                        UNIT_NUMBER
-------------------------------- -----------
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;
     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
小結:
      1,PLSQL_PROFILER_DATA與PLSQL_PROFILER_UNITS是1:N的關係,DATA表是執行過函式和過程的細節資料
      2,透過關聯ALL_SOURCE可以定位每行函式或儲存過程的程式碼,進一步分析]
 
 
 
總結:
     1,把複雜的問題分解化,而且分解要具體化,要有可操作性
           這樣才能透過不同角度理解問題,進而掌握技術應用
     2,   學習不能急,每碰到問題,標題每步碰到什麼問題,不能饒過
           因為可能往往這個問題就和你下面要學習的某些知識點有關係
     3,邊作測邊整理文件,不要測試完了再整理
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
       

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

相關文章