毎日早朝にpgAgentジョブがPostgreSQL 8.4データベースのテーブルBからテーブルAの内容を更新します。テーブルAには、91列にまたがる約140kのレコードが含まれ、2つのインデックスがあります。1つはPRIMARY KEYの一部として、もう1つはPOINT PostGISジオメトリ列のGISTインデックスです。
プロセスを少し速くするために、ジョブはテーブルAのレコードを削除してテーブルBからレコードを挿入する前に、ジオメトリ列のインデックスを削除し、その後インデックスを再作成します。これがすべて完了すると、autovacuumデーモンは、希望どおりに動作するようになります(ジョブの統計情報とテーブルの統計情報をジョブの完了時間とautovacuumの実行時間と比較して10分ほど後)。
これがすべて起こった後の今朝のテーブルのチェック時に、テーブルの統計から、テーブルサイズは272MB、TOASTテーブルサイズは8192バイト、インデックスサイズは23MBであることがわかりました。これはかなり大きいように見えたので、テーブルにREINDEXコマンドを発行し、インデックスサイズは9832kBになりました。
私の質問はこれです:
インデックス(または少なくともジオメトリ列インデックス)を最初から作成したときに、REINDEXがインデックスのサイズを大幅に削減するのはなぜですか?インデックスが作成される前に、テーブルがバキューム/分析されていることを確認する必要がありますか?主キーのインデックスを削除することがこれの要因ではありませんか?何が欠けていますか?
ANALYZE
の後で、報告されたサイズも減少するかどうかを(可能であれば)チェックします。