支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

VACUUM

VACUUM — 垃圾回收并可选择分析数据库

概要

VACUUM [ ( option [, ...] ) ] [ 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 锁。

参数

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,即使表中有许多死亡元组。当需要尽可能快地运行 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

指定是否应启用或禁用所选选项。可以写入 TRUEON1 以启用该选项,写入 FALSEOFF0 以禁用该选项。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 [, ...] ]

请注意,在这种语法中,选项必须以所示的顺序准确指定。

提交更正

如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。