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选择“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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。