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

PolarDB:VACUUM 操作の課題と最適化ソリューション

最終更新日:Mar 08, 2025

PolarDB for PostgreSQL では、VACUUM は主要なデータベースメンテナンスコマンドです。VACUUM を使用すると、ストレージ容量の解放、トランザクション ID のラップアラウンドの防止、統計情報の更新、および同時実行パフォーマンスの向上を実現できます。VACUUM を適切に使用することで、データベースの効率的な運用と長期的な安定性を確保できます。ただし、VACUUM コマンドはデータベースのパフォーマンスに大きな影響を与える可能性があるため、使用する際には注意が必要です。コマンドを不適切に使用すると、悪影響が生じる可能性があります。このトピックでは、PolarDB for PostgreSQL での VACUUM 操作の実行における課題と、対応する最適化ソリューションについて説明します。

大きなテーブルの VACUUM

課題

ほとんどの場合、大きなデータベーステーブルは複数のディスクブロックを占有します。テーブルに対してスキャン操作と VACUUM 操作が実行されると、多数の入出力操作が生成されます。VACUUM のパフォーマンスは、さまざまな要因によって制限され、速度が低下する可能性があります。VACUUM の速度が遅いためにガベージデータがすぐにクリアされない場合、テーブルが肥大化し、スキャンする必要のあるデータページの数が増加します。これにより、VACUUM の時間が長くなります。

大きなテーブルでの VACUUM の速度低下に対処するために使用される従来の方法は、データ分散の調整とパラメーターの調整です。ただし、これらの方法では、VACUUM の効率は限定的にしか向上しません。

最適化ソリューション

  • PolarDB for PostgreSQL の VACUUM は、非同期プリフェッチ方式を使用して最適化されています。VACUUM プロセス中に、順次読み取られるブロックがグループ化され、同時実行入出力ワーカープロセスに事前に送信されてプリフェッチされます。この方法により、VACUUM プロセスが 2 倍以上高速化されます。

  • システムは デッドタプル キャッシュ構造を最適化し、VACUUM プロセスでのデッドタプルのより高速なクエリと処理を可能にします。

トランザクション ID のラップアラウンド

課題

PostgreSQL は、32 ビットトランザクション ID(XID)を使用して多版同時実行制御(MVCC)を実装します。ただし、32 ビット XID の値の範囲は限られており、最大値は 4,294,967,295 です。PostgreSQL は、トランザクション ID のラップアラウンド保護メカニズムを使用して、XID の枯渇によるデータの可用性低下を防ぎます。最も古いアクティブなトランザクションと最新のトランザクションの差が 21 億(32 ビット XID 空間の約半分)を超えると、システムはラップアラウンド保護状態になります。この状態では、データベースはシャットダウンし、新しい書き込みトランザクションを拒否します。この問題を解決するには、シングルユーザーモードで VACUUM 操作を実行する必要があります。

最適化ソリューション

トランザクション ID のラップアラウンドの問題に効果的に対処するために、PolarDB for PostgreSQL は、ラップアラウンドのプリトリガー、ラップアラウンド警告しきい値、スーパーユーザー バイパス パラメーターなどのカスタムパラメーターを提供します。PolarDB for PostgreSQL はトランザクション ID を予約し、XID の枯渇によるダウンタイムのリスクを最小限に抑えます。

  • ラップアラウンドのプリトリガー: PolarDB for PostgreSQL は、特定の数のトランザクション ID をバッファーとして予約します。使用可能なトランザクション ID がまもなく枯渇すると、システムはラップアラウンドプロセスをプリトリガーします。トランザクション ID の使用量が予約済みの制限に達すると、データベースはトランザクション ID の割り当てを停止します。

  • ラップアラウンド警告しきい値: トランザクション ID 使用量の警告しきい値。トランザクション ID の使用量がしきい値を超えると、トランザクション ID を消費する SQL 操作によって WARNING レベルのアラートがトリガーされます。

  • スーパーユーザー バイパス パラメーター: トランザクション ID のラップアラウンドがトリガーされたときに スーパーユーザー が使用できる追加のトランザクション ID の数。この場合、 はトランザクション ID を引き続き使用できますが、影響を受けるデータベースで VACUUM FREEZE を実行してトランザクション ID を解放するように通知されます。VACUUM FREEZE

VACUUM TRUNCATE によるロックの競合

課題

VACUUM TRUNCATE は、テーブルの末尾にある未使用のページをオペレーティングシステムに解放する PostgreSQL のメカニズムです。このメカニズムは、テーブルが占有するディスク容量を効果的に削減できますが、ロックの競合とブロッキングに関して重大な課題をもたらします。

テーブルの末尾にある未使用のページを切り捨てるために、PostgreSQL はテーブル全体に排他ロックを適用します。これにより、次の問題が発生します。

  • 読み取りおよび書き込み操作のブロック: ロックされている間、すべての読み取り(SELECT)操作と書き込み操作がブロックされます。

  • DDL 操作のブロック: インデックスの追加やテーブルスキーマの変更などの DDL 操作もブロックされます。

大きなテーブルに頻繁に書き込まれるシナリオでは、VACUUM TRUNCATE によって課される排他ロックによって重大な中断が発生する可能性があります。ミッションクリティカルなシステムでは、短時間のブロッキングでもサービス停止またはユーザーエクスペリエンスの低下につながる可能性があります。従来の最適化方法は、TRUNCATE トリガーパラメーターを調整することです。

最適化ソリューション

VACUUM TRUNCATE によるロックの競合の問題に対処するために、PolarDB for PostgreSQL は次の最適化ソリューションを提供します。

  • 最適化された入出力読み取り効率: PolarDB for PostgreSQL は、非同期並列入出力を使用して、TRUNCATE フェーズ中に入出力操作に費やされる時間を大幅に短縮し、VACUUM TRUNCATE プロセスの全体的な効率を向上させます。

  • カスタマイズ可能な TRUNCATE 時間制御: PolarDB for PostgreSQL では、TRUNCATE フェーズのカスタム時間を指定できます。TRUNCATE 操作が重要なビジネス運用と競合しないように、ロック時間を構成できます。

  • 構成可能なメンテナンスウィンドウ: PolarDB for PostgreSQL では、メンテナンスウィンドウを指定できます。オフピーク時に VACUUM TRUNCATE 操作をスケジュールできます。システムは、メンテナンスウィンドウ中に VACUUM TRUNCATE を含む VACUUM 操作を自動的に実行します。これにより、ピーク時のビジネスへの悪影響を防ぎ、システムの安定性と信頼性が向上します。