SQLを分析する高度なテクニック:DB2チューニング・ベストプラクティス(6)(2/4 ページ)
本連載はDB2 UDB V8のシステム管理者、およびアプリケーション開発者のために、パフォーマンス・チューニングに必要な技法を紹介する。記事の原文はIBM developerWorksで2004年4月に公開された「Best practices for tuning DB2 UDB v8.1 and its databases」で、DB2の設計、配置、構成、SQL、運用管理、モニタリングといった内容を、実践的な操作を中心に解説している。想定する読者はDB2データベース管理の中級レベルのスキルを持っているユーザーである。スクリーン・ショットなど一部のコンテンツは、日本語版のものに差し替えている。(編集局)
SQLのイベント・モニタ
CREATE EVENT MONITORステートメントは、データベースの使用中に発生する特定のイベントを記録するためのモニタを定義します。それぞれのイベント・モニタ定義では、データベースがイベントを記録する先についても指定します。以下のイベントに関する情報を記録するためのイベント・モニタを作成することができます。
- DATABASE(データベース・イベント)
- TABLES(表イベント)
- DEADLOCKS [WITH DETAILS](デッドロック・イベント)
- TABLESPACES(表スペース・イベント)
- BUFFERPOOLS(バッファ・プール・イベント)
- CONNECTIONS(接続イベント)
- STATEMENTS(ステートメント・イベント)
- TRANSACTIONS(トランザクション・イベント)
リスト1またはリスト2のスクリプトを使用すると、イベント・モニタの出力結果を収集できます。
- リスト1 getevmon.ksh(UNIX)(別ウィンドウで表示します)
- リスト2 getevmon.bat(Windows)(別ウィンドウで表示します)
出力結果には、動的SQLステートメントのテキストがすべて含まれますが、静的SQLステートメントについては、パッケージ名とセクション番号がリストされます。これらのパッケージ名およびセクション番号をdb2explnと一緒に使用すると、ステートメント・テキストを抽出できます。もう1つの方法として、syscat.statementsビューを照会してステートメント・テキストを抽出することもできます。
リスト3は、ステートメント・イベント・モニタの出力結果として収集されたイベントの例を示しています。
- リスト3 ステートメント・イベント・モニタの出力例(別ウィンドウで表示します)
出力結果には何千ものステートメント・イベントが存在する可能性があります。問題を特定するための最も簡単な方法は、grep(UNIX)またはfindstr(Windows)を使用することです。出力結果の中で、特に以下の文字列について検索します。
「sqlcode: -」
これはエラーを検索するのに役立ちます。例えば「-911 RC 2」はデッドロックを表し、「-911 RC 68」はロック・タイムアウトを表します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「Rows read:」
これは、ステートメントによって読み取られた行数を表します(索引項目や表の直接読み取りは含みません)。この値が非常に大きい場合は、索引が必要であるか、または統計が古いことを示しています。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「Exec Time:」
これはステートメントの実際の実行時間を表し、ロック待機時間も含みます。イベント・モニタ・データの終わりから先頭に向かって「Exec Time」を検索し、コストのかかるSQLステートメントのパターンや繰り返しが存在しているかどうかを調べると便利です。その後でEXPLAINを使ってそのSQLステートメントを調べ、どのような問題があるかを確認できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「Sort overflows:」
これは、コストのかかるソート・オーバーフローが発生しているかどうかを表します。ソート・オーバーフローが発生している場合は、適切な索引、RUNSTATSの実行、あるいはより大きなSORTHEAPが必要です。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「Fetch Count:」
結果セットに対してフェッチが何回実行されたかを知るのに役立ちます。DB2は、それぞれのFETCH操作を記録する代わりにこのフィールドをインクリメントすることで、FETCH操作をステートメント・レベルで追跡します。FETCH FIRST文節を使用すると、フェッチを制限できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
詳しく調べたい要素が見つかったら、ステートメント・イベント・モニタの出力結果を開いて、関心のある文字列について検索します。問題のステートメントが見つかったら、以下のフィールドを参照します。
「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.