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

*1:アクセス・パスとは、SQLステートメントの要件を満たすためにDB2が使用するアルゴリズム

*2:統計情報とは、表、索引などのレコード件数や、使用している領域、カーディナリティ、データ分布などのデータ特性を表す情報

*3:オプティマイザが最適なアクセス・プランを作成できるように、表と索引の統計を再収集する