pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
VACUUM — 垃圾收集并按需分析数据库
VACUUM [ FULL | FREEZE ] [ VERBOSE ] [table] VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [table[ (column[, ...] ) ] ]
VACUUM回收死元组占用的存储空间。在正常的 PostgreSQL运行中,被删除或因更新而过时的元组 并不会从其表中物理移除;它们会一直保留,直到执行 VACUUM。因此有必要定期执行 VACUUM,尤其是对频繁更新的表。
不带参数时,VACUUM会处理当前数据库中当前用户有权清理的每个表。带参数时,VACUUM则只处理该表。
VACUUM ANALYZE会对每个选定表先执行 VACUUM,再执行ANALYZE。 这种便捷的组合形式很适合例行维护脚本使用。关于其处理细节,参见 ANALYZE。
普通的VACUUM(不带FULL)只是回收空间并使其可被重用。 这种形式的命令可以与表的正常读写并行运行,因为它不会获得独占锁。VACUUM FULL会做更彻底的处理,包括跨块移动元组,以尽量把表压缩到最少数量的磁盘块。 这种形式要慢得多,并且在处理每个表时都需要独占锁。
FREEZE是一种特殊用途的选项,它使元组一有可能就被标记为“冻结”, 而不是等到它们相当旧时才冻结。如果在同一数据库中没有其他打开的事务时执行这一操作, 就能保证数据库中的所有元组都已被“冻结”,无论数据库多久不清理,都不会出现事务 ID 回卷问题。 不建议在日常使用中采用FREEZE。它唯一预期的用途是在准备用户定义模板数据库, 或者其他完全只读、不会接受例行的VACUUM维护操作的数据库时使用。 详情见第 21 章。
FULL选择“完全”清理,它可以回收更多空间,但耗时更长,并且会独占锁定该表。 这种方法还需要额外的磁盘空间,因为它会写出该表的一个新副本,并且在操作完成之前 不会释放旧副本。通常,只有当需要从表内回收大量空间时才应使用这种方法。
FREEZE选择激进地“冻结”元组。
VERBOSE为每个表输出详细的清理活动报告。
ANALYZE更新规划器用来确定查询最高效执行方式的统计信息。
table要清理的特定表的名称(可选地带模式限定)。默认为当前数据库中的所有表。
column要分析的特定列名。默认会分析所有列。
指定VERBOSE时,VACUUM会输出进度消息, 指示当前正在处理哪个表,同时还会打印这些表的各种统计信息。
我们建议对活跃的生产数据库频繁执行清理(至少每晚一次),以移除死行。在添加或删除大量行之后,对受影响的表执行VACUUM ANALYZE命令可能是个好主意。这会用所有近期变更的结果更新系统目录,使PostgreSQL查询规划器在规划查询时能够做出更好的选择。
FULL选项不建议日常使用, 但在某些特殊情况下可能有用。例如,当你删除了表中的大部分行,并希望该表在物理上收缩以占用更少磁盘空间时。VACUUM FULL通常会比普通 VACUUM更大幅度地收缩表。
下面是对回归数据库中的一个表运行 VACUUM 的例子:
regression=# VACUUM (VERBOSE, ANALYZE) onek; INFO: vacuuming "public.onek" INFO: index "onek_unique1" now contains 1000 tuples in 14 pages DETAIL: 3000 index tuples were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.01s/0.08u sec elapsed 0.18 sec. INFO: index "onek_unique2" now contains 1000 tuples in 16 pages DETAIL: 3000 index tuples were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.07u sec elapsed 0.23 sec. INFO: index "onek_hundred" now contains 1000 tuples in 13 pages DETAIL: 3000 index tuples were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.01s/0.08u sec elapsed 0.17 sec. INFO: index "onek_stringu1" now contains 1000 tuples in 48 pages DETAIL: 3000 index tuples were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.01s/0.09u sec elapsed 0.59 sec. INFO: "onek": removed 3000 tuples in 108 pages DETAIL: CPU 0.01s/0.06u sec elapsed 0.07 sec. INFO: "onek": found 3000 removable, 1000 nonremovable tuples in 143 pages DETAIL: 0 dead tuples cannot be removed yet. There were 0 unused item pointers. 0 pages are entirely empty. CPU 0.07s/0.39u sec elapsed 1.56 sec. INFO: analyzing "public.onek" INFO: "onek": 36 pages, 1000 rows sampled, 1000 estimated total rows VACUUM
在SQL标准中没有VACUUM语句。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。