XML 文書にあるメトリック・モニター・エレメントを表の行として表示する

イベント・モニターから返された XML 文書に含まれるメトリック関連の情報を表示する方法の 1 つに、各モニター・エレメントが単独の行で表示されるフォーマットに情報を変換するという方法があります。 このフォーマットは、テキスト・ベースのフォーマットで情報を表示したいが、調べるモニター・エレメントが具体的に分かっていない場合に便利です。

このタスクについて

さまざまなモニター・インターフェースから返される XML 文書にあるメトリック情報を行ベースのフォーマットで表示するには、MON_FORMAT_XML_*_BY_ROW 表関数を使用します。

手順

このタスクで示す例では、MON_FORMAT_XML_TIMES_BY_ROW 表関数を使用して、パッケージ・キャッシュ・イベント・モニターによって追跡されたステートメントのコンポーネント時間を表示します。 PKGCACHEEVENTS というパッケージ・キャッシュ・イベント・モニターを作成済みであり、活動化されているとします。パッケージ・キャッシュ・イベント・モニターは、その出力を未フォーマット・イベント (UE) 表に書き込みます。この出力情報を使用するには、UE 表のデータを EVMON_FORMAT_UE_TO_TABLES ストアード・プロシージャーを使用してリレーショナル表に変換するか、または EVMON_FORMAT_UE_TO_XML 表関数を使用して XML に変換する必要があります。 このタスクでは、2 つのアプローチのうちの最初のアプローチを示します。

  1. まず、EVMON_FORMAT_UE_TO_TABLES プロシージャーを使用して、パッケージ・キャッシュ・イベント・モニターが書き込んだ未フォーマット・イベント (UE) 表を、リレーショナル表に変換します。
    call EVMON_FORMAT_UE_TO_TABLES ('PkgCache',NULL,NULL,NULL,NULL,NULL,
         NULL,0,'SELECT * FROM PKGCACHEEVENTS')
    このプロシージャーは、次の 2 つの表を作成します。
    • 1 つは PKGCACHE_EVENT という表であり、この表には METRICS という列があります。 この列自体に、メトリック・モニター・エレメントのある XML 文書が含まれます。
    • もう 1 つは PKGCACHE_METRICS という表です。
      注: PKGCACHE_EVENT 表の METRICS 列からメトリックを抽出するのではなく、PKGCACHE_METRICS の列にあるメトリックを直接表示することもできます。 ただし、PKGCACHE_METRICS を調べる場合は、行ではなく列にメトリックが表示されます。したがって、例えば値が大きいメトリックのランキングを把握するのは、それほど容易なことではありません。
  2. 実行時間の点で最もコストがかかっているステートメントを判別するために、前のステップで生成された 2 つの表に対して次の照会を実行します。
    SELECT EVENTS.EXECUTABLE_ID, 
           SUM(METRICS.STMT_EXEC_TIME) AS TOTAL_STMT_EXEC_TIME
    FROM   PKGCACHE_EVENT AS EVENTS, 
           PKGCACHE_METRICS AS METRICS 
    WHERE  EVENTS.XMLID = METRICS.XMLID 
    GROUP  BY EVENTS.EXECUTABLE_ID
    ORDER  BY TOTAL_STMT_EXEC_TIME DESC
    FETCH  FIRST 5 ROWS ONLY
    この照会では、ステップ 1 で生成された 2 つの表が結合されます。その結果、PKGCACHE_EVENT 表にある各ステートメント ID が、PKGCACHE_METRICS 表にあるそれぞれの実行時間と関連付けられ、以下のようになります。
    EXECUTABLE_ID                                                       TOTAL_STMT_EXEC_TIME
    ------------------------------------------------------------------- --------------------
    x'01000000000000001A0300000000000000000000020020091215115933859000'                  250
    x'0100000000000000150300000000000000000000020020091215115850328000'                  191
    x'0100000000000000210200000000000000000000020020091215115818343001'                  129
    x'0100000000000000C40200000000000000000000020020091215115838578000'                   41
    x'0100000000000000B00200000000000000000000020020091215115838203000'                   38
    
      5 record(s) selected.
    結果の最初の項目が、全体実行時間が最大のステートメントを表しています。
  3. オプション: 必要であれば、そのステートメントのテキストを、次の SQL を使用することによって表示できます。
    SELECT SUBSTR(STMT_TEXT,1,60) AS STMT_TEXT 
    FROM PKGCACHE_EVENT 
    WHERE EXECUTABLE_ID = x'01000000000000001A0300000000000000000000020020091215115933859000'
    結果:
    STMT_TEXT
    ------------------------------------------------------------
    DROP XSROBJECT MYSCHEMA.EVMON_PKGCACHE_SCHEMA_SQL09070
    
      1 record(s) selected.
  4. ステップ 2 で識別したステートメントの消費時間モニター・エレメントのリストを、次のように MON_FORMAT_XML_TIMES_BY_ROW 表関数を使用して表示します。
    SELECT SUBSTR(XMLMETRICS.METRIC_NAME,1,30) AS METRIC_NAME,
           XMLMETRICS.TOTAL_TIME_VALUE, 
           SUBSTR(XMLMETRICS.PARENT_METRIC_NAME,1,30) AS PARENT_METRIC_NAME
    FROM PKGCACHE_EVENT AS EVENTS, 
         TABLE(MON_FORMAT_XML_TIMES_BY_ROW(EVENTS.METRICS)) AS XMLMETRICS 
    WHERE EVENTS.EXECUTABLE_ID=
    x'01000000000000001A0300000000000000000000020020091215115933859000' 
     AND PARENT_METRIC_NAME='STMT_EXEC_TIME'
    ORDER BY XMLMETRICS.TOTAL_TIME_VALUE DESC
    
    注 :
    • 消費時間モニター・エレメントは階層的に編成されていることに注意してください。 二重カウントをなくすために、stmt_exec_time に累積されるメトリックのみを結果に含めています。 そうしないと、個別のコンポーネント時間をいくつも含んでいる stmt_exec_time 自体が結果に入ってしまうことになります。
    • PARENT_METRIC_NAME (MON_FORMAT_XML_TIMES_BY_ROW が返す列の 1 つ) を使用しているのは、例示が目的です。
    実行すると、この照会から次の結果が返されます。
    METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
    ------------------------------ -------------------- ------------------------------
    TOTAL_ACT_WAIT_TIME                             234 STMT_EXEC_TIME
    TOTAL_SECTION_PROC_TIME                          15 STMT_EXEC_TIME
    これから、合計処理時間が 249 ms になることが分かります。この時間をステップ 2 で示された合計時間の 250 と比較した場合の余分のミリ秒は、stmt_exec_time に含まれていない他の時間 (例えば待機) と見なすことができます。

タスクの結果

前の例の結果は、メトリックが特別な配置になっているのが分かります。つまり、行指向フォーマットになっており、1 行につき 1 つのメトリックが表示されています。 このアプローチを使用することのメリットは、調べるメトリックつまりモニター・エレメントを前もって分かっておく必要がないという点にあります。 時間を消費するメトリックの内の上位 5 個のメトリック、または特定の値範囲に入るメトリックを確認する場合は、知りたい結果を返す照会を簡単に作成できます。 一方、XMLTABLE 関数を使用してモニター・エレメントを列として表示する場合は、表示するモニター・エレメントを指定する (またはすべてを表示する) 必要があります。

MON_GET_*_DETAILS 表関数によって生成された DETAILS 列の内容を表示する

MON_FORMAT_XML_*_BY_ROW 関数を使用して、MON_GET_*_DETAILS 関数のいずれかが返した DETAILS 列の内容を表示することもできます。 例えば MON_GET_CONNECTION_DETAILS は、データベース接続に関連したメトリックのある XML 文書を含んだ DETAILS 列を返します。

例えば、全メンバーの各接続のゼロ以外のコンポーネント時間を表示するには、次の照会を使用できます。
SELECT CONDETAILS.APPLICATION_HANDLE, 
       SUBSTR(XMLMETRICS.METRIC_NAME,1,30) AS METRIC_NAME, 
       SUM(XMLMETRICS.TOTAL_TIME_VALUE) AS TOTAL_TIME_VALUE, 
       SUBSTR(XMLMETRICS.PARENT_METRIC_NAME,1,30) AS PARENT_METRIC_NAME
FROM TABLE(MON_GET_CONNECTION_DETAILS(NULL,-1)) AS CONDETAILS, 
     TABLE(MON_FORMAT_XML_COMPONENT_TIMES_BY_ROW(CONDETAILS.DETAILS))AS XMLMETRICS 
WHERE TOTAL_TIME_VALUE > 0 AND XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME'
GROUP BY CONDETAILS.APPLICATION_HANDLE, 
         XMLMETRICS.PARENT_METRIC_NAME, 
         XMLMETRICS.METRIC_NAME
ORDER BY CONDETAILS.APPLICATION_HANDLE ASC, TOTAL_TIME_VALUE DESC
注 :
  • 二重カウントをなくすために、total_rqst_time に累積されるメトリックのみを結果に含めています (WHERE .... XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME')。そうしないと、個別のコンポーネント時間をいくつも含んでいる total_rqst_time 自体が結果に入ってしまうことになります。
  • PARENT_METRIC_NAME (MON_FORMAT_XML_COMPONENT_TIMES_BY_ROW が返す列の 1 つ) を使用しているのは、例示が目的です。
この照会は、以下の結果を返します。
APPLICATION_HANDLE   METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
-------------------- ------------------------------ -------------------- ------------------------------
                  52 TOTAL_SECTION_TIME                             3936 TOTAL_RQST_TIME
                  52 TOTAL_COMPILE_TIME                              482 TOTAL_RQST_TIME
                  52 TOTAL_COMMIT_TIME                                15 TOTAL_RQST_TIME
                  52 TOTAL_ROLLBACK_TIME                               1 TOTAL_RQST_TIME
                 496 TOTAL_COMPILE_TIME                              251 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_TIME                               46 TOTAL_RQST_TIME
                 496 TOTAL_IMPLICIT_COMPILE_TIME                       5 TOTAL_RQST_TIME

  7 record(s) selected.
この例が示すとおり、total_rqst_time を構成するメトリックのみが含まれています。 仮に WHERE .... XMLMETRICS.PARENT_METRIC_NAME='TOTAL_RQST_TIME' 節がこの照会に含まれていなかったとすると、結果は次のようなものになります。
APPLICATION_HANDLE   METRIC_NAME                    TOTAL_TIME_VALUE     PARENT_METRIC_NAME
-------------------- ------------------------------ -------------------- ------------------------------
                  52 TOTAL_RQST_TIME                                4603 -
                  52 TOTAL_SECTION_TIME                             3942 TOTAL_RQST_TIME
                  52 TOTAL_COMPILE_TIME                              537 TOTAL_RQST_TIME
                  52 TOTAL_SECTION_SORT_TIME                         299 TOTAL_SECTION_TIME
                  52 TOTAL_COMMIT_TIME                                15 TOTAL_RQST_TIME
                  52 TOTAL_ROLLBACK_TIME                               1 TOTAL_RQST_TIME
                 496 TOTAL_RQST_TIME                                 341 -
                 496 TOTAL_COMPILE_TIME                              251 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_TIME                               46 TOTAL_RQST_TIME
                 496 TOTAL_IMPLICIT_COMPILE_TIME                       5 TOTAL_RQST_TIME
                 496 TOTAL_SECTION_SORT_TIME                           2 TOTAL_SECTION_TIME

  11 record(s) selected.
この場合は、各接続の total_rqst_time の値が結果に含まれていますが、親であるこの total_rqst_time は、子である他のすべてのエレメントの値を含んでいます。 同様に、イタリック で示した項目の値は total_section_time に累積されています。 これらは、WHERE 節で除外されていなければ、結果で三重カウントされることになります。total_section_time 自体が total_rqst_time に累積されているためです。