回答:
PostgreSQLがトランザクションと同時実行性を処理する方法が原因で、MVCC-マルチバージョン同時実行制御により、肥大化する可能性があります。PostgreSQLでは、UPDATE
またはを実行してもDELETE
、行は実際には物理的に削除されません。以下のためDELETE
、将来のトランザクションのために利用できない、とのような、それ単にマーク行UPDATE
それが結合だフードの下で、INSERT
次いでDELETE
行の以前のバージョンが利用不能とマークされています、。
データは使用不可とマークされていますが、まだそこにあり、スペースは使用できません。次に、スペースをデータベースで使用できるようにマークするには、バキュームプロセスが操作の背後に来て、データベースが使用できるスペースをマークする必要があります。ただし、オペレーティングシステムには返されません。これは、ページ全体にアクティブな行がない場合にのみ発生します。これは、一部のワークロードでは一般的ではありません。これは、追加のデータファイルを追加する必要なしに、データファイル内の個々のページのスペースを単に更新できるため、一部のワークロードに適しています。
ライブタプルと比較して、死んだタプルの数が非常に多い場合、膨張が問題になります。歩いてすべての可視性フラグをチェックすると時間がかかり、リレーション用のデータファイルが増えると、不要なIO負荷が追加されます。膨張はインデックスで特に顕著です。インデックスには、テーブルよりも多くのデッドタプルが含まれる場合があります。Bloatはインデックスの検索とスキャンを遅くする可能性があり、クエリ時間が徐々に増加し、クエリプランが変更されると表示されます。
あなたは使用してスペースを復元することができpg_reorgを、pg_repack、CLUSTER
またはVACUUM FULL
。これにより、ファイルを調べて再編成し、タプルを移動して再編成し、デッドタプルがないことを確認します。これにより、膨張がなくなります。
ブロートはVACUUM
、テーブルごとの設定を調整することによって効率的に管理することもできます。これにより、後続のクエリで再利用できるデッドタプルスペースがマークされます。
Show Database BloatとIndex Bloatに関連するPostgreSQL Wikiのクエリを使用して、どれだけの膨らみがあるかを判断し、そこから少しパフォーマンス分析を行って、テーブルにある膨らみの量に問題があるかどうかを確認できます。 。
これはおそらく、2つの多くの列がインデックスに追加されているか、テーブルに重複するインデックスがあるインデックスに関する一般的な問題を参照しています。つまり、同じ列のセットが含まれる複数のインデックス(そのうちの1つが不要になります)。テーブルのすべてのインデックスを確認して、重複する列を探し、他のインデックスのサブセットにすぎないインデックスを探し、それらが使用されていないと判断できる場合は削除します。
その上、テーブル内のデータが更新されると、インデックスが断片化し、必要以上に大きくなる可能性があります。私はpostgresに精通していませんが、インデックスをデフラグして(インデックスを再構築することにより)ディスク上のサイズを減らす方法があると思います。