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。当发生这种情况时,处理表的所有索引的成本预计将大大超过删除死亡索引元组的好处。此选项可用于强制 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。将此选项设置为 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
的缓冲区访问策略环形缓冲区大小。此大小用于计算将作为此策略一部分重用的共享缓冲区数量。0
禁用 缓冲区访问策略
的使用。如果还指定了 ANALYZE
,则 BUFFER_USAGE_LIMIT
值将用于清理和分析阶段。此选项不能与 FULL
选项一起使用,除非还指定了 ANALYZE
。如果未指定此选项,则 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
要清理的特定表或物化视图的名称(可选的模式限定)。如果指定的表是分区表,则会清理其所有叶子分区。
column_name
要分析的特定列的名称。默认为所有列。如果指定了列列表,则还必须指定 ANALYZE
。
指定 VERBOSE
时,VACUUM
会发出进度消息,以指示当前正在处理哪个表。还会打印有关表的各种统计信息。
要清理表,通常必须具有该表上的 MAINTAIN
权限。但是,数据库所有者可以清理其数据库中的所有表,共享目录除外。VACUUM
将跳过调用用户没有权限清理的任何表。
在 VACUUM
运行时,search_path 将临时更改为 pg_catalog, pg_temp
。
VACUUM
不能在事务块内执行。
对于具有GIN索引,VACUUM
(以任何形式)也会将待处理的索引条目移动到主GIN索引结构中的相应位置,从而完成任何待处理的索引插入。有关详细信息,请参阅第 64.4.4.1 节。
我们建议定期清理所有数据库,以删除死行。PostgreSQL 包括一个 “autovacuum” 工具,可以自动化例行的清理维护。有关自动和手动清理的更多信息,请参阅第 24.1 节。
不建议例行使用 FULL
选项,但在特殊情况下可能会有用。一个示例是,当您已删除或更新表中的大多数行,并且希望该表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。VACUUM FULL
通常会比普通的 VACUUM
缩小更多表。
PARALLEL
选项仅用于清理目的。如果此选项与 ANALYZE
选项一起指定,则不会影响 ANALYZE
。
VACUUM
会导致 I/O 流量大幅增加,这可能会导致其他活动会话的性能下降。因此,有时建议使用基于成本的清理延迟功能。对于并行清理,每个工作进程的休眠时间与该工作进程完成的工作量成正比。有关详细信息,请参阅第 19.4.4 节。
每个在没有 FULL
选项的情况下运行 VACUUM
的后端都会在 pg_stat_progress_vacuum
视图中报告其进度。运行 VACUUM FULL
的后端将在 pg_stat_progress_cluster
视图中报告其进度。有关详细信息,请参阅第 27.4.5 节和 第 27.4.2 节。
要清理单个表 onek
,为优化器分析它并打印详细的清理活动报告
VACUUM (VERBOSE, ANALYZE) onek;
SQL 标准中没有 VACUUM
语句。
以下语法在 PostgreSQL 9.0 版之前使用,并且仍然受支持
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns
[, ...] ]
请注意,在这种语法中,选项必须以所示的顺序准确指定。
如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。