Postgresql 中文操作指南

VACUUM

VACUUM — 垃圾回收和(或)分析数据库

Synopsis

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 [, ...] ) ]

Description

VACUUM 回收死元组占用的存储空间。在普通的 PostgreSQL 操作中,被更新删除或废弃的元组并未从其表中物理移除;它们会一直保留,直到 VACUUM 完成。因此,有必要定期执行 VACUUM ,尤其是在频繁更新的表上。

如果没有 table_and_columns 列表, VACUUM 会处理当前用户有权执行 vacuum 的当前数据库中的每张表和物化视图。使用列表后, VACUUM 只会处理这些表。

VACUUM ANALYZE 为每张选中的表执行 VACUUM ,然后执行 ANALYZE 。这是一种很方便的组合形式,用于例行维护脚本。请参阅 ANALYZE 了解有关其处理的更多详情。

VACUUM (没有 FULL )只是回收空间,并使其可重复可用。这种形式的命令可以与表的正常读写操作并行进行,不会获取独占锁。但是,在大多数情况下,额外空间并不会返回给操作系统;它将被保留在同一表中以供重复利用。它还允许我们利用多个 CPU 来处理索引。此功能称为 parallel vacuum 。要禁用此功能,可以使用 PARALLEL 选项,并将并行工作进程指定为零。 VACUUM FULL 将表的整个内容重写到一个无额外空间的新磁盘文件中,从而可以将未使用的空间返回给操作系统。这种形式的速度要慢得多,且需要在每个表正在处理时在其上获取 ACCESS EXCLUSIVE 锁。

当选项列表被括号括住时,可以按任意顺序编写选项。如果没有括号,那么必须按照上述确切顺序指定选项。括号语法在 PostgreSQL 9.0 中添加;不带括号的语法已弃用。

Parameters

  • FULL

    • 选择“完全”vacuum,可以回收更多空间,但会花费更长时间,并且会独占锁表。此方法还要求额外的磁盘空间,因为它会写入表的副本,并且在操作完成之前不会释放旧副本。通常仅当需要从表内回收大量空间时才应使用此方法。

  • FREEZE

    • 选择元组的主动“冻结”。指定 FREEZE 等于执行 VACUUM ,其中 vacuum_freeze_min_agevacuum_freeze_table_age 参数均设置为零。在重写表时始终执行主动冻结,因此在指定 FULL 时,此选项是冗余的。

  • VERBOSE

    • 打印每张表的详细真空活动报告。

  • ANALYZE

    • 更新规划程序通过它确定执行查询的最有效方式所使用的统计信息。

  • DISABLE_PAGE_SKIPPING

    • 通常, VACUUM 会根据 visibility map 跳过页面。当已知所有元组都冻结的页面始终可以被跳过,而当已知所有元组都对所有事务可见的页面可能会被跳过(在执行主动 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 always 跳过索引 vacuum,即使表中有很多死元组。当有必要让 VACUUM 尽可能快地运行以避免迫在眉睫的事务 ID 换行时,这可能很有用(参见 Section 25.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 的表,否则这通常是所需的行为并且是默认行为。将此选项设置为 false 可能会很有用,以避免 ACCESS EXCLUSIVE 锁住截断所需的表。如果使用 FULL 选项,此选项会被忽略。

  • PARALLEL

    • 使用 integer 后台工作进程并行执行 VACUUM 的索引 vacuum 和索引清理阶段(有关每个 vacuum 阶段的详细信息,请参阅 Table 28.45 )。用于执行操作的工作进程数量等于支持并行 vacuum 的关系上的索引数量,该数量受 PARALLEL 选项指定的(如有)工作进程数量限制,而 PARALLEL 选项又受 max_parallel_maintenance_workers 进一步限制。当且仅当索引的大小大于 min_parallel_index_scan_size 时,索引才能参与并行 vacuum。请注意,无法保证执行期间将使用 integer 中指定数量的并行工作进程。可以运行比指定数量更少的工作进程,甚至没有工作进程的 vacuum。每个索引只能使用一个工作进程。因此,仅当表中有至少 2 个索引时才启动并行工作进程。vacuum 的工作进程在每个阶段开始之前启动,并在阶段结束时退出。此行为可能会在将来的版本中发生更改。此选项不能与 FULL 选项一起使用。

  • SKIP_DATABASE_STATS

    • 指定 VACUUM 应跳过更新关于最旧的未冻结 XID 的数据库范围统计信息。通常, VACUUM 会在命令结束时更新一次这些统计信息。但是,在具有大量表的数据库中,这可能需要一段时间,并且如果被 vacuum 的表中有最旧的未冻结 XID,否则不会完成任何操作。此外,如果并行发出多个 VACUUM 命令,那么每次只能有一个命令更新数据库范围统计信息。因此,如果应用程序打算发出一系列多个 VACUUM 命令,那么可以设置此选项(所有此类命令中的最后一个除外);或在所有命令中设置它,然后再单独发出 VACUUM (ONLY_DATABASE_STATS)

  • ONLY_DATABASE_STATS

    • 指定 VACUUM 仅更新关于最旧未冻结 XID 的数据库级统计信息,不做任何其他操作。当指定此选项时, table_and_columns 列表必须为空,且只能启用 VERBOSE ,而不能启用其他选项。

  • BUFFER_USAGE_LIMIT

    • 指定 VACUUM 的 [role="bare"]glossary.html#GLOSSARY-BUFFER-ACCESS-STRATEGY Buffer Access Strategy 环形缓冲区大小。此大小用于计算此策略将重用的共享缓冲区数。 0 禁用 Buffer Access Strategy 的使用。如果还指定了 ANALYZEBUFFER_USAGE_LIMIT 值将用于 vacuum 和 analyze 阶段。在未指定 ANALYZE 的情况下,此选项不能与 FULL 选项同时使用。当未指定此选项时, 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

Outputs

当指定 VERBOSE 时, VACUUM 将发出进度消息以指示当前正在处理哪个表。还会打印有关表的各种统计信息。

Notes

通常,要 vacuum 一个表,用户必须是该表的拥有者或超级用户。但是,允许数据库所有者 vacuum 其数据库中的所有表,共享目录除外。(共享目录的限制表示,真正的数据库级 VACUUM 只可由超级用户执行。) VACUUM 将跳过调用用户没有权限真空的任何表。

VACUUM 无法在事务块内执行。

对于具有 GIN 索引的表,任何形式的 VACUUM 也会通过将待决的索引条目移到 GIN 主索引结构的适当位置,来完成所有待决的索引插入。请参阅 Section 70.4.1 了解更多详情。

我们建议定期 vacuum 所有数据库以删除死行。PostgreSQL 包括一项“自动 vacuum”功能,可以自动执行例程 vacuum 维护。有关自动 vacuum 和手动 vacuum 的更多信息,请参阅 Section 25.1

不建议常规使用 FULL 选项,但在特殊情况下可能有用。一个示例是已删除或更新表中的大部分行,并希望表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描。 VACUUM FULL 通常会使表比普通 VACUUM 缩小更多。

PARALLEL 选项仅用于 vacuum 用途。如果将此选项与 ANALYZE 选项一起指定,则它不会影响 ANALYZE

VACUUM 会大幅增加 I/O 流量,这可能会导致其他活动会话的性能不佳。因此,有时建议使用基于成本的真空延迟功能。对于并行 vacuum,每个工作进程都将按该工作进程完成的工作成比例地休眠。请参阅 Section 20.4.4 了解更多详情。

在没有 FULL 选项的情况下运行 VACUUM 的每个后端都会在 pg_stat_progress_vacuum 视图中报告其进度。在 VACUUM FULL 下运行的后端会改为在 pg_stat_progress_cluster 视图中报告其进度。请参阅 Section 28.4.5Section 28.4.2 了解更多详情。

Examples

要清理单个表 onek ,为其分析优化器并打印详细的 vacuum 活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

Compatibility

SQL 标准中没有 VACUUM 语句。