PostgreSQL 8.4でインデックスを再作成する前に、常にVACUUM ANALYZEを行う必要がありますか?


8

毎日早朝に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がインデックスのサイズを大幅に削減するのはなぜですか?インデックスが作成される前に、テーブルがバキューム/分析されていることを確認する必要がありますか?主キーのインデックスを削除することがこれの要因ではありませんか?何が欠けていますか?


1
9.3へのアップグレードを妨げるものはありますか?そうでなければ、私は8.4をあまり覚えていませんが、テーブルが最近分析されなかったためにだけサイズが異なるのではないですか?プレーンANALYZEの後で、報告されたサイズも減少するかどうかを(可能であれば)チェックします。
dezso 2014

@dezso残念ながら、近い将来、より新しいバージョンに更新することはできません。毎日更新した後、次の機会に再分析を試みます-ANALYZEはインデックスの統計を収集しますか?
UrsineWelles 2014

@deszo結果をチェックするVACUUM ANALYZEを発行してからREINDEXを実行すると、インデックスサイズが大幅に削減されます。
UrsineWelles 2014

または、アップグレードのトピックについて、現在のバージョン9.4に直接移行しませんか?Postgres 8.4は2014年にEOLに達しました。それ以降、バキュームとインデックス作成が何度も改良され、改善されています。
Erwin Brandstetter、2015

@ErwinBrandstetter-ここで更新に向けてクロールしています...すぐに同僚がソフトウェアを更新し、Cadcorp SIS 8.0にアップグレードできるようになります。これにより、Postgres(9.3)にアップグレードできるようになります。掃除機とインデックスの報酬を獲得できることを楽しみにしています!
UrsineWelles 2015

回答:


3

CREATE INDEXステートメントで、別のセッションがアクティブなスナップショットを保持していることを確認した場合でも、削除されたレコードに関心がある可能性がある場合は、それらの削除されたレコードを新しいインデックスに含めます。

同様に、REINDEXは、別のセッションがアクティブなスナップショットを保持していることを検出した場合でも、削除されたレコードに関心がある可能性がある場合、それらの削除されたレコードを新しいインデックスに含めます。

VACUUMが、別のセッションがアクティブなスナップショットを保持していることを確認した場合でも、削除されたレコードに関心がある可能性がある場合、それらのレコードはテーブルに保持されます。そして、スナップショットがまだ存在する限り、REINDEXまたはCREATE INDEXもそれらを新しいインデックスに含める必要があります。

削除された行を表示できる可能性のあるスナップショットが存在するか、もはや存在しない場合、VACUUMはそれらをテーブルから削除する場合があります。しかし、CREATE INDEXまたはREINDEXは、VACUUMがそれらを有能なオブジェクトから削除するために移動していたかどうかに関係なく、それらを新しいインデックスに持ち越さないこともできます。

したがって、あなたのシナリオでは、最初のCREATE INDEXとREINDEXの間のVACUUMの役割はおそらく時間がかかるだけです。


それはそれでなければなりません。私はそのような取引を監視しなければなりません。
UrsineWelles 16

postgres 9.3にはインデックスの再作成が必要ですか?
Munai Das Udasin 2017

0

さまざまな順序で試してみた結果、おそらく、空にされていないスペースがインデックスに追加されるため(削除されたレコードのインデックス?)、REINDEX命令の前にVACUUMを実行することが唯一の方法であると思われます。を使用してテーブルを強制的に書き換える

ALTER TABLE blah ALTER COLUMN whiffle SET DATA TYPE whiffle_type;

使われなくなったスペースを空にするので、同じようなことをします。

プロセスの途中でVACUUMを実行する必要がある場合、トランザクションの外部でVACUUMコマンドを発行する必要があるため、フローが少し中断されます。


削除または切り捨てていますか?そして、それらのインデックスにfillfactorを100に設定しましたか?
David Aldridge

こんにちは@DavidAldridge。切り捨てるのではなく削除しています。fillfactorがデフォルトです。
UrsineWelles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.