VACUUM

VACUUM —垃圾收集并有选择地分析数据库

Synopsis

VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE | DISABLE_PAGE_SKIPPING } [, ...] ) ] [ table_name [ (column_name [, ...] ) ] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]

Description

VACUUM回收死 Tuples 占用的存储。在正常的 PostgreSQL 操作中,被更新删除或过时的 Tuples 不会从表中物理删除。它们会一直存在,直到完成VACUUM。因此,有必要定期执行VACUUM,特别是在频繁更新的表上。

VACUUM不带参数,将处理当前用户有权进行清理的当前数据库中的每个表。使用参数,VACUUM仅处理该表。

VACUUM ANALYZE对每个选定的表执行VACUUM,然后执行ANALYZE。这是日常维护脚本的便捷组合形式。有关其处理的更多详细信息,请参见ANALYZE

普通VACUUM(无FULL)只是回收空间并使其可重复使用。该命令的形式可以与表的正常读取和写入并行进行,因为没有获得排他锁。但是,在大多数情况下,多余的空间不会返回给 os。它只是可以在同一张表中重复使用。 VACUUM FULL将表的全部内容重写为一个没有额外空间的新磁盘文件,从而允许将未使用的空间返回给 os。这种形式要慢得多,并且在处理过程中需要在每个表上具有排他锁。

当选项列表用括号括起来时,可以按任何 Sequences 写入选项。不带括号的选项必须严格按照上面显示的 Sequences 指定。括号中的语法是在 PostgreSQL 9.0 中添加的;不带括号的语法已弃用。

Parameters

  • FULL

    • 选择“完全”真空,它可以回收更多空间,但需要更长的时间并专门锁定表。此方法还需要额外的磁盘空间,因为它会写入表的新副本,并且在操作完成之前不会释放旧副本。通常,仅在需要从表中回收大量空间时才应使用此选项。
  • FREEZE

    • 选择 Tuples 的激进“冻结”。指定FREEZE等效于将vacuum_freeze_min_agevacuum_freeze_table_age参数设置为零来执行VACUUM。重写表时始终执行激进冻结,因此在指定FULL时此选项是多余的。
  • VERBOSE

    • 为每个表打印详细的真空活动报告。
  • ANALYZE

    • 更新计划者使用的统计信息,以确定执行查询的最有效方法。
  • DISABLE_PAGE_SKIPPING

    • 通常,VACUUM将基于visibility map跳过页面。可以跳过通常已知所有 Tuples 都已冻结的页面,而可以知道所有 Tuples 对于所有事务可见的页面都可以跳过,除非执行主动清除。此外,除了进行主动清理外,某些页面可能会被跳过,以避免 await 其他会话结束使用它们。此选项禁用所有页面跳过行为,仅可用于可视性 Map 的内容,该选项仅在存在导致数据库损坏的硬件或软件问题时才发生。
  • table_name

    • 要清除的特定表的名称(可选为架构限定)。如果省略,则将清除当前数据库中的所有常规表和实例化视图。如果指定的表是分区表,则其所有叶分区均被清除。
  • column_name

    • 要分析的特定列的名称。默认为所有列。如果指定了列列表,则表示ANALYZE

Outputs

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

Notes

要清理桌子,通常必须是桌子的所有者或超级用户。但是,允许数据库所有者清理其数据库中的所有表(共享目录除外)。 (共享目录的限制意味着 true 的数据库范围的VACUUM只能由超级用户执行.)VACUUM将跳过主叫用户无权清除的任何表。

VACUUM无法在事务块内执行。

对于具有 GIN 索引的表,VACUUM(以任何形式)还可以通过将待处理的索引条目移动到主 GIN 索引结构中的适当位置来完成所有待处理的索引插入。有关详情,请参见Section 64.4.1

我们建议经常(至少每晚)对活动的生产数据库进行清理,以删除死行。添加或删除大量行后,对受影响的表发出VACUUM ANALYZE命令可能是一个好主意。这将使用所有最近更改的结果来更新系统目录,并允许 PostgreSQL 查询计划程序在计划查询时做出更好的选择。

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

VACUUM导致 I/O 流量大量增加,这可能会导致其他活动会话的性能下降。因此,有时建议使用基于成本的真空延迟功能。有关详情,请参见Section 19.4.4

PostgreSQL 包括一个“ autovacuum”工具,可以自动执行日常真空维护。有关自动和手动吸尘的更多信息,请参见Section 24.1

Examples

要清理单个表onek,请对它进行优化分析并打印详细的吸尘度活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

Compatibility

SQL 标准中没有VACUUM语句。

See Also

vacuumdb, Section 19.4.4, Section 24.1.6