統計情報とは偏り具合などのデータの状態を表す情報のこと。DB2にデータの統計情報を取得させることで実行速度の高いアクセスプランが作られる可能性が高くなる。 統計情報が古い場合に、ソート・オーバーフローが多発し、SQL全体が急激に遅くなる場合があるので気を付けよう。
db2 RUNSTATS ON TABLE ${テーブル名} ON ALL COLUMNS
自動保守になっているか確認
最近のDB2では自動保守設定で2時間に1度、RUNSTATSを実行してくれているので、基本的には手動で実施する必要はない。大量データを操作する場合に手動実行を検討しよう。パラメータ「auto_maint」と「auto_runstats」を確認しておこう。
コマンドの場合
db2 GET DB CFG FOR ${DB名}
SQLの場合
SELECT * FROM SYSIBMADM.DBCFG
分散統計つき(WITH DISTRIBUTION)
ソート・オーバーフローを防ぐために、できるだけ「WITH DISTRIBUTION」をつけたほうがよい。
db2 RUNSTATS ON TABLE ${テーブル名} ON ALL COLUMNS WITH DISTRIBUTION
インデックスの統計情報も取得しよう。
db2 RUNSTATS ON TABLE ${テーブル名} WITH DISTRIBUTION AND INDEXES ALL
LIKE検索の対策
「中間一致」「後方一致」のLIKE検索専用のRUNSTATSがある。LIKE検索が多いカラムに対して実行する。
db2 RUNSTATS ON TABLE ${テーブル名} ON COLUMNS (${カラム名} LIKE STATISTICS)
RUNSTATSに時間がかかる場合
表全体の一部だけをサンプリングして統計情報を取得する方法もある。ただし、精度が低くなる。
rem ページ単位で大まかにサンプリングを行う。(10%)
db2 RUNSTATS ON TABLE ON ALL COLUMNS TABLESAMPLE SYSTEM(10)
rem 行単位で細かくサンプリングを行う。(10%)
db2 RUNSTATS ON TABLE ON ALL COLUMNS TABLESAMPLE BERNOULLI(10)
RUNSTATSの自動保守
ちなみにDB構成パラメータで「auto_runstats」という機能があり、2 時間間隔で自動で非同期統計収集をやってくれている。(RUNSTATSはREORG後ぐらいしかやったことないかも。)