Database JUNKY

MySQL,MariaDBを中心としたブログです

DB2のインデックスの使用状況

chikunaiです。

昔を思い出してDB2のチューニングの記事を書きます。

プログラミングでSQLができた頃合いから、テーブルにどうインデックスを付けるか、チューニング作業が始まります。

db2advisで指摘されるものをそのまま付けようものなら、テーブルがインデックスだらけになってしまいます。付けすぎてInsert、Updateのパフォーマンスが低下します。付けすぎてしまったあと、どれを残すか、調べる方法があります。我流ですので、あしからず。

db2pd -db dbname -tcbstat index

結果を見てもテーブル名のみで肝心のインデックス名がありません。以下に解説します。

IID列はインデックスのIDになります。これでは分からないので、IIDのインデックス名を調べます。SYSCAT.INDEXESをSELECTしてください。テーブル名をWHERE句に入れれば、IIDに該当するインデックス名が調べられます。

Scans列はインデックスが利用された回数です。ここが0回のものは、インデックスは作ったがまったく利用されていないことを意味します。Scansの利用回数が少ないものが削除対象です。DB2はコストベースでSQLの実行計画を作ります。0回ということは、他のインデックスを使った方がコストが低いとDB2が判断しています。RUNSTATSを実行して様子を見るのも手ですが、0回ならたぶん使われないです。

KeyUpdatesはインデックスの更新回数です。インデックスに指定した列が、UPDATE文で頻繁に更新されていることがわかります。頻度が多いとSQLのパフォーマンスが低下します。Scansが0回で、KeyUpdatesの頻度が高い場合は、パフォーマンスに影響を与えている可能性が大です。

以下に参考になる資料があります。

DB2問題判別ツールdb2pdコマンド使用ガイド のP.50あたりに簡単な解説があります。

【DB2 for LUW 運用管理ガイド V9.5】】データベース・モニタリング 前編 のP.139に使用例があります。

MySQLOracleなどの他のDBでは、どうチェックするんでしょうか。