VACUUM
VACUUM — 垃圾回收并选择性地分析数据库
语法
VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ 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:
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
锁。
当选项列表被括号包围时,可以按任何顺序编写选项。如果没有括号,则必须按上面显示的顺序指定选项。括号语法在PostgreSQL9.0 中添加;不带括号的语法已弃用。
参数
FULL
选择“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
尽可能快地运行以避免即将发生的交易 ID 环绕(请参阅 第 25.1.5 节)时,这可能很有用。但是,由 vacuum_failsafe_age 控制的环绕故障安全机制通常会自动触发以避免交易 ID 环绕故障,并且应该是首选。如果不定期执行索引清理,性能可能会受到影响,因为随着表的修改,索引将累积死元组,而表本身将累积死行指针,在完成索引清理之前无法删除这些指针。对于没有索引的表,此选项不起作用,并且如果使用
FULL
选项,则会忽略此选项。它对交易 ID 环绕故障安全机制也没有影响。触发时,即使将INDEX_CLEANUP
设置为ON
,它也会跳过索引清理。PROCESS_MAIN
指定
VACUUM
应尝试处理主关系。这通常是所需的行为,也是默认行为。当只需要清理关系的相应TOAST
表时,将此选项设置为 false 可能很有用。PROCESS_TOAST
指定
VACUUM
应尝试为每个关系(如果存在)处理相应的TOAST
表。这通常是所需的行为,也是默认行为。当只需要清理主关系时,将此选项设置为 false 可能很有用。使用FULL
选项时需要此选项。TRUNCATE
指定
VACUUM
应尝试截断表末尾的任何空页面,并允许将截断页面的磁盘空间返回给操作系统。这通常是所需的行为,并且是默认行为,除非已将vacuum_truncate
选项设置为 false 以清理要清理的表。将此选项设置为 false 可能有助于避免截断所需的表上的ACCESS EXCLUSIVE
锁。如果使用FULL
选项,则会忽略此选项。PARALLEL
使用
integer
个后台工作进程并行执行VACUUM
的索引清理和索引清理阶段(有关每个清理阶段的详细信息,请参阅 表 28.45)。用于执行操作的工作进程数等于支持并行清理的关系上的索引数,该数受使用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
禁用使用Buffer Access Strategy
。如果还指定了ANALYZE
,则BUFFER_USAGE_LIMIT
值将用于 vacuum 和分析阶段。此选项不能与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
要 vacuum 的特定表或物化视图的名称(可选模式限定)。如果指定表是分区表,则其所有叶分区都将被 vacuum。
column_name
要分析的特定列的名称。默认为所有列。如果指定了列列表,则还必须指定
ANALYZE
。
输出
当指定VERBOSE
时,VACUUM
会发出进度消息以指示当前正在处理哪个表。还会打印有关表的各种统计信息。
备注
要对表进行真空操作,通常必须是表的拥有者或超级用户。但是,数据库所有者被允许对数据库中的所有表(共享目录除外)进行真空操作。(共享目录的限制意味着只有超级用户才能执行真正的数据库范围的VACUUM
操作。)VACUUM
将跳过调用用户无权对其进行真空操作的任何表。
VACUUM
无法在事务块内执行。
对于具有GIN索引的表,VACUUM
(任何形式)还会完成任何待定的索引插入,方法是将待定的索引条目移动到主GIN索引结构中的适当位置。有关详细信息,请参见第 70.4.1 节。
我们建议定期对所有数据库进行真空操作,以删除死行。PostgreSQL包含一个“autovacuum”工具,可以自动执行例行真空维护。有关自动和手动真空操作的详细信息,请参见第 25.1 节。
不建议将FULL
选项用于例行操作,但在特殊情况下可能很有用。例如,当您已删除或更新表中的大多数行,并希望表物理收缩以占用更少的磁盘空间并允许更快的表扫描时。VACUUM FULL
通常会比普通VACUUM
更多地收缩表。
PARALLEL
选项仅用于真空操作。如果将此选项与ANALYZE
选项一起指定,则它不会影响ANALYZE
。
VACUUM
会导致 I/O 流量大幅增加,这可能会导致其他活动会话的性能不佳。因此,有时建议使用基于成本的真空延迟功能。对于并行真空,每个工作进程都会根据该工作进程所做的工作成比例地休眠。有关详细信息,请参见第 20.4.4 节。
每个运行VACUUM
(不带FULL
选项)的后端都会在pg_stat_progress_vacuum
视图中报告其进度。运行VACUUM FULL
的后端将改为在pg_stat_progress_cluster
视图中报告其进度。有关详细信息,请参见第 28.4.5 节和第 28.4.2 节。
示例
要清理单个表onek
,为优化器分析它并打印详细的真空活动报告
VACUUM (VERBOSE, ANALYZE) onek;
兼容性
SQL 标准中没有VACUUM
语句。