2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

VACUUM

VACUUM — 清理和(可選)分析資料庫

概要

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]

where option can be one of:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP { AUTO | ON | OFF }
    PROCESS_MAIN [ boolean ]
    PROCESS_TOAST [ boolean ]
    TRUNCATE [ boolean ]
    PARALLEL integer
    SKIP_DATABASE_STATS [ boolean ]
    ONLY_DATABASE_STATS [ boolean ]
    BUFFER_USAGE_LIMIT size

and table_and_columns is:

    [ ONLY ] table_name [ * ] [ ( column_name [, ...] ) ]

描述

VACUUM 重新回收被死元組佔用的儲存空間。在正常的 PostgreSQL 操作中,被刪除或更新廢棄的元組不會從表中物理移除;它們會一直存在,直到執行 VACUUM。因此,有必要定期執行 VACUUM,尤其是在經常更新的表上。

如果不指定 table_and_columns 列表,VACUUM 將處理當前資料庫中當前使用者有權清理的每個表和物化檢視。如果指定了列表,VACUUM 只處理這些表。

VACUUM ANALYZE 對每個選定的表執行一次 VACUUM,然後執行一次 ANALYZE。這是一種方便的組合形式,適用於例行維護指令碼。有關其處理的更多詳細資訊,請參閱 ANALYZE

普通 VACUUM(不帶 FULL)僅回收空間並使其可供重新使用。此形式的命令可以與表的正常讀寫並行操作,因為它不會獲取排他鎖。但是,(在大多數情況下)額外的空間不會返回給作業系統;它只是保留在同一表內以供重新使用。它還允許我們利用多個 CPU 來處理索引。此功能稱為 並行 vacuum。要停用此功能,可以使用 PARALLEL 選項並指定並行工作程序數為零。VACUUM FULL 將整個表的內容重寫到一個新的磁碟檔案中,不留額外空間,允許未使用的空間返回給作業系統。此形式慢得多,並且在處理每個表時需要對該表進行 ACCESS EXCLUSIVE 鎖。

引數

FULL

選擇“full” vacuum,它可以回收更多空間,但需要更長時間並排他地鎖定表。此方法還需要額外的磁碟空間,因為它會寫入表的新副本,並且在操作完成之前不會釋放舊副本。通常,只有在需要從表中回收大量空間時才應使用此方法。

FREEZE

選擇積極地“凍結”元組。指定 FREEZE 等同於執行 VACUUM,並將 vacuum_freeze_min_agevacuum_freeze_table_age 引數設定為零。當重寫表時,總是會進行積極的凍結,因此當指定 FULL 時,此選項是冗餘的。

VERBOSE

INFO 級別列印每個表的詳細 vacuum 活動報告。

ANALYZE

更新用於規劃器確定查詢最高效執行方式的統計資訊。

DISABLE_PAGE_SKIPPING

通常,VACUUM 會根據 可見性圖 跳過頁面。所有元組都已知的凍結頁面可以被跳過,而所有元組都對所有事務可見的頁面可以被跳過(除非執行積極 vacuum)。此外,除非執行積極 vacuum,否則為了避免等待其他會話完成使用它們,某些頁面可能會被跳過。此選項停用所有頁面跳過行為,僅用於在可見性圖的內容可疑時使用,這僅應在存在導致資料庫損壞的硬體或軟體問題時發生。

SKIP_LOCKED

指定 VACUUM 在開始處理關係時,不等待任何衝突鎖被釋放:如果無法在不等待的情況下立即鎖定關係,則跳過該關係。請注意,即使使用此選項,VACUUM 在開啟關係的索引時仍可能阻塞。此外,VACUUM ANALYZE 在從分割槽、表繼承子表和某些型別的外部表獲取取樣行時仍可能阻塞。另外,雖然 VACUUM 通常會處理指定分割槽表的全部分割槽,但此選項會導致 VACUUM 在分割槽表存在衝突鎖時跳過所有分割槽。

INDEX_CLEANUP

通常,當表中死元組非常少時,VACUUM 會跳過索引 vacuum。在這種情況下,處理表的所有索引的成本預計會大大超過刪除死索引元組的收益。此選項可用於強制 VACUUM 在有零個以上的死元組時處理索引。預設值為 AUTO,它允許 VACUUM 在適當的時候跳過索引 vacuum。如果將 INDEX_CLEANUP 設定為 ONVACUUM 將保守地從索引中刪除所有死元組。這可能有助於與早期版本的 PostgreSQL 向後相容,當時這是標準行為。

INDEX_CLEANUP 也可以設定為 OFF,強制 VACUUM 始終 跳過索引 vacuum,即使表中有很多死元組。當有必要使 VACUUM 儘快執行以避免即將發生的事務 ID 迴繞(參見 第 24.1.5 節)時,這可能很有用。但是,由 vacuum_failsafe_age 控制的迴繞故障保護機制通常會自動觸發以避免事務 ID 迴繞失敗,並且應優先使用。如果不定期執行索引清理,效能可能會受到影響,因為隨著表的修改,索引會累積死元組,而表本身會累積無法刪除的死行指標,直到索引清理完成。

此選項對於沒有索引的表無效,如果使用了 FULL 選項則被忽略。它也不會影響事務 ID 迴繞故障保護機制。觸發時,它將跳過索引 vacuum,即使 INDEX_CLEANUP 設定為 ON

PROCESS_MAIN

指定 VACUUM 應嘗試處理主關係。這通常是期望的行為,也是預設行為。當只需要 vacuum 關係的相應 TOAST 表時,將此選項設定為 false 可能很有用。

PROCESS_TOAST

指定 VACUUM 應嘗試處理每個關係相應的 TOAST 表(如果存在)。這通常是期望的行為,也是預設行為。當只需要 vacuum 主關係時,將此選項設定為 false 可能很有用。使用 FULL 選項時需要此選項。

TRUNCATE

指定 VACUUM 應嘗試截斷表末尾的任何空頁面,並將截斷頁面的磁碟空間返回給作業系統。這通常是期望的行為,並且是預設行為,除非 vacuum_truncate 設定為 false 或已為要 vacuum 的表將 vacuum_truncate 選項設定為 false。當需要避免對錶進行 ACCESS EXCLUSIVE 鎖時(截斷需要此鎖),將此選項設定為 false 可能很有用。如果使用了 FULL 選項,則忽略此選項。

PARALLEL

使用 integer 個後臺工作程序並行執行 VACUUM 的索引 vacuum 和索引清理階段(有關每個 vacuum 階段的詳細資訊,請參閱 表 27.46)。用於執行操作的工作程序數量等於關係上支援並行 vacuum 的索引數量,該數量受 PARALLEL 選項指定的數量限制(如果存在),並進一步受 max_parallel_maintenance_workers 的限制。當且僅當索引的大小大於 min_parallel_index_scan_size 時,索引才能參與並行 vacuum。請注意,不能保證將在執行過程中使用 integer 指定的並行工作程序數量。vacuum 可能會使用少於指定數量的工作程序,甚至根本不使用任何工作程序。每個索引只能使用一個工作程序。因此,只有當表中有至少 2 個索引時,才會啟動並行工作程序。vacuum 的工作程序在每個階段開始前啟動,並在階段結束時退出。這些行為在未來版本中可能會改變。此選項不能與 FULL 選項一起使用。

SKIP_DATABASE_STATS

指定 VACUUM 應跳過更新關於最舊未凍結 XID 的資料庫範圍統計資訊。通常 VACUUM 會在命令結束時更新這些統計資訊一次。但是,在具有大量表的資料庫中,這可能需要一段時間,並且除非包含最舊未凍結 XID 的表是已 vacuum 的表之一,否則它將無濟於事。此外,如果並行發出多個 VACUUM 命令,一次只有一個可以更新資料庫範圍的統計資訊。因此,如果應用程式打算發出連續的許多 VACUUM 命令,那麼在最後一個命令之外的所有命令中設定此選項可能很有幫助;或者在所有命令中設定此選項,並另外發出 VACUUM (ONLY_DATABASE_STATS)

ONLY_DATABASE_STATS

指定 VACUUM 除了更新關於最舊未凍結 XID 的資料庫範圍統計資訊外,不做任何其他事情。指定此選項時,table_and_columns 列表必須為空,並且除了 VERBOSE 之外,不能啟用任何其他選項。

BUFFER_USAGE_LIMIT

指定 VACUUMBuffer Access Strategy 環形緩衝區大小。此大小用於計算將作為此策略一部分重用的共享緩衝區數量。0 停用 Buffer Access Strategy 的使用。如果還指定了 ANALYZE,則 BUFFER_USAGE_LIMIT 值將用於 vacuum 和 analyze 階段。除非還指定了 ANALYZE,否則此選項不能與 FULL 選項一起使用。當未指定此選項時,VACUUM 使用 vacuum_buffer_usage_limit 的值。更高的設定可以使 VACUUM 執行得更快,但設定過大會導致太多其他有用的頁面被從共享緩衝區中逐出。最小值是 128 kB,最大值是 16 GB

boolean

指定是否應開啟或關閉選定的選項。您可以編寫 TRUEON1 來啟用選項,編寫 FALSEOFF0 來停用選項。boolean 值也可以省略,在這種情況下假定為 TRUE

integer

指定一個傳遞給所選選項的非負整數值。

size

指定以千位元組為單位的記憶體量。大小也可以指定為包含數值大小的字串,後跟以下任何一個記憶體單位:B(位元組)、kB(千位元組)、MB(兆位元組)、GB(千兆位元組)或 TB(太位元組)。

table_name

要 vacuum 的特定表或物化檢視的名稱(可選模式限定)。如果 ONLY 在表名前指定,則只 vacuum 該表。如果未指定 ONLY,則該表及其所有繼承子表或分割槽(如果有)也將被 vacuum。可選地,可以在表名後指定 * 來明確表示要 vacuum 繼承子表(或分割槽)。

column_name

要分析的特定列的名稱。預設為所有列。如果指定了列列表,則必須同時指定 ANALYZE

輸出

當指定 VERBOSE 時,VACUUM 會發出進度訊息,指示當前正在處理哪個表。還會打印表的各種統計資訊。

註釋

要 vacuum 一個表,通常必須擁有該表的 MAINTAIN 許可權。但是,資料庫所有者可以 vacuum 其資料庫中的所有表,共享目錄除外。VACUUM 將跳過呼叫使用者沒有許可權 vacuum 的任何表。

VACUUM 執行時,search_path 會臨時更改為 pg_catalog, pg_temp

VACUUM 不能在事務塊內執行。

對於具有GIN索引的表,VACUUM(任何形式)還會透過將掛起的索引條目移動到主GIN索引結構中的適當位置來完成任何掛起的索引插入。有關詳細資訊,請參閱 第 65.4.4.1 節

我們建議所有資料庫都定期 vacuum 以刪除死行。PostgreSQL 包含一個“autovacuum”設施,可以自動化例行 vacuum 維護。有關自動和手動 vacuum 的更多資訊,請參閱 第 24.1 節

不建議在日常使用 FULL 選項,但在特殊情況下可能有用。例如,當您刪除或更新了表中的大多數行,並且希望表物理收縮以佔用更少的磁碟空間並允許更快的表掃描時。VACUUM FULL 通常比普通 VACUUM 收縮表的效果更好。

PARALLEL 選項僅用於 vacuum 目的。如果此選項與 ANALYZE 選項一起指定,則它不會影響 ANALYZE

VACUUM 會導致 I/O 流量大幅增加,這可能會導致其他活動會話效能不佳。因此,有時建議使用基於成本的 vacuum 延遲功能。對於並行 vacuum,每個工作程序會根據該工作程序完成的工作量進行休眠。有關詳細資訊,請參閱 第 19.10.2 節

每個執行 VACUUM(不帶 FULL 選項)的後端將在 pg_stat_progress_vacuum 檢視中報告其進度。執行 VACUUM FULL 的後端將在 pg_stat_progress_cluster 檢視中報告其進度。有關詳細資訊,請參閱 第 27.4.5 節第 27.4.2 節

示例

清理單個表 onek,為最佳化器分析它,並列印詳細的 vacuum 活動報告

VACUUM (VERBOSE, ANALYZE) onek;

相容性

SQL 標準中沒有 VACUUM 語句。

PostgreSQL 版本 9.0 之前使用了以下語法,並且仍然支援

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

請注意,在此語法中,選項必須按所示順序精確指定。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。