すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS for PostgreSQLインスタンスのテーブルが占有するストレージの削減

最終更新日:Jan 02, 2025

ApsaraDB RDS for PostgreSQLインスタンスが実行されると、テーブル内に多数のテーブルスペースフラグメントが生成されます。 ApsaraDB RDS for PostgreSQLの自動真空機能は、各ページ内のスペースのみを管理できますが、ディスクスペースを解放するためにページ数を効果的に減らすことはできません。 この場合、VACUUM FULL、pg_repack、およびpg_squeezeを使用して、RDSインスタンスのテーブルが占有するストレージを削減できます。

概要

  • VACUUM FULL、pg_repack、pg_squeezeと比較した自動真空のクリーンアップ効果

    image
  • ストレージ容量の削減に関する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は、既存のデータと増分データを処理して前述の目的を実装します。

  1. 既存のデータを処理し、元のテーブルのスナップショットコピーである新しいテーブルを生成します。

  2. 増分データを処理し、トリガーを使用して、新しく生成されたデータを一時テーブルに継続的に保存します。

  3. 増分データが完全に処理されていることを確認します。 新しいテーブルが生成された後、一時テーブルが空になるまで、一時テーブルの増分データが新しいテーブルに適用されます。 これにより、すべての増分データが転送されます。

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を使用することを推奨します。