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维护操作的数据库。 参见第 22 章了解更多细节。
FULL选择“完全”清理,它可以回收更多空间,但耗时更长,并且会独占锁定该表。 这种方法还需要额外的磁盘空间,因为它会写出该表的一个新副本,并且在操作完成之前 不会释放旧副本。通常,只有当需要从表内回收大量空间时才应使用这种方法。
FREEZE选择激进地“冻结”元组。
VERBOSE为每个表输出详细的清理活动报告。
ANALYZE更新规划器用来确定查询最高效执行方式的统计信息。
table要清理的特定表的名称(可选地带模式限定)。默认为当前数据库中的所有表。
column要分析的特定列名。默认会分析所有列。
指定VERBOSE时,VACUUM会输出进度消息, 指示当前正在处理哪个表,同时还会打印这些表的各种统计信息。
我们建议经常(至少每晚)清理活跃的生产数据库,以移除过期行。在添加或删除大量行之后,对受影响的表执行VACUUM ANALYZE命令可能是个好主意。这会用所有近期变更的结果更新系统目录,使PostgreSQL查询规划器在规划查询时能够做出更好的选择。
FULL选项不建议在日常场景中使用,但在某些特殊情况下可能很有用。 例如,当你删除了表中的绝大多数行,并希望该表在物理上收缩以占用更少磁盘空间时, 这个选项就比较合适。VACUUM FULL通常会比普通 VACUUM更大幅度地收缩表。
VACUUM会显著增加 I/O 流量,这可能导致其他活动会话性能变差。 因此,有时建议使用基于代价的清理延迟特性。详见第 17.4.4 节。
下面是对回归数据库中的一个表运行 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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。