Skip to content

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_agevacuum_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 设置为 ONVACUUM 将保守地从索引中删除所有死元组。这对于向后兼容 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

指定是否应启用或禁用所选选项。您可以编写 TRUEON1 来启用该选项,以及 FALSEOFF0 来禁用该选项。也可以省略 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语句。

另请参阅

vacuumdb第 20.4.4 节第 25.1.6 节第 28.4.5 节第 28.4.2 节