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
[, ...] ]
请注意,在此语法中,选项必须按所示顺序精确指定。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。