以前のエントリでアクセスプランに関するテーブルに格納されたレコードが、ファイルシステムを圧迫してシステムが警告を吐いたので、それに対応する意味でアクセスプラン用テーブルのレコードの削除をする、みたいな話を書きましたが、結果としてレコードのDELETEだけでは圧迫は改善されませんでした。
古いアクセスプラン用のレコードを削除せずに何度もアクセスプランを取得してしまっていた為に、該当テーブルのデータファイルが拡張してしまい、それが元に戻らなくなっている状態になっていると思われ、また、意図した表領域に該当テーブル群が格納されていない、という問題もあったので、ちょっと面倒でしたが思い切ってDROP&CREATEしました。
DROPしたのは下記のテーブル&FUNCTIONです。
EXPLAIN_GET_MSGS
ADVISE_TABLE
ADVISE_PARTITION
ADVISE_MQT
ADVISE_WORKLOAD
ADVISE_INDEX
ADVISE_INSTANCE
EXPLAIN_DIAGNOSTIC_DATA
EXPLAIN_DIAGNOSTIC
EXPLAIN_STREAM
EXPLAIN_PREDICATE
EXPLAIN_OPERATOR
EXPLAIN_OBJECT
EXPLAIN_ARGUMENT
EXPLAIN_STATEMENT
EXPLAIN_INSTANCE
そして再作成を行うのですが、
%DB2_INSTALL_DIR%/misc配下に作成されているEXPLAIN.DDLは、
デフォルトではUSERSPACE1表領域にアクセスプラン用テーブル等を作成してしまうので、
それを回避するために、以下のように全てのテーブルのDDLに表領域指定を加えました。
CREATE TABLE EXPLAIN_INSTANCE (
EXPLAIN_REQUESTER VARCHAR(128) NOT NULL,
EXPLAIN_TIME TIMESTAMP NOT NULL,
~ 中略 ~
DATAJOINER CHAR(1) NOT NULL,
PRIMARY KEY (EXPLAIN_REQUESTER,
EXPLAIN_TIME,
SOURCE_NAME,
SOURCE_SCHEMA,
SOURCE_VERSION))
IN 任意の表領域
INDEX IN 任意の表領域;
これを実行したらば、ファイルシステムの圧迫は回避され、
警告も出なくなりました。
業務に直接の影響は無い部分ですが、
本番でテーブルのDROPなんて初めてやったので、
ちょっとビビリました(笑