IBM Db2 for LUWの照会パフォーマンス改善を簡単に!db2advisコマンドを使ってみよう!
SELECT文のパフォーマンス改善に有効なものとして、一般的によく知られているものとして、効果的な索引の作成(CREATE INDEX)があります。
Db2 for LUWユーザーの方が
「改善対象のSELECT文があり、それに効果的な索引をできるだけ簡単に作りたい。」時、
お役に立てるのがDb2の標準機能であるdb2advisコマンドです。
このコマンドへ照会パフォーマンスを改善したいSELECT文を入力値として与えると、効果的な索引を作成するためのCREATE INDEX文を出力してくれます。
では基本的な使い方を見てみましょう。
基本的な使い方 例1
db2advis -d prototype -s "select * from addresses a
where a.zip in ('93213', '98567', '93412')
and (company like 'IBM%' or company like '%otus')"
この例1の’-d prototype’はデータベース名を意味します。
‘-s “select * from addresses a…..”’は、改善したいSELECT文になります。
「パフォーマンスを改善したいSELECT文が複数ある。または、改善したいのはもっと長くて複雑なSELECT文なのだけれど。」という場合は、テキスト・ファイルを作成し、その中に複数あるいは複雑なSELECT文を記述し、そのファイル名を入力値として与えることもできます。
これを例2として示します。
基本的な使い方 例2
db2advis -d sample -i db2advis.in -t 5
この例の’-d sample’は、データベース名です。
’-i db2advis.in’は、SELECT文が記述されたファイル名になります。
’-t 5’は、db2advisコマンドが解決策を出すまでに許容できる時間を与えます。
(分単位。この例では5分。0(デフォルト値)は無制限です)
次の例は、db2advis.in という入力ファイル内に複数のSELECT文、 および各SELECT文が実行される頻度を指定しているサンプルとなります。
--#SET FREQUENCY 100
SELECT COUNT(*) FROM EMPLOYEE;
SELECT * FROM EMPLOYEE WHERE LASTNAME='HAAS';
--#SET FREQUENCY 1
SELECT AVG(BONUS), AVG(SALARY) FROM EMPLOYEE;
GROUP BY WORKDEPT ORDER BY WORKDEPT;
今回はdb2advisコマンドの基本的な2つの使用例をご紹介しました。
詳細な説明は割愛しますが、db2advisコマンドは内部で表に関する統計情報(レコード数、ページ数、平均レコード長など)や既存の索引が存在する場合、その索引に関する統計情報も利用します。
このため、db2advisコマンドの実行前に、RUNSTATSコマンドを対象となる表に対して実行しておき、最新の統計情報が取得されている状態にしておくことをお勧めします。
また、db2advisコマンドが出力したCREATE INDEX文を実際に実行し、新しく索引を作成した場合も、新しい索引に基づいた統計情報を収集する必要があります。
通常、db2advisコマンドの出力にはCREATE INDEX文に加えて、RUNSTATSコマンドも出力されていますが、RUNSTATSコマンドについては、コメントになっています(RUNSTATSの前に--(マイナス・マイナス)が記述されている)。
このままですと、CREATE INDEXのみ実行され、db2advisによって生成されたRUNSTATSはコメントとして扱われ、実行されないです。
db2advisが出力するRUNSTATSコマンド部分も確実に実行したい場合は、コメントを意味するRUNSTATSコマンドの前の--を削除し、生成されたRUNSTATSが実行されるようにしてください。
db2advisコマンドは、効果的な索引を提示するだけでなく、次のようなもっと高度なアドバイスをユーザーに提示することも可能です。
その他の考慮点などを含め、詳細はDb2のマニュアルをご参照ください。
・マテリアライズ照会表 (MQT)の作成
・表の再パーティション化
・マルチディメンション・クラスター化 (MDC) 表への変換