CREATE EVENT MONITOR (ロック) ステートメント
CREATE EVENT MONITOR (ロック) ステートメントは、データベースを使用する際に生じるロック関連イベントを記録するイベント・モニターを作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、 動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
このステートメントの許可 ID が保持する特権には、以下のいずれかの権限が含まれている必要があります。
- DBADM 権限
- SQLADM 権限
構文
説明
- event-monitor-name
- イベント・モニターの名前。 これは、1 部構成の名前です。 これは、SQL ID です (通常 ID または区切り ID)。 event-monitor-name (イベント・モニター名) は、 既にカタログに存在するイベント・モニターを指定する名前であってはなりません (SQLSTATE 42710)。
- FOR
- 記録するイベント・タイプをこの後に指定します。
- LOCKING
- データベース・マネージャーで以下の状況が 1 つ以上発生した場合に、この受動的なイベント・モニターが、発生したすべてのロック・イベントについて記録するよう指定します。
- LOCKTIMEOUT: ロック要求がタイムアウトした
- DEADLOCK: ロックがデッドロックに関与した (ビクティムおよび参加者)
- LOCKWAIT: 指定期間内でロックが取得されなかった
- WRITE TO
- データの出力先をこの後に指定します。
- TABLE
- イベント・モニターのデータの出力先が一連のフォーマット済みイベント表であることを示します。
イベント・モニターは、データ・ストリームを 1 つ以上の論理データ・グループに分け、
各グループを別個の表に挿入します。
ターゲット表のあるグループのデータは保持されますが、ターゲット表のないグループのデータは破棄されます。
グループに含まれる各モニター・エレメントは、同じ名前の表列にマップされます。
対応する表列を持つエレメントだけが表に挿入されます。
他のエレメントは破棄されます。
- formatted-event-table-info
- イベント・モニターの出力先となるフォーマット済みイベント表を定義します。
この節では、記録される各グループを指定する必要があります。
しかし evm-group 節が指定されない場合には、イベント・モニター・タイプのすべてのグループが記録されます。
論理データ・グループについて詳しくは、論理データ・グループおよびイベント・モニター出力表を参照してください。
- evm-group
- ターゲット表を定義する対象の論理データ・グループを指定します。
以下の表に示されているように、値はイベント・モニターのタイプに基づいて異なります。
イベント・モニターのタイプ evm-group 値 Locking - LOCK
- LOCK_PARTICIPANTS
- LOCK_PARTICIPANT_ACTIVITIES
- LOCK_ACTIVITY_VALUES
- CONTROL
- UNFORMATTED EVENT TABLE
- イベント・モニターのデータの出力先がフォーマットされていないイベント表であることを指定します。フォーマットされていないイベント表は、収集されたロック・イベント・モニターのデータを格納するために使用されます。 データは、インライン化 BLOB 列内に内部バイナリー・フォーマットで格納されます。各イベントでは複数のレコードがこの表に挿入される場合があり、それぞれの挿入されたレコードは関連する BLOB 内容も変化する別のタイプとなる可能性があります。BLOB 列のデータは読み取り可能なフォーマットではないので、db2evmonfmt Java ベースのツール、EVMON_FORMAT_UE_TO_XML 表関数、または EVMON_FORMAT_UE_TO_TABLES プロシージャーを使用して、XML 文書またはリレーショナル表などの使用可能なフォーマットに変換する必要があります。
- target-table-options
- ターゲット表のオプションを指定します。
target-table-options の値が指定されていない場合、CREATE EVENT MONITOR FOR LOCKING の処理は以下のように続行されます。
- 派生した表名が使用されます (
TABLE table-nameの説明と同様)。 - CREATE TABLE を使用して表スペース名を指定しないで表が作成される場合と同じプロセスで、デフォルトの表スペースが選択されます。
- PCTDEACTIVATE が 100 に設定されます。
- TABLE table-name
- ターゲット表の名前を指定します。
ターゲット表は、非パーティション表でなければなりません。名前が非修飾の場合、表スキーマは CURRENT SCHEMA 特殊レジスターの値にデフォルト設定されます。未フォーマット・イベント表の名前が指定されなかった場合、非修飾名は event-monitor-name と同じになります。つまり、未フォーマット・イベント表の名前は、イベント・モニターの名前からとられたものとなります。
フォーマット済みイベント表の名前が指定されなかった場合は、非修飾名は以下のように evm-group および event-monitorname から導出されます。
substring(evm-group CONCAT '_' CONCAT event-monitor-name,1,128) - IN tablespace-name
- 表を作成する表スペースの名前を指定します。
CREATE EVENT MONITOR FOR LOCKING ステートメントは、表スペースを作成しません。
表スペース名が指定されなかった場合、CREATE TABLE を使用して表スペース名を指定しないで表が作成される場合と同じプロセスで表スペースが選択されます。
フォーマット済みイベント表に表スペース名を指定する際、表スペースのページ・サイズは、使用する INLINE LOB の長さに影響を及ぼします。イベント・モニターの INSERT のパフォーマンスを向上させるため、できるだけ大きなページ・サイズの表スペースを指定することを検討してください。
- PCTDEACTIVATE integer
- イベント・モニターの表が自動ストレージ (非一時) または DMS 表スペースに作成される場合には、
PCTDEACTIVATE パラメーターは、どの程度表スペースが満たされた時点でイベント・モニターが自動的に非活動化されるかを指定します。
パーセンテージを表す値は、0 から 100 の範囲で指定可能です。
デフォルト値は 100 です。この 100 は、表スペースが完全にいっぱいになるときにイベント・モニターが非アクティブになることを意味します。
PCTDEACTIVATE が指定されていない場合には、デフォルト値は 100 になります。
SMS 表スペースの場合、このオプションは無視されます。重要: ターゲット表スペースの自動サイズ変更が有効になっている場合、PCTDEACTIVATE を 100 に設定します。または、この節全体を省略して、デフォルトの 100 が適用されるようにします。 それ以外の場合、表スペースが自動的にサイズ変更される前に、PCTDEACTIVTATE で指定したしきい値に表スペースが到達すると、イベント・モニターは予期せずに非アクティブになる場合があります。
- 派生した表名が使用されます (
- AUTOSTART
- イベント・モニターを実行するデータベース・パーティションをアクティブ化した時点で、イベント・モニターも自動的にアクティブ化することを指定します。これは、ロック・イベント・モニターのデフォルトの動作です。
- MANUALSTART
- SET EVENT MONITOR STATE ステートメントを使用してイベント・モニターを手動でアクティブ化しなければならないことを指定します。活動化された MANUALSTART イベント・モニターは、SET EVENT MONITOR STATE ステートメントを使用するか、インスタンスを停止することによってのみ非活動状態にできます。
注
- CREATE EVENT MONITOR FOR LOCKING ステートメントが実行されるときにターゲット表がまだ存在しない場合は、そのときに作成されます。
- CREATE EVENT MONITOR FOR LOCKING 処理時に、別のイベント・モニターで使用するために既に定義されている表が検出されると、CREATE EVENT MONITOR FOR LOCKING ステートメントは失敗し、エラーがアプリケーション・プログラムに返されます。 表名が SYSCAT.EVENTTABLES カタログ・ビューにある値と一致する場合には、その表は別のイベント・モニターによって使用されるよう定義されています。検出された表が別のイベント・モニターで使用するようには定義されていない場合、イベント・モニターはその表を再利用します。
- イベント・モニターをドロップしても、表はドロップされません。 関連するどの表も、イベント・モニターをドロップした後に、手動でドロップする必要があります。
- このイベント・モニターによって作成された未フォーマット・イベント表または正規表からロック・イベント・データが自動的にプルーニングされることはありません。 未フォーマット・イベント (UE) 表からデータをプルーニングするためのオプションは、EVMON_FORMAT_UE_TO_TABLES プロシージャーを使用するときに使用できます。 正規表に書き込むイベント・モニターの場合、イベント・データは手動でプルーニングする必要があります。
- FLUSH EVENT MONITOR ステートメントは、このイベント・モニターには適用されず、 これに対して発行されても、効果はありません。
- 未フォーマット・イベント表の場合、イベント・データは表のインライン化 BLOB データ列に挿入されます。
通常、BLOB データは別の LOB 表スペースに格納され、結果としてパフォーマンス上の余分なオーバーヘッドが生じてしまう恐れがあります。基本表のデータ・ページにインライン化されると、BLOB データではこのオーバーヘッドは生じません。データベース・マネージャーは、BLOB データのサイズが表スペースのページ・サイズからレコード接頭部を引いたサイズよりも小さい場合、自動的に未フォーマット・イベント表レコードの BLOB データ部分にインライン化されます。このため、効率性およびアプリケーションのスループットを高めるために、イベント・モニターを可能な限り大きな表スペース (最大で 32KB までの表スペース) と関連バッファー・プールに作成することをお勧めします。
- 例
- ロック・イベント・モニターには、現在以下の 2 つのレコード・タイプがあります。
- アプリケーション情報レコード
- アプリケーション・アクティビティー・レコード
アプリケーション情報レコード = 最大サイズ 3.5KB
アプリケーション・アクティビティー・レコード = 3KB + SQL ステートメント・テキスト・サイズ (SQL ステートメント・テキスト・サイズは最大で 2MB)
アプリケーション情報レコードは非常に小規模であり、4KB ページ・サイズが使用されている限りは必ずインライン化する必要があります。 アプリケーション・アクティビティー・レコードは、以下の公式に基づいてインライン化されます。Application Activity Record < inline length (Pagesize - overhead non-LOB columns (0.5KB)) 3KB + SQL statement text < inline length (Pagesize - overhead non-LOB columns (0.5KB)) SQL statement text < Pagesize - nonLOB overhead (1K) - 3KB SQL statement text < 16KB - 1KB - 3KB < 12KBこのため、16KB ページ・サイズを使用する場合、ロック・イベント・モニター・レコードがインライン化されるのは、キャプチャーされる SQL ステートメントのサイズが 12KB より小さい場合に限られます。
- データベースごとに 1 つのロック・イベント・モニターを作成します。ロック・イベント・モニターを複数作成すると、
提供されるデータ量は増加しないものの、プロセッサー・サイクルおよびストレージの消費量は増加します。
重要: 古いバージョンの製品との互換性を保つために、すべてのデータベースは、作成された時点で Db2DETAILDEADLOCK イベント・モニターが有効な状態になっています。 ロック・イベント・モニターは、ロック関連データを収集する手段として望ましいものです。DB2DETAILEDDEALOCK イベント・モニターは、推奨されておらず、今後のリリースで除去される可能性があります。ロック・イベント・モニターを作成する場合は、 重複した不要な情報が収集されないように、DB2DETAILEDDEADLOCK イベント・モニターを無効にしてドロップしてください。Db2DETAILDEADLOCK イベント・モニターを除去するには、以下の SQL ステートメントを発行してください。
SET EVENT MONITOR Db2DETAILDEADLOCK state 0 DROP EVENT MONITOR Db2DETAILDEADLOCK - パーティション・データベース環境では、データが書き込まれるターゲット表は、その表スペースが存在するデータベース・パーティション上にあるものだけです。 ターゲット表のための表スペースがいずれかのデータベース・パーティションに存在しない場合は、そのターゲット表についてのデータは無視されます。 この動作によってユーザーは、特定のデータベース・パーティション上にのみ存在する表スペースを作成して、モニターとして選択するデータベース・パーティションのサブセットを選択できます。
- パーティション・データベース環境では、あるデータベース・パーティションにいくつかのターゲット表が存在しないものの、 その同じデータベース・パーティションに他のターゲット表が存在する場合は、 そのデータベース・パーティションに存在する未フォーマット・イベント・ターゲット表のデータだけが記録されます。
例
- 例 1: この例では、作成したデータベース上で発生するロック・イベントを収集するロック・イベント・モニター LOCKEVMON を作成します。
CREATE EVENT MONITOR LOCKEVMON FOR LOCKING WRITE TO TABLEこのイベント・モニターは、その出力を以下の表に書き込みます。- LOCK_LOCKEVMON
- LOCK_PARTICIPANTS_LOCKEVMON
- LOCK_PARTICIPANT_ACTIVITIES_LOCKEVMON
- LOCK_ACTIVITY_VALUES_LOCKEVMON
- CONTROL_LOCKEVMON
- 例 2: この例では、データベース上で発生するロック・イベントを収集し、そのデータをフォーマットされていないイベント表 IMRAN.LOCKEVENTS に格納するロック・イベント・モニター LOCKEVMON を作成します。
CREATE EVENT MONITOR LOCKEVMON FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE (TABLE IMRAN.LOCKEVENTS) - 例 3: この例では、作成したデータベース上で発生するロック・イベントを収集し、そのデータを表スペース APPSPACE にあるフォーマットされていないイベント表 IMRAN.LOCKEVENTS に格納するロック・イベント・モニター LOCKEVMON を作成します。この表スペースの使用率が 85% に達すると、このイベント・モニターは非アクティブ化されます。
CREATE EVENT MONITOR LOCKEVMON FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE (TABLE IMRAN.LOCKEVENTS IN APPSPACE PCTDEACTIVATE 85)
