例: ステートメントの実行に関連したアクティビティー情報のキャプチャー

実行に長い時間を要しているステートメントを特定する場合は、あるしきい値を定義して、そのしきい値を超えた場合にそのステートメントの実行に関する情報をアクティビティー・イベント・モニターにキャプチャーさせることができます。 その後、ステートメントの実行情報を、アクティビティー・イベント・モニターによって収集された情報と関連付けて、スローダウンの原因となった可能性のある事柄について詳しく理解するのに役立つアクティビティー・メトリックを表示することができます。

始める前に

アクティビティー情報をキャプチャーする前に、 問題のステートメントを特定する必要があります。例えば、ユーザーまたはアプリケーション開発者が、 ある特定のステートメントの実行時間が想定より長いと訴えてくる場合もあるでしょう。 または、パッケージ・キャッシュ・イベント・モニターを使用して、 実行に時間がかかっているステートメントを自分で特定する場合もあるでしょう。

このタスクについて

以下の例の場合、調査対象の照会は、アプリケーションの一部として実行されています。 照会は以下のとおりです。
SELECT DISTINCT PARTS_BIN FROM STOCK WHERE PART_NUMBER = ?
スローダウンの理由として考えられることの 1 つとして、データ分布が好ましくない場合があります。 例えば、STOCK 表にはほとんどの部品番号に関しては数行しか含まれておらず、特定の 1 つの部品番号については数千行にも及ぶので、この SELECT ステートメントの実行に時間がかかる場合があります。 以下の例は、先行する照会に関連付けられたアクティビティーにより、パラメーター・マーカー (?) に対して処理される実際の値を取得する方法を示しています。

プロシージャー

照会の実行が低下した原因がデータ分布が適切でないためであるという推測をテストするには、該当のステートメントにしきい値を作成できます。 その後、このしきい値とアクティビティー・イベント・モニターを使用して、そのステートメントの実行に関する情報をキャプチャーできます。 この情報から、想定よりも長く実行された照会によって処理された実際の値を判定できます。

  1. 該当のステートメントのしきい値を作成します。その際、ステートメントが 10 秒を超えて実行されると、しきい値違反イベントが発生するように指定します。
    CREATE THRESHOLD TH1
        FOR STATEMENT TEXT 'SELECT DISTINCT PARTS_BIN 
        FROM STOCK WHERE PART_NUMBER = ?' ACTIVITIES
        ENFORCEMENT DATABASE
        WHEN ACTIVITYTOTALTIME > 10 SECONDS 
        COLLECT ACTIVITY DATA WITH DETAILS, SECTION AND VALUES
        CONTINUE
  2. しきい値違反を記録するためのしきい値イベント・モニターを作成します。
    CREATE EVENT MONITOR STMT_THRESH_VIOLATIONS 
      FOR THRESHOLD VIOLATIONS 
      WRITE TO TABLE
      AUTOSTART
    
  3. 詳細なアクティビティー情報を記録するためのアクティビティー・イベント・モニターを作成します。
    CREATE EVENT MONITOR ACTIVITIES 
       FOR ACTIVITIES 
       WRITE TO TABLE
    
  4. 新しいイベント・モニターを使用可能にします。
    SET EVENT MONITOR ACTIVITIES STATE 1
    SET EVENT MONITOR STMT_THRESH_VIOLATIONS STATE 1
  5. ステートメントを実行するアプリケーションを実行します。 しきい値違反が生じると、 しきい値違反についての情報がしきい値違反イベント・モニター STMT_THRESH_VIOLATIONS によって記録され、 しきい値違反に関連したアクティビティーについての情報がアクティビティー・イベント・モニター ACTIVITIES によって記録されます。
  6. しきい値違反が発生したかどうかを判断するには、 手順1 で定義したTH1 に対するしきい値イベントモニターで記録された違反の数を照会します。 この照会を実行するには、ビュー SYSCAT.THRESHOLDS を、しきい値違反情報が含まれているしきい値イベント・モニターによって生成された表と結合してください。 しきい値名 TH1 は SYSCAT.THRESHOLDS に保持されているため、この結合が必要です。
    SELECT COUNT(1) NUM_VIOLATIONS
            FROM THRESHOLDVIOLATIONS_DB2THRESHOLDVIOLATIONS T
            JOIN SYSCAT.THRESHOLDS S ON T.THRESHOLDID = S.THRESHOLDID
            WHERE S.THRESHOLDNAME = 'TH1';
    
    
    NUM_VIOLATIONS          
    --------------
              1
    
      1 record(s) selected.
    このケースでは、1つのしきい値違反がありました。 ステップ1 で特定されたステートメントの実行が1回、10秒以上かかりました。
  7. 1.で特定したステートメント内のパラメータマーカー (?) で表されるデータ(部品番号)を調査します。
    次の例では、SELECT ステートメントによって、アクティビティー・イベント・モニターが生成した ACTIVITYVALS 表の 1 つから、パラメーター・マーカーの値 (SQL 内の後ろの STMT_VALUE_DATA によって表される) が取得されます。
    SELECT SUBSTR(V.STMT_VALUE_DATA, 1, 80) PARAM_MARKER_VALUE
            FROM ACTIVITYVALS_ACTIVITIES V   
            JOIN THRESHOLDVIOLATIONS_STMT_THRESH_VIOLATIONS T
              ON T.APPL_ID = V.APPL_ID
              AND T.UOW_ID = V.UOW_ID
              AND T.ACTIVITY_ID = V.ACTIVITY_ID
            JOIN SYSCAT.THRESHOLDS S
              ON T.THRESHOLDID = S.THRESHOLDID
            WHERE S.THRESHOLDNAME = 'TH1';
    
    前述の例の場合、select ステートメントによって、アクティビティー・イベント・モニターによって生成された表の 1 つから、パラメーター・マーカーの値 (STMT_VALUE_DATA) が取得されます。
    
    PARAM_MARKER_VALUE
    --------------------------------------------------------------------------------
    475299
  8. これで、長期間実行されていたステートメントに関連した PART_NUMBER の値が分かったので、STOCK 表を調べて、照会の時間を長くした原因となっている可能性のあるその部品番号が表に出現するかどうかを確認できます。 例えば、PART_NUBMER の値が 475299 である行数が (その他の部品番号の行数と比較して) 多ければ、それが原因で、この値が使用された場合に照会の実行時間が長くなっている可能性があります。

変化形: 実行可能 ID を使用しているステートメントに対するしきい値の定義

前述の例では、 ステップ1で閾値が明示的に特定されており、ステートメントの実際のテキストを使用しています。 しきい値を間接的に定義することも可能で、その場合にはパッケージ・キャッシュに含まれるステートメントの実行可能 ID を指定します。 例えば、しきい値を次のように定義できます。
CREATE THRESHOLD TH1
   FOR STATEMENT REFERENCE 
     x'0100000000000000020000000000000000000000020020100304162158584850' ACTIVITIES
   ENFORCEMENT DATABASE
   WHEN ACTIVITYTOTALTIME > 10 SECONDS 
   COLLECT ACTIVITY DATA WITH DETAILS, SECTION AND VALUES
   CONTINUE;
この例では、STATEMENT REFERENCE というキーワードに続く実行可能 ID を使用して、パッケージ・キャッシュ内で対応するステートメント・テキストを検索しています。 ステートメントの実行可能 ID は、パッケージ・キャッシュを調べることにより判別できます。 パッケージキャッシュに含まれる情報の表示方法の詳細については、ステートメントの実行可能IDなど、 パフォーマンスチューニングの候補となるステートメントを識別するためのパッケージキャッシュ情報の使用を参照してください

パッケージ・キャッシュでその実行可能 ID が検出される場合、パッケージ・キャッシュから関連するステートメント・テキストが取得されて、ステートメントしきい値の定義に使用されます。 静的 SQL セクションのステートメントの場合、実行可能 ID がパッケージ・キャッシュに存在しない場合、そのステートメント・テキストはシステム・カタログから取得されます。 動的 SQL セクションのステートメントの場合、PREPARE ステートメントを使用して、そのステートメント・ストリングから準備済みステートメントを作成することを考慮してください。 実行可能 ID がパッケージ・キャッシュにもシステム・カタログにも見つからない場合は、エラー (SQL4721N) が戻されます。