

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

# 自動清空和分析資料表
<a name="autovacuum"></a>

自動清空是一種協助程式 （即在背景中執行），可自動*清空* （清除） 無效元組、回收儲存體並收集統計資料。它會檢查資料庫中是否有膨脹的資料表，並清除膨脹以重複使用空間。它會監控資料庫資料表和索引，並在達到更新或刪除操作的特定閾值後將其新增至清空任務。

自動清空會透過自動化 PostgreSQL `VACUUM`和`ANALYZE`命令來管理清空。 會從資料表`VACUUM`中移除膨脹並回收空間，而 會`ANALYZE`更新統計資料，讓最佳化工具能夠產生有效率的計劃。 `VACUUM`也會執行稱為*清空凍結*的主要任務，以防止資料庫中的交易 ID 包裝問題。資料庫中更新的每個資料列都會從 PostgreSQL 交易控制機制收到交易 ID。這些 IDs控制資料列對其他並行交易的可見性。交易 ID 是 32 位元的號碼。20 億IDs 一律保留在可見的過去。剩餘的 （約 22 億） IDs 會保留給未來將發生的交易，並隱藏在目前的交易中。PostgreSQL 需要偶爾清理和*凍結*舊資料列，以防止交易在建立新交易時包裝和隱藏舊的現有資料列。如需詳細資訊，請參閱 PostgreSQL 文件中的「[避免交易 ID 包圍失敗](https://www.postgresql.org/docs/current/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND)」。

根據預設，建議並啟用自動清空。其參數包括下列項目。


|  |  |  |  | 
| --- |--- |--- |--- |
| **Parameter (參數)** | **Description** | **Amazon RDS 的預設值** | **Aurora 的預設** | 
| `autovacuum_vacuum_threshold` | 在自動清空之前，資料表上必須發生的元組更新或刪除操作數目下限。 | 50 個操作 | 50 個操作 | 
| `autovacuum_analyze_threshold` | 在自動清空分析資料表之前，必須在資料表上發生的元組插入、更新或刪除數目下限。 | 50 個操作 | 50 個操作 | 
| `autovacuum_vacuum_scale_factor` | 在自動清空之前，必須在資料表中修改的元組百分比。 | 0.1 | 0.1 | 
| `autovacuum_analyze_scale_factor` | 在自動清空分析之前，必須在資料表中修改的元組百分比。 | 0.05 | 0.05 | 
| `autovacuum_freeze_max_age` | 清空資料表之前凍結 IDs 的最長存留期，以防止交易 ID 包裝問題。 | 200，000，000 筆交易 | 200，000，000 筆交易 | 

自動清空會根據特定閾值公式建立要處理的資料表清單，如下所示。
+ 在資料表`VACUUM`上執行的閾值：

  ```
  vacuum threshold = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor * Total row count of table)
  ```
+ 在資料表`ANALYZE`上執行的閾值：

  ```
  analyze threshold = autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor * Total row count of table)
  ```

對於中小型資料表，預設值可能已足夠。不過，經常修改資料的大型資料表會有較多的無效元組。在此情況下，自動清空可能會經常處理資料表以進行維護，而其他資料表的維護可能會延遲或被忽略，直到大型資料表完成為止。若要避免這種情況，您可以調校下一節所述的自動清空參數。

## 自動清空記憶體相關參數
<a name="autovacuum-parameters"></a>

**`autovacuum_max_workers`**

指定可同時執行的自動清空程序數目上限 （自動清空啟動器除外）。只有在您啟動伺服器時，才能設定此參數。如果自動清空程序忙碌於大型資料表，此參數可協助執行其他資料表的清除。

**`maintenance_work_mem`**

指定維護操作要使用的記憶體數量上限`CREATE INDEX`，例如 `VACUUM`、 和 `ALTER`。在 Amazon RDS 和 Aurora 中，會使用公式 ，根據執行個體類別配置記憶體`GREATEST({DBInstanceClassMemory/63963136*1024},65536)`。當自動清空執行時，最多可以配置計算值的`autovacuum_max_workers`倍數，因此請小心不要將值設定得太高。若要控制此項目，您可以`autovacuum_work_mem`分別設定 。

**`autovacuum_work_mem`**

指定每個自動清空工作者程序要使用的記憶體數量上限。此參數預設為 -1，這表示您應該`maintenance_work_mem`改用 的值。

如需自動清空記憶體參數的詳細資訊，請參閱 Amazon RDS 文件中的[為自動清空配置記憶體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Autovacuum.html#Appendix.PostgreSQL.CommonDBATasks.Autovacuum.WorkMemory)。

## 調校自動清空參數
<a name="autovacuum-tuning"></a>

使用者可能需要根據其更新和刪除操作來調整自動清空參數。您可以在資料表、執行個體或叢集層級設定下列參數的設定。

### 叢集或執行個體層級
<a name="autovacuum-cluster-instance"></a>

舉例來說，我們來看看預期會持續資料處理語言 (DML) 操作的銀行資料庫。為了維護資料庫的運作狀態，您應該在 Aurora 的叢集層級和 Amazon RDS 的執行個體層級調整自動清空參數，並將相同的參數群組套用至讀取器。在容錯移轉的情況下，相同的參數應套用至新的寫入器。

### 資料表層級
<a name="autovacuum-table"></a>

例如，在食品交付的資料庫中，在名為 的單一資料表上預期會持續執行 DML 操作`orders`，您應該考慮使用下列命令，在資料表層級調校 `autovacuum_analyze_threshold` 參數：

```
ALTER TABLE <table_name> SET (autovacuum_analyze_threshold = <threshold rows>)
```

### 在資料表層級使用積極的自動清空設定
<a name="autovacuum-table-aggressive"></a>

由於預設的自動清空設定，具有持續更新和刪除操作的範例`orders`資料表會成為清空的候選項目。這會導致計畫產生不佳和查詢緩慢。清除膨脹和更新統計資料需要資料表層級積極的自動清空設定。

若要判斷設定，請追蹤在此資料表上執行的查詢持續時間，並識別導致計劃變更的 DML 操作百分比。`pg_stat_user_tables` 檢視可協助您追蹤插入、更新和刪除操作。

範例：

假設最佳化工具每當 5% 的`orders`資料表變更時會產生錯誤的計劃。在此情況下，您應該將縮放係數閾值變更為 2%，如下所示：

```
ALTER TABLE orders SET (autovacuum_vacuum_scale_factor = 0.02)
```

**提示**  
請仔細選取積極的自動清空設定，以避免高耗用資源。

如需詳細資訊，請參閱下列內容：
+ [了解 Amazon RDS for PostgreSQL 環境中的自動清空](https://aws.amazon.com/blogs/database/understanding-autovacuum-in-amazon-rds-for-postgresql-environments/) (AWS 部落格文章）
+ [自動清空 ](https://www.postgresql.org/docs/17/runtime-config-autovacuum.html)(PostgreSQL 文件）
+ [在 Amazon RDS 和 Amazon Aurora 中調校 PostgreSQL 參數](https://docs.aws.amazon.com//prescriptive-guidance/latest/tuning-postgresql-parameters/) (AWS 方案指引）

為了確保自動清空有效運作，請監控無效資料列、磁碟用量，以及最後一次自動清空或定期`ANALYZE`執行。`pg_stat_all_tables` 檢視提供每個資料表 (`relname`) 的資訊，以及資料表中有多少無效元組 (`n_dead_tup`)。

監控每個資料表中的無效元組數量，尤其是經常更新的資料表，可協助您判斷自動清空程序是否定期移除無效元組，以便重複使用其磁碟空間以獲得更好的效能。您可以使用下列查詢來檢查無效元組的數量，以及上次自動清空在資料表上執行的時間：

```
SELECT
relname AS TableName,n_live_tup AS LiveTuples,n_dead_tup AS DeadTuples,
last_autovacuum AS Autovacuum,last_autoanalyze AS Autoanalyze_FROM 
pg_stat_user_tables;
```

## 優點和限制
<a name="autovacuum_limitations"></a>

Autovacuum 提供下列優點：
+ 它會自動從資料表中移除膨脹。
+ 它可防止交易 ID 包裝。
+ 它可讓資料庫統計資料保持最新狀態。

限制:
+ 如果查詢使用平行處理，工作者程序的數量可能不足以自動清空。
+ 如果自動清空在尖峰時段執行，資源使用率可能會增加。您應該調校參數來處理此問題。
+ 如果在另一個工作階段中佔用資料表頁面，自動清空可能會略過這些頁面。
+ 自動清空無法存取暫存資料表。