

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 透過清空回收儲存空間
<a name="limitless-vacuum"></a>

PostgreSQL 多版本並行控制 (MVCC) 可透過儲存更新或刪除列的內部副本，直到交易遞交或復原為止，協助保持資料完整性。如果未定期清除，稱為*元組*的這些副本可能會導致資料表膨脹。PostgreSQL 執行個體會依交易 ID 排序交易，而 PostgreSQL 會使用交易 ID 型 MVCC 來控制元組可見性並提供交易隔離。每個交易都會建立資料的快照，而且每個元組都有版本。快照和版本都是以交易 ID 為基礎。

若要清除資料，`VACUUM` 公用程式會在 PostgreSQL 中執行四個關鍵函數：
+ `VACUUM`：移除過期的列版本，讓空間可供重複使用。
+ `VACUUM FULL`：透過移除無效列版本與壓縮資料表、減少大小與提高效率，來提供完整的重組。
+ `VACUUM FREEZE`：將較舊的列版本標記為凍結，以防止交易 ID 包裝問題。
+ `VACUUM ANALYZE`：移除無效列版本與更新資料庫的查詢規劃統計資料。這是 `VACUUM` 和 `ANALYZE` 函數的組合。如需 `ANALYZE` 如何在 Aurora PostgreSQL Limitless Database 中運作的詳細資訊，請參閱 [ANALYZE](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.ANALYZE)。

 如同 MVCC，Aurora PostgreSQL 中的清空是以交易 ID 為基礎。如果在清空開始時有進行中的交易，則不會移除該交易仍然可見的列。

如需 `VACUUM` 公用程式的詳細資訊，請參閱 PostgreSQL 文件中的 [VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html)。如需 Aurora PostgreSQL Limitless Database 中 `VACUUM` 支援的詳細資訊，請參閱 [VACUUM](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.VACUUM)。

**Topics**
+ [AUTOVACUUM](#limitless-autovacuum)
+ [Aurora PostgreSQL Limitless Database 中以時間為基礎的清空](#limitless-vacuum.time-based)
+ [使用資料庫統計資料進行清空](#limitless-vacuum.stats)
+ [Aurora PostgreSQL 和 Aurora PostgreSQL Limitless Database 之間清空行為的差異](#limitless-vacuum-limitations)

## AUTOVACUUM
<a name="limitless-autovacuum"></a>

Aurora PostgreSQL 使用 `VACUUM` 和 `AUTOVACUUM` 公用程式來移除不需要的元組。`AUTOVACUUM` 和手動 `VACUUM` 的基礎機制相同；唯一的差異是自動化。

`AUTOVACUUM` 在 Aurora PostgreSQL 和 Aurora PostgreSQL Limitless Database 中是 `VACUUM` 和 `ANALYZE` 公用程式的組合。`AUTOVACUUM` 會根據預先定義的規則，決定要清除哪些資料庫和資料表，例如無效元組的百分比和插入次數。

例如，`AUTOVACUUM` 會定期「喚醒」以執行清除。間隔由 `autovacuum_naptime` 參數控制。預設值為 1 分鐘。Aurora PostgreSQL Limitless Database 的 `AUTOVACUUM` 和 `VACUUM` 組態參數預設值與 Aurora PostgreSQL 相同。

如果啟用 `AUTOVACUUM` 常駐程式，則每當資料表的內容有足夠變更時，該常駐程式會自動發出 `ANALYZE` 命令。在 Aurora PostgreSQL Limitless Database 中，`AUTOVACUUM` 都會在路由器和碎片發出 `ANALYZE`。

如需與 `AUTOVACUUM` 相關聯的 `AUTOVACUUM` 常駐程式和資料表儲存參數的詳細資訊，請參閱 PostgreSQL 文件中的[自動清空常駐程式](https://www.postgresql.org/docs/current/routine-vacuuming.html#AUTOVACUUM )和[儲存參數](https://www.postgresql.org/docs/current/runtime-config-autovacuum.html)。

## Aurora PostgreSQL Limitless Database 中以時間為基礎的清空
<a name="limitless-vacuum.time-based"></a>

Aurora PostgreSQL Limitless Database 是分散式系統，這表示交易中可能涉及多個執行個體。因此，以交易 ID 為基礎的可見性就不適用。反之，Aurora PostgreSQL Limitless Database 會使用*以時間為基礎*的可見性，因為跨執行個體的交易 ID 不會「統一」，但跨執行個體的時間可以「統一」。每個交易快照和每個元組版本都遵守時間 (而不是交易 ID)。更具體而言，交易快照具有快照開始時間，而元組具有建立時間 (當 `INSERT`或 `UPDATE` 發生時) 和刪除時間 (當 `DELETE` 發生時)。

為了維持資料庫碎片群組中執行個體中的資料一致性，Aurora PostgreSQL Limitless Database 必須確保清空不會移除資料庫碎片群組中任何作用中交易仍然可見的任何元組。因此，Aurora PostgreSQL Limitless Database 中的清空也是以時間為基礎。`VACUUM` 的其他方面保持不變，包括在特定資料表上執行 `VACUUM` 的方面，使用者必須能夠存取該資料表。

**注意**  
強烈建議您不要讓交易長時間處於未結狀態。  
相較於以交易 ID 為基礎的清空，以時間為基礎的清空耗用的記憶體更多。

下列範例說明以時間為基礎的清空的運作方式。

1. 客戶資料表會分佈到四個碎片。

1. 交易 1 會從可重複讀取開始，並僅鎖定一個碎片 (碎片 1)。此交易保持未結狀態。

   交易 1 比之後啟動的任何其他交易更舊。

1. 交易 2 稍後啟動，並從資料表中刪除所有元組，然後遞交。

1. 如果 `AUTOVACUUM` 或手動 `VACUUM` 嘗試清除無效元組 (因交易 2 而失效)，則不會移除任何項目。

   這不僅適用於碎片 1，也適用於碎片 2–4，因為交易 1 仍可能需要存取這些元組。由於 MVCC，交易 1 仍然可以看到這些項目。

最後一步是透過同步來達成，因此所有碎片都知道交易 1，即使交易 1 未觸及所有碎片。

## 使用資料庫統計資料進行清空
<a name="limitless-vacuum.stats"></a>

若要取得您可能需要清除的元組資訊，請使用 [limitless\_stat\_all\_tables](limitless-monitoring-views.md#limitless_stat_all_tables) 檢視，其運作方式類似於 [pg\_stat\_all\_tables](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW)。以下範例會查詢此檢視。

```
SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';
```

同樣地，對於資料庫統計資料，請使用 [limitless\_stat\_database](limitless-monitoring-views.md#limitless_stat_database) (而不是 [pg\_stat\_database](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW))，以及 [limitless\_stat\_activity](limitless-monitoring-views.md#limitless_stat_activity) (而不是 [pg\_stat\_activity](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW))。

若要檢查資料表磁碟用量，請使用 [limitless\_stat\_relation\_sizes](limitless-monitoring-functions.md#limitless_stat_relation_sizes) 函數，其運作方式類似於 [pg\_relation\_size](https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADMIN-DBOBJECT)。下列範例會查詢此函數。

```
SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');
```

若要追蹤 Aurora PostgreSQL Limitless Database 上 `VACUUM` 操作的進度，請使用 [limitless\_stat\_progress\_vacuum](limitless-monitoring-views.md#limitless_stat_progress_vacuum) 檢視 (而非 [pg\_stat\_progress\_vacuum](https://www.postgresql.org/docs/15/progress-reporting.html#VACUUM-PROGRESS-REPORTING))。以下範例會查詢此檢視。

```
SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;
```

如需詳細資訊，請參閱[Aurora PostgreSQL Limitless Database 檢視](limitless-monitoring-views.md)及[Aurora PostgreSQL Limitless Database 函數](limitless-monitoring-functions.md)。

## Aurora PostgreSQL 和 Aurora PostgreSQL Limitless Database 之間清空行為的差異
<a name="limitless-vacuum-limitations"></a>

Aurora PostgreSQL 和 Aurora PostgreSQL Limitless Database 在清空運作方式的一些其他差異如下：
+ Aurora PostgreSQL 會對交易 ID 執行 `VACUUM` 操作，直到最舊的進行中交易為止。如果資料庫中沒有持續的交易，`VACUUM` 會執行操作，直到上次交易為止。
+ Aurora PostgreSQL Limitless Database 每 10 秒同步一次最舊的時間快照。因此，`VACUUM` 可能不會對過去 10 秒內執行的任何交易執行操作。

如需在 Aurora PostgreSQL Limitless Database 中支援 `VACUUM` 的資訊，請參閱 [VACUUM](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.VACUUM)中的 [Aurora PostgreSQL Limitless Database 參考Limitless Database 參考](limitless-reference.md)。