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:table_name
[ (column_name
[, ...] ) ]
VACUUM
回收被無效元組佔用的儲存空間。在正常的 PostgreSQL 操作中,被刪除或被更新過時的元組不會從其資料表中被實際移除;它們會一直存在,直到執行 VACUUM
。因此,有必要定期執行 VACUUM
,尤其是在經常更新的資料表上。
如果沒有 table_and_columns
列表,VACUUM
會處理目前資料庫中,目前使用者有權限進行 vacuum 的每個資料表和實體化檢視。如果有一個列表,VACUUM
則只會處理那些資料表。
VACUUM ANALYZE
會先執行 VACUUM
,然後再對每個選定的資料表執行 ANALYZE
。這是一個方便的組合形式,適用於例行維護指令碼。有關其處理的更多詳細資料,請參閱 ANALYZE。
單純的 VACUUM
(不含 FULL
)僅回收空間並使其可供重新使用。此命令形式可以與資料表的正常讀寫並行運作,因為不會取得獨佔鎖定。但是,額外的空間不會返回給作業系統(在大多數情況下);它只是保留在同一個資料表中以供重新使用。它也允許我們利用多個 CPU 來處理索引。此功能稱為並行 vacuum。若要停用此功能,可以使用 PARALLEL
選項並將並行工作者指定為零。VACUUM FULL
將資料表的整個內容重寫到一個新的磁碟檔案中,不包含額外的空間,從而允許將未使用的空間返回給作業系統。這種形式的速度較慢,並且在處理每個資料表時,都需要在該資料表上取得 ACCESS EXCLUSIVE
鎖定。
FULL
選擇 「完整」 vacuum,它可以回收更多空間,但需要更長的時間並且會獨佔鎖定資料表。這種方法還需要額外的磁碟空間,因為它會寫入資料表的新副本,並且直到操作完成後才會釋放舊副本。通常,只有在需要從資料表內部回收大量空間時才應使用此方法。
FREEZE
選擇積極的 「凍結」 元組。指定 FREEZE
相當於執行 VACUUM
,並將 vacuum_freeze_min_age 和 vacuum_freeze_table_age 參數設定為零。當重寫資料表時,始終會執行積極凍結,因此當指定 FULL
時,此選項是多餘的。
VERBOSE
為每個資料表列印詳細的 vacuum 活動報告。
ANALYZE
更新規劃器用來確定執行查詢之最有效方式的統計資訊。
DISABLE_PAGE_SKIPPING
通常,VACUUM
將根據 可見性對應 跳過頁面。已知所有元組都已凍結的頁面始終可以跳過,並且已知所有元組對所有交易都可見的頁面可以跳過,除非執行積極的 vacuum。此外,除非執行積極的 vacuum,否則可能會跳過某些頁面,以避免等待其他會話完成使用它們。此選項會停用所有頁面跳過行為,並且僅在可見性對應的內容可疑時才應使用,只有在發生導致資料庫損壞的硬體或軟體問題時才會發生這種情況。
SKIP_LOCKED
指定 VACUUM
在開始處理關係時,不應等待任何衝突鎖定被釋放:如果無法立即鎖定關係而不必等待,則會跳過該關係。請注意,即使使用此選項,VACUUM
在開啟關係的索引時仍可能會被封鎖。此外,VACUUM ANALYZE
在從分割區、資料表繼承子資料表和某些類型的外部資料表取得範例列時,仍可能會被封鎖。此外,雖然 VACUUM
通常會處理指定分割資料表的所有分割區,但如果分割資料表上存在衝突鎖定,則此選項會導致 VACUUM
跳過所有分割區。
INDEX_CLEANUP(索引清理)
通常,當資料表中只有極少量的死亡元組時,VACUUM
會跳過索引清理。 這是因為處理資料表所有索引的成本,預期會遠遠超過移除死亡索引元組的好處。 此選項可用於強制 VACUUM
在死亡元組大於零時處理索引。 預設值為 AUTO
,這允許 VACUUM
在適當的時候跳過索引清理。 如果 INDEX_CLEANUP
設定為 ON
,VACUUM
會保守地從索引中移除所有死亡元組。 這對於與早期版本的 PostgreSQL 向後相容可能很有用,因為這是標準行為。
INDEX_CLEANUP
也可以設定為 OFF
,以強制 VACUUM
永遠 跳過索引清理,即使資料表中有大量的死亡元組。 當需要讓 VACUUM
盡可能快速地執行,以避免即將發生的交易 ID 迴繞時(請參閱第 24.1.5 節),這可能很有用。 然而,由 vacuum_failsafe_age 控制的迴繞安全機制通常會自動觸發以避免交易 ID 迴繞失敗,並且應該優先使用。 如果不定期執行索引清理,效能可能會受到影響,因為隨著資料表的修改,索引將累積死亡元組,並且資料表本身將累積死亡行指標,直到完成索引清理後才能移除。
此選項對於沒有索引的資料表沒有任何作用,如果使用 FULL
選項,則會忽略此選項。 它也不會影響交易 ID 迴繞安全機制。 觸發時,即使 INDEX_CLEANUP
設定為 ON
,也會跳過索引清理。
PROCESS_MAIN(處理主資料表)
指定 VACUUM
應嘗試處理主關係資料表。 這通常是期望的行為,也是預設值。 如果只需要清理關係資料表對應的 TOAST
資料表,則將此選項設定為 false 可能很有用。
PROCESS_TOAST(處理 TOAST 資料表)
指定 VACUUM
應嘗試處理每個關係資料表對應的 TOAST
資料表(如果存在)。 這通常是期望的行為,也是預設值。 如果只需要清理主關係資料表,則將此選項設定為 false 可能很有用。 使用 FULL
選項時,必須使用此選項。
TRUNCATE(截斷)
指定 VACUUM
應嘗試截斷資料表結尾的任何空白頁面,並允許將截斷頁面的磁碟空間返回給作業系統。 這通常是期望的行為,也是預設值,除非已將要清理的資料表的 vacuum_truncate
選項設定為 false。 將此選項設定為 false 可能有助於避免截斷所需的資料表上的 ACCESS EXCLUSIVE
鎖定。 如果使用 FULL
選項,則會忽略此選項。
PARALLEL(平行)
使用 integer
背景工作程序平行執行 VACUUM
的索引清理和索引清理階段(有關每個清理階段的詳細資訊,請參閱表 27.46)。用於執行操作的工作程序數量等於關係資料表中支援平行清理的索引數量,該數量受使用 PARALLEL
選項指定的工作程序數量(如果有的話)限制,該數量進一步受到 max_parallel_maintenance_workers 的限制。只有當索引的大小大於 min_parallel_index_scan_size 時,索引才能參與平行清理。請注意,不能保證在執行期間會使用 integer
中指定的平行工作程序數量。清理可能以比指定的工作程序更少的工作程序執行,甚至根本沒有工作程序。每個索引只能使用一個工作程序。因此,只有當資料表中至少有 2
個索引時,才會啟動平行工作程序。清理的工作程序在每個階段開始之前啟動,並在階段結束時退出。這些行為可能會在未來版本中變更。此選項不能與 FULL
選項一起使用。
SKIP_DATABASE_STATS(跳過資料庫統計資訊)
指定 VACUUM
應跳過更新關於最舊未凍結 XID 的資料庫範圍統計資訊。 通常,VACUUM
將在命令結束時更新這些統計資訊一次。 但是,在具有大量資料表的資料庫中,這可能需要一些時間,並且除非包含最舊未凍結 XID 的資料表位於已清理的資料表之中,否則它將不會完成任何操作。 此外,如果並行發出多個 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
。
布林值
指定是否應開啟或關閉所選選項。您可以撰寫 TRUE
、ON
或 1
來啟用選項,並撰寫 FALSE
、OFF
或 0
來停用選項。也可以省略 boolean
值,在這種情況下,會假設為 TRUE
。
整數
指定傳遞到所選選項的非負整數值。
大小
指定以 kilobytes 為單位的記憶體量。大小也可以指定為一個字串,其中包含數值大小,後接以下任何一個記憶體單位:B
(bytes)、kB
(kilobytes)、MB
(megabytes)、GB
(gigabytes) 或 TB
(terabytes)。
table_name
要 vacuum 的特定表格或實體化檢視表的名稱(可選擇使用 schema 限定)。如果指定的表格是一個分割區表格,則會 vacuum 其所有葉分割區。
column_name
要分析的特定欄位的名稱。預設為所有欄位。如果指定了欄位清單,則還必須指定 ANALYZE
。
當指定了 VERBOSE
時,VACUUM
會發出進度訊息,指出目前正在處理的表格。也會列印關於表格的各種統計資訊。
要 vacuum 一個表格,通常必須擁有該表格的 MAINTAIN
權限。但是,資料庫擁有者可以 vacuum 其資料庫中的所有表格,除了共享目錄。VACUUM
將跳過呼叫使用者沒有權限 vacuum 的任何表格。
在 VACUUM
執行時,search_path 會暫時變更為 pg_catalog, pg_temp
。
VACUUM
無法在交易區塊內執行。
對於具有GIN索引的表格,VACUUM
(以任何形式)也會完成任何擱置中的索引插入,方法是將擱置中的索引條目移動到主要的GIN索引結構中的適當位置。請參閱 Section 64.4.4.1 以取得詳細資訊。
我們建議定期 vacuum 所有資料庫,以移除死資料列。PostgreSQL 包含一個 “autovacuum(自動清理)” 功能,可以自動執行例行 vacuum 維護。有關自動和手動 vacuum 的更多資訊,請參閱 Section 24.1。
不建議將 FULL
選項用於例行用途,但在特殊情況下可能很有用。例如,當您刪除或更新了表格中的大多數資料列,並且希望表格在實體上縮小以佔用更少的磁碟空間並允許更快的表格掃描時。VACUUM FULL
通常會比普通的 VACUUM
更能縮小表格。
PARALLEL
選項僅用於 vacuum 目的。如果此選項與 ANALYZE
選項一起指定,則不會影響 ANALYZE
。
VACUUM
會導致 I/O 流量大幅增加,這可能會導致其他作用中工作階段的效能不佳。因此,有時建議使用基於成本的 vacuum 延遲功能。對於平行 vacuum,每個 worker 會根據該 worker 完成的工作成比例地休眠。請參閱 Section 19.4.4 以取得詳細資訊。
每個執行不含 FULL
選項的 VACUUM
的後端,將會在 pg_stat_progress_vacuum
檢視表中報告其進度。執行 VACUUM FULL
的後端將改為在 pg_stat_progress_cluster
檢視表中報告其進度。請參閱 Section 27.4.5 和 Section 27.4.2 以取得詳細資訊。
要清理單個表格 onek
,為最佳化器分析它,並列印詳細的 vacuum 活動報告
VACUUM (VERBOSE, ANALYZE) onek;
SQL 標準中沒有 VACUUM
語句。
以下語法在 PostgreSQL 9.0 版之前使用,並且仍然支援
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns
[, ...] ]
請注意,在此語法中,選項必須以完全顯示的順序指定。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。