IBM Support

DB2: SQLステートメントのパラメーター・マーカーにセットされた値を確認する方法

Preventive Service Planning


Abstract

パラメーター・マーカーとは、疑問符(?)で示され、アプリケーションとSQLとの間でデータのやり取りをするための変数です。SQL実行時にアプリケーションがパラメーター・マーカーにセットした値をDB2側で確認する方法をご紹介します。

Content

パラメーター・マーカーとは、疑問符(?)で示され、アプリケーションとSQLとの間でデータのやり取りをするための変数です。
SQL実行時にアプリケーションがパラメーター・マーカーにセットした値をDB2側で確認する方法をご紹介します。


【対象製品/環境】
DB2 for LUW


【詳細説明】
一度コンパイル・実行されたSQLは、同じSQLが再び実行された場合、アクセス・プランを再利用することができます。
コンパイルにかかる時間やCPU, メモリーなどのリソースを節約することができます。
再利用されるためには、WHERE条件で指定される条件の値を含めて全く同じSQLでなければなりません。
そこで活用されるのが、パラメーター・マーカーです。

パラメーター・マーカーを使用すると、具体的な値を割り当てる代わりに、疑問符(?)を使用してステートメントのコンパイルを行います。
パラメーター・マーカーは、SQLの内部で置換される変数の位置を示し、SQL実行時にDB2はパラメーター・マーカーからアプリケーションが変数にセットした値に置き換えます。

Javaコーディング例)

PreparedStatement ps = con.prepareStatement("SELECT NAME FROM STAFF WHERE ID = ?");
   <-パラメーター・マーカーを使用したSQLでコンパイル
ps.setInt(1, 10);    <-1番目の変数に10という数値をセット
ps.executeQuery();

静的SQLでは、ホスト変数と呼ばれ、コロンの後に変数名が続く形 (:var1) で示されます。

WHERE条件で指定される条件の値のみが異なるSQLが繰り返し実行される場合には、パラメーター・マーカーを使用するとコンパイルの回数を削減することができます。

一般的にデータベースをモニターする方法として提供されているスナップショット、モニター表関数、db2pdでは、パラメーター・マーカーにセットされた値を確認することはできません。ロック・イベント・モニターで、mon_lockwait/mon_locktimeout/mon_deadlock(DB構成パラメーター)がHIST_AND_VALUESに設定されていれば、ロック待機/ロックタイムアウト/デッドロックとなったSQLについてはパラメーター・マーカーにセットされた値を確認することができます。

下記に示す方法は、ロック・イベント(ロック待機/ロックタイムアウト/デッドロック)が発生しなくても確認できる方法をご紹介します。

■方法

●監査ログ

V9.5より、監査ログを取得することによって、SQLステートメントと入力値を記録することができます。
AUDIT POLICY作成時に、EXECUTEカテゴリーにWITH DATAオプションを指定します。
すべてのSQLステートメントを収集すると、ログ量は膨大となりログ取得のシステム負荷が高まるため、特定のユーザーや表に絞って収集するようにしてください。
IBM Knowledge Center[SQL ステートメントを監査するための EXECUTE 区分]

●WLM(ワークロードマネージャー)
V9.5より、WLMでワークロードやサービスクラスに対して、COLLECT ACTIVITY DATA WITH DETAILS AND VALUESオプションを指定すれば、イベント・モニターでSQLステートメントの変数にセットされた値を取得することができます。
このアクティビティー情報を収集するのにはコストがかかるため、収集する範囲を絞る(例えば、特定のユーザー、特定のアプリケーション)ようにしてください。
IBM Knowledge Center[個々のアクティビティーのデータ収集]

下記Technoteには、デフォルトのサービス・クラス(sysdefaultuserclass)に対してアクティビティー情報を収集する例となっているため対象範囲が広いですが、貴職環境で作成したサービス・クラスに置き換えて実施してください。
Technote[Capture SQL statement value(s) for query that have parameter marker(s)]

なお、収集する範囲を絞るために、新規にWLMのオブジェクト(サービス・クラス、ワークロード、しきい値、ワーク・アクション・セット)を作成するにはライセンス交付要件があるため、下記リンク先を確認してください。

IBM Knowledge Center[DB2 ワークロード管理に関してよくある質問]DB2 ワークロード・マネージャーに関するどのようなライセンス交付要件がありますか。
V10.5:
V10.1:
V9.7:
V9.5:

●トレース
CLIトレースを取得する あるいは JDBCトレースを取得しても、変数にセットされた値を確認することが可能ですが、トレースが大量に出力されるため、運用面やパフォーマンスに対する考慮が必要です。
[CLIトレースの取得方法]
[[DB2 LUW] JDBC トレース取得手順 (Universal JDBC Driver)]


以上

[{"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Component":"Not Applicable","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"9.7;10.1;10.5","Edition":"","Line of Business":{"code":"LOB10","label":"Data and AI"}}]

Historical Number

9372355CEC6E1DC249257E0D00243531

Product Synonym

対象システム:DB2 LUW

Document Information

Modified date:
17 June 2018

UID

jpn1J1012355