ApsaraDB RDS for PostgreSQLインスタンスが実行されると、テーブル内に多数のテーブルスペースフラグメントが生成されます。 ApsaraDB RDS for PostgreSQLの自動真空機能は、各ページ内のスペースのみを管理できますが、ディスクスペースを解放するためにページ数を効果的に減らすことはできません。 この場合、VACUUM FULL、pg_repack、およびpg_squeezeを使用して、RDSインスタンスのテーブルが占有するストレージを削減できます。
概要
VACUUM FULL、pg_repack、pg_squeezeと比較した自動真空のクリーンアップ効果
ストレージ容量の削減に関するVACUUM FULL、pg_repack、pg_squeezeの比較
ストレージ容量の削減方法
メリット
制限事項
シナリオ
真空フル
データをクリアするテーブルに制限はありません。 追加の拡張は必要ありません。
実行中に、VACUUM FULLは必要なテーブルに排他ロックを追加します。 その結果、実行中にテーブルにアクセスすることはできません。
必要なテーブルのデータは、特定の期間内に使用できない場合があります。
pg_repack
テーブルが再作成されると、テーブルデータを追加、削除、変更、またはクエリできます。
再作成されたテーブルには、主キーまたは一意のキーが必要です。
pg_repack拡張が必要です。
コンピューターにpg_repackクライアントをインストールし、クライアントを使用して必要なデータベースに接続し、再パック操作を実行する必要があります。
必要なテーブルのデータは頻繁に変更する必要があります。
pg_squeeze
テーブルが再作成されると、テーブルデータを追加、削除、変更、またはクエリできます。
クリアされたテーブルには、主キーまたは一意のキーが必要です。
pg_squeeze拡張子をインストールする必要がありますが、コンピュータにpg_squeezeクライアントをインストールする必要はありません。
大量の増分データが連続して書き込まれる場合、pg_squeeze拡張は操作を完了できない可能性があります。
必要なテーブルのデータを頻繁に変更する必要はありません。
真空フル
VACUUM FULLは、テーブルを再作成するためにPostgreSQLコミュニティによって提供されるコマンドです。 このコマンドは、元のテーブルのレプリカを生成してから、元のテーブルを削除します。 VACUUM FULLは、データをクリアするテーブルに制限を課しません。 ただし、VACUUM FULLは、実行中に必要なテーブルに排他ロックを追加します。 その結果、テーブルにアクセスできず、ワークロードに大きな影響を与えます。
pg_repack
pg_repackを使用すると、テーブルの再作成中にテーブルデータを追加、削除、変更、およびクエリできます。 これにより、VACUUM FULLによって引き起こされる問題が効果的に解決されます。 ただし、pg_repackには制限があります。 たとえば、pg_repackを使用する場合、再作成されたテーブルには主キーまたは一意のキーが必要です。 pg_repackの使用は比較的複雑です。 コンピューターにpg_repackクライアントをインストールし、クライアントを使用して必要なデータベースに接続し、repack操作を実行する必要があります。これにより、本番環境に不便が生じる可能性があります。
pg_repackは、既存のデータと増分データを処理して前述の目的を実装します。
既存のデータを処理し、元のテーブルのスナップショットコピーである新しいテーブルを生成します。
増分データを処理し、トリガーを使用して、新しく生成されたデータを一時テーブルに継続的に保存します。
増分データが完全に処理されていることを確認します。 新しいテーブルが生成された後、一時テーブルが空になるまで、一時テーブルの増分データが新しいテーブルに適用されます。 これにより、すべての増分データが転送されます。
pg_repackの使用方法の詳細については、「pg_repack拡張機能を使用してテーブルスペースをクリアする」をご参照ください。
pg_squeeze
pg_repackと同様に、pg_squeezeは、追加、削除、変更、およびクエリ操作をブロックせずにテーブルデータをクリアできます。 pg_squeezeを使用してテーブルデータをクリアする場合、テーブルには主キーまたは一意キーが必要です。 pg_squeezeはpg_repackよりも使いやすいです。 必要なデータベースにpg_squeeze拡張機能をインストールするだけで済みます。 pg_squeezeは自動検出をサポートし、クリーンアップ操作をトリガーできます。
pg_squeezeは、pg_repackと同様に機能します。 ただし、pg_squeezeは、pg_repackとは異なる方法で増分データを格納します。 pg_squeezeは、論理レプリケーションを使用して、PostgreSQLの内部データ構造に増分データを格納します。 pg_repackはトリガーを使用してデータを一時テーブルに格納します。
pg_squeezeの使用方法の詳細については、「pg_squeeze拡張機能を使用して肥大化したテーブルとインデックスを縮小する」をご参照ください。
pg_repackとpg_squeezeのパフォーマンス比較
拡張は、同じ特徴および同様の制限を有する。 運用環境では、パフォーマンスに基づいて拡張機能を選択できます。
クリーンアップ操作中に増分データが書き込まれない場合、拡張機能は同様のパフォーマンスを提供します。 クリーンアップ操作中に固定量の増分データが書き込まれた場合、pg_squeezeはpg_repackよりも優れたパフォーマンスを発揮します。 クリーンアップ操作中に大量の増分データが継続的に書き込まれると、pg_squeezeが操作を完了できない場合があります。
pg_squeezeは、テーブルの書き込みパフォーマンスを元の書き込みパフォーマンスの50% に低下させます。 pg_repackは、テーブルの書き込みパフォーマンスを元の書き込みパフォーマンスの10% に低下させます。 pg_repackは、トリガーと一時テーブルを使用して増分データを保存します。 pg_repackを使用してテーブルデータをクリアすると、書き込み速度が大幅に低下し、すべての増分データが消費される可能性があります。 pg_squeezeを使用してテーブルデータをクリアすると、増分データを適用する速度よりも速く増分データが生成される可能性があります。 その結果、増分データを完全に消費することができない。
頻繁に変更されるテーブルにはpg_repackを使用し、他のシナリオではpg_squeezeを使用することを推奨します。