SQLを分析する高度なテクニックDB2チューニング・ベストプラクティス(6)(2/4 ページ)

» 2004年12月08日 00時00分 公開
[Fraser McArthurDB2 Enablement Consultant/IBM Canada Ltd.]

SQLのイベント・モニタ

 CREATE EVENT MONITORステートメントは、データベースの使用中に発生する特定のイベントを記録するためのモニタを定義します。それぞれのイベント・モニタ定義では、データベースがイベントを記録する先についても指定します。以下のイベントに関する情報を記録するためのイベント・モニタを作成することができます。

  • DATABASE(データベース・イベント)
  • TABLES(表イベント)
  • DEADLOCKS [WITH DETAILS](デッドロック・イベント)
  • TABLESPACES(表スペース・イベント)
  • BUFFERPOOLS(バッファ・プール・イベント)
  • CONNECTIONS(接続イベント)
  • STATEMENTS(ステートメント・イベント)
  • TRANSACTIONS(トランザクション・イベント)

 リスト1またはリスト2のスクリプトを使用すると、イベント・モニタの出力結果を収集できます。

 出力結果には、動的SQLステートメントのテキストがすべて含まれますが、静的SQLステートメントについては、パッケージ名とセクション番号がリストされます。これらのパッケージ名およびセクション番号をdb2explnと一緒に使用すると、ステートメント・テキストを抽出できます。もう1つの方法として、syscat.statementsビューを照会してステートメント・テキストを抽出することもできます。

 リスト3は、ステートメント・イベント・モニタの出力結果として収集されたイベントの例を示しています。

 出力結果には何千ものステートメント・イベントが存在する可能性があります。問題を特定するための最も簡単な方法は、grep(UNIX)またはfindstr(Windows)を使用することです。出力結果の中で、特に以下の文字列について検索します。

「sqlcode: -」

 これはエラーを検索するのに役立ちます。例えば「-911 RC 2」はデッドロックを表し、「-911 RC 68」はロック・タイムアウトを表します。

UNIX:
grep -n " sqlcode: -" stmtevmon_output

Windows:
findstr /C:" sqlcode: -" stmtevmon_output
(注:赤字は各自の環境に置き換えてください)

「Rows read:」

 これは、ステートメントによって読み取られた行数を表します(索引項目や表の直接読み取りは含みません)。この値が非常に大きい場合は、索引が必要であるか、または統計が古いことを示しています。

UNIX:
grep -n " Rows read: " stmtevmon_output |
grep -v ": 0" | sort -k 4,4rn | more

Windows:
findstr /C:" Rows read: " stmtevmon_output |
findstr /V /C:" Rows read: 0" | sort
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)

「Exec Time:」

 これはステートメントの実際の実行時間を表し、ロック待機時間も含みます。イベント・モニタ・データの終わりから先頭に向かって「Exec Time」を検索し、コストのかかるSQLステートメントのパターンや繰り返しが存在しているかどうかを調べると便利です。その後でEXPLAINを使ってそのSQLステートメントを調べ、どのような問題があるかを確認できます。

UNIX:
grep -n " Exec Time: " stmtevmon_output |
grep -v ": 0.0" | sort -k 4,4rn | more

Windows:
findstr /C:" Exec Time: " stmtevmon_output |
findstr /V /C:" Exec Time: 0.0" | sort
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)

「Sort overflows:」

 これは、コストのかかるソート・オーバーフローが発生しているかどうかを表します。ソート・オーバーフローが発生している場合は、適切な索引、RUNSTATSの実行、あるいはより大きなSORTHEAPが必要です。

UNIX:
grep -n " Sort overflows:" stmtevmon_output |
grep -v ": 0" | sort -k 4,4rn | more

Windows:
findstr /C:" Sort overflows: " stmtevmon_output |
findstr /V /C:" Sortoverflows: 0" | sort
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)

「Fetch Count:」

 結果セットに対してフェッチが何回実行されたかを知るのに役立ちます。DB2は、それぞれのFETCH操作を記録する代わりにこのフィールドをインクリメントすることで、FETCH操作をステートメント・レベルで追跡します。FETCH FIRST文節を使用すると、フェッチを制限できます。

UNIX:
grep -n " Fetch Count:" stmtevmon_output |
grep -v ": 0" | sort -k 4,4rn | more

Windows:
findstr /C:" Fetch Count: " stmtevmon_output |
findstr /V /C:" Fetch Count: 0" | sort
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)

 詳しく調べたい要素が見つかったら、ステートメント・イベント・モニタの出力結果を開いて、関心のある文字列について検索します。問題のステートメントが見つかったら、以下のフィールドを参照します。

「Operation:」

 このフィールドでは、ステートメントの全般的なフローを知ることができます。このフィールドでは、PREPARE、OPEN、FETCH、CLOSE、COMMITなどが識別されます。

「Text:」

 これは、動的SQLステートメントのテキストを表します。静的SQLについては、「Section:」および「Package:」を参照します。

「Start Time:」「Stop Time:」「Time:」

 これらは、各ステートメントの開始時刻、終了時刻、またはその両方を知るために役立ちます。また、終了時刻(Stop Time)とその次の開始時刻(Start Time)を参照することで、ステートメント間の間隔が分かります。これは、DB2がどこかほかの部分(ストアード・プロシージャのオーバーヘッドなど)に時間を費やしていると推測される場合に役立ちます。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。