IBM Support

[Db2] セクション実行時統計を取得する方法

How To


Summary

Db2 は SQL 実行時に、TBSCAN や IXSCAN、NLJOIN などの各オペレーターが実際に処理した行数をセクション実行時統計として記録できます。これを利用して SQL コンパイラーが実行計画を作成するときに予測した行数と、実際に処理した行数を比較し、実行計画が適切かどうかを評価できます。

Objective

以下のように、セクション実行時統計を収集した場合のアクセス・プランには見積もり行数と実際の行数が記録されます。
   Rows
Rows Actual
  RETURN
  (   1)
   Cost
    I/O
    |
  1.41917
   2093
  NLJOIN
  (   2)
  30.3135
    NA
この例では、オプティマイザーは統計情報をもとに 1.4 行程度が NLJOIN の結果として戻されると見積もりましたが、実際には 2093 行が戻されていることがわかります。
このようなオプティマイザーによる過小見積もりが発生している場合、適切なアクセス・プランが選択されていない場合があるため、統計情報の取得方法などを再検討することが推奨されます。

Environment

Db2 10.1 以降
Db2 9.7 でセクション実行時統計を採取する方法は以下のページを参照してください。

Steps

以下のすべての手順は、データベース管理者として SQL を実行するデータベースに接続済みと仮定しています。
  1. (事前準備) EXPLAIN 表が作成されていない場合は EXPLAIN 表を作成します。
    [Db2] Explain 表の作成方法と削除方法
  2. アクティビティー・イベント・モニターを作成します。
    db2 CREATE EVENT MONITOR ACTEVMON FOR ACTIVITIES WRITE TO TABLE MANUALSTART
  3. セクション実行時統計を採取するようにワークロードを構成します。用途に応じて適切なものを選択してください。
    1. 現在のデータベース接続でこれから実行する SQL が対象
      db2 "CALL WLM_SET_CONN_ENV(NULL, '<collectactdata>WITH DETAILS, SECTION</collectactdata>
      <collectactpartition>ALL</collectactpartition><collectsectionactuals>BASE</collectsectionactuals>')"
    2. 特定のユーザーやアプリケーションから実行される SQL が対象
      db2 "CREATE WORKLOAD WL1 SESSION_USER ('<auth_id>') APPLNAME ('<appl_name>') COLLECT ACTIVITY DATA ON COORDINATOR WITH DETAILS, SECTION INCLUDE ACTUALS BASE"
    3. データベースのデフォルト・ワークロードで実行されるすべての SQL が対象
      db2 ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT ACTIVITY DATA ON COORDINATOR WITH DETAILS, SECTION INCLUDE ACTUALS BASE
  4. イベント・モニターを有効化し、SQL のアクティビティー・データをキャプチャーします。
    db2 SET EVENT MONITOR ACTEVMON STATE 1
    [SQL の実行]
    db2 SET EVENT MONITOR ACTEVMON STATE 0
  5. イベント・モニター表を照会し、対象のアクティビティー情報を確認します。
    db2 "SELECT APPL_ID, UOW_ID, ACTIVITY_ID, VARCHAR(STMT_TEXT,200) FROM ACTIVITYSTMT_ACTEVMON"
  6. 上で確認したアクティビティー情報から、EXPLAIN_FROM_ACTIVITY プロシージャーを使って指定したスキーマの EXPLAIN 表にセクション実行時統計を含む EXPLAIN 情報を挿入します。
    db2 "CALL EXPLAIN_FROM_ACTIVITY( '<APPL_ID>', <UOW_ID>, <ACTIVITY_ID>, 'ACTEVMON', '<EXPLAIN 表のスキーマ>', ?, ?, ?, ?, ? )"
  7. 手順 6 で挿入した EXPLAIN 情報を db2exfmt でフォーマットします。
    db2exfmt -d <データベース名> -1 -o exfmt.out
運用上の考慮点
  • 収集したアクティビティー・データの削除方法
    ACTEVMON アクティビティー・イベント・モニターのデータは以下のように消去できます。
    db2 SET EVENT MONITOR ACTEVMON  STATE 0
    db2 TRUNCATE TABLE ACTIVITY_ACTEVMON IMMEDIATE
    db2 TRUNCATE TABLE ACTIVITYSTMT_ACTEVMON IMMEDIATE
    db2 TRUNCATE TABLE ACTIVITYMETRICS_ACTEVMON IMMEDIATE
    db2 TRUNCATE TABLE ACTIVITYVALS_ACTEVMON IMMEDIATE
  • ワークロードの削除方法
    作成したワークロード WL1 を削除するには以下のステートメントを実行します。
    db2 ALTER WORKLOAD WL1 DISABLE
    db2 DROP WORKLOAD WL1
  • ワークロードでアクティビティー・データの収集を停止する方法
    デフォルト・ワークロードのアクティビティー収集設定は以下のように解除できます。
    db2 ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT ACTIVITY DATA NONE

Document Location

Worldwide

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkyAAE","label":"Compiler-\u003EOptimization db2explain db2advis"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0"}]

Document Information

Modified date:
24 June 2024

UID

ibm17157214