VACUUM — 清理和(可選)分析資料庫
VACUUM [ (option
[, ...] ) ] [table_and_columns
[, ...] ] whereoption
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
] PARALLELinteger
SKIP_DATABASE_STATS [boolean
] ONLY_DATABASE_STATS [boolean
] BUFFER_USAGE_LIMITsize
andtable_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_age 和 vacuum_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
設定為 ON
,VACUUM
將保守地從索引中刪除所有死元組。這可能有助於與早期版本的 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
指定 VACUUM
的 Buffer 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
指定是否應開啟或關閉選定的選項。您可以編寫 TRUE
、ON
或 1
來啟用選項,編寫 FALSE
、OFF
或 0
來停用選項。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
[, ...] ]
請注意,在此語法中,選項必須按所示順序精確指定。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。