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

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

上一章 首页 下一章