dbms_の使用profiler収集ストレージ・プロシージャのステップごとの実行時間

4117 ワード

最近、最適化チームの専門家が学んだ意味のある組み込みパッケージ:dbms_Profilerは、Oracleストレージ・プロセスの各セグメント・コードの時間オーバーヘッドを分析し、パフォーマンスのボトルネックを迅速に特定するためのステップです.
  • 1.sys dbms_の作成profiler
  • 2.profilerユーザを作成し、テーブルとシーケンスに対応し、
  • を付与する.
  • 3.sysテーブルとシーケンスのpublic同義語
  • を作成
  • 4.dbms_を使用profiler収集実行時間情報
  • 5.結果の照会と分析
  • 1.sys dbms_の作成profiler
    conn /as sysdba
    desc dbms_profiler    --   dbms_profiler     ,               
    @?/rdbms/admin/profload.sql

    注意:ファイル%ORACLE_HOME%RDBMSADMINprofload.sql主要関数:start_profiler起動プログラム監視stop_profilerはプログラムの監視を終了します
    2.profilerユーザーの作成、対応するテーブルとシーケンス、権限付与
    conn / as sysdba;
    CREATE USER profiler IDENTIFIED BY profiler;
    grant connect,resource to profiler;
    conn profiler/profiler;
    @?/rdbms/admin/proftab.sql
    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--prof運転情報plsql_profiler_units--prof各ユニット情報plsql_profiler_data--prof各ユニットの詳細plsql_profiler_runnumber--profの一意の実行番号を生成するシーケンス
    3.sysテーブルとシーケンスのpublic同義語の作成
    conn /as sysdba;
    CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;
    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;

    4.dbms_の使用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;
    /

    ストアド・プロシージャの実行時間情報を収集する方法は、次のとおりです.
    set serverout on;
     DECLARE
        v_run_number   integer;
        v_temp1        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.結果の照会と分析
    set linesize 1000
    col text format a60
    SELECT   d.line#,                      --    
        s.text,                            --   
           d.total_time,                   --      (  10     , 10 -9  。)
           d.total_occur,                  --      
           d.min_time,                     --      
           d.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  d.total_time desc, u.unit_number, d.line#;

    サンプル・クエリーの結果は次のとおりです.
         LINE# TEXT                                   TOTAL_TIME TOTAL_OCCUR   MIN_TIME   MAX_TIME
    ---------- -------------------------------------- ---------- ----------- ---------- ----------
             6        insert into t_t1 values(x);      150147563       10000      13108    3831882
             4    for x in 1..10000                       613220       10001         26       7514
             8    commit;                                  75630           1      75630      75630
             9 end sp_profiler_test1;                       1683           1       1683       1683
    
    Elapsed: 00:00:01.39

    説明:LINE#は、TEXTに対応する文のストアド・プロシージャの数行目、TOTAL_を表します.TIMEは実行の総時間(単位ns,10の負の9乗の秒)を表して、TOTAL_OCCURは実行回数を表し、MIN_TIMEは最短1回の運転時間を表し、MAX_TIMEは、最長1回の実行時間を表します.この例では、ストレージ・プロシージャSP_PROFILER_TEST 1の6行目のコードinsert into t_t1 values(x);の消費時間の割合が最も大きく,このステップは総消費150 msで10000回実行され,単回実行は最短13108 ns,最長3.83 msであった.