RUNSTATSコマンドでDB2のパフォーマンス向上作戦
DB2では*1アクセスパスの決定に*2統計情報を使用します。
そのため、統計情報が現在のテーブルの状態とかけ離れていると、
いくらインデックス等を最適に設計しても、レスポンスが悪くなります。
例えば、データが100行程度の状態でバインドしたアプリケーションでは、
データ量が少ないため、DB2はデータベーススキャンを選択するかもしれません。
(データ量が少ない場合、インデックスを見ると読み込むページ数が増えるので)
しかし、その後データが増え続けても統計情報の更新かつ、再バインドをしないと、
ずっとデータベーススキャンでそのテーブルを検索することになります。
そこで表やインデックスに*3RUNSTATSを実行することで、パフォーマンスが向上します。
大規模データベース程効果があると思います。
RUNSTATSコマンド
db2 "RUNSTATS ON TABLE [スキーマー名].[テーブル名] ON ALL COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND DETAILED INDEXES ALL ALLOW WRITE ACCESS"
コマンド中の「WRITE」を「READ」にするとロックをとっちゃうので気をつけた方がよいです。
表や索引に対して正常にRUNSTATSが実行されたかどうかを確認するには以下のようなSQLで確認出来ます。
SELECT char (tabname, 40) , STATS_TIME FROM SYSCAT.TABLES ORDER BY STATS_TIME DESC