有奖捉虫:行业应用 & 管理与支持文档专题 HOT
垃圾收集并根据需要分析一个数据库。

概要

VACUUM [FULL] [FREEZE] [VERBOSE] [table]

VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE
[table [(column [, ...] )]]

描述

VACUUM 收回由死亡元组占用的存储空间。在通常的数据库操作中,被删除或者被更新废弃的元组并没有在物理上从它们的表中移除,它们将一直存在直到一次 VACUUM 被执行。因此有必要周期性地做 VACUUM,特别是在频繁被更新的表上。
在不带任何参数的情况下,VACUUM 会处理当前用户具有清理权限的当前数据库中的每一个表。通过使用一个参数,VACUUM 可以只处理指定表。
VACUUM ANALYZE 对每一个选定的表执行一个 VACUUM 然后执行 ANALYZE。这是两种命令的一种方便的组合形式,可以用于例行的维护脚本。其处理细节可参考 ANALYZE。
VACUUM(不带 FULL)标记在能够获得表上的排他锁时,收回已经删除和废除的数据占用的空间,用于重用。在堆表中,由于没有获取排他锁,因此能够并行读写表。
使用追加优化表,VACUUM 首先通过清理索引来紧缩表,然后依次紧缩每个 Segment 文件,最后清理辅助关系同时更新统计信息。在每个 Segment 上,可见行从当前 Segment 文件复制到一个新的 Segment 文件,然后将当前的 Segment 文件计划为将删除同时将新的 Segment 文件设置为可用。一个追加优化表的简单 VACUUM 允许在 Segment 文件被紧缩时做扫描、插入、删除以及更新操作。不过,将会短暂地取得一个 Access Exclusive 锁以删除当前的 Segment 文件并且激活新的 Segment 文件。
VACUUM FULL 会做更多深入的处理,包括为了尝试把表紧缩成占用最少的磁盘块而在块间移动元组。这种形式会更慢一些并且在每个表被处理时都需要取得其上的 Access Exclusive 锁。Access Exclusive 锁确保持有者是唯一访问该表的事务。
如果指定了 VERBOSE,VACUUM 会发出进度消息来表明当前正在处理哪个表。各种有关这些表的统计信息也会被打印出来。

参数

FULL:选择"完全"清理,它可以收回更多空间,并且需要更长时间和表上的排他锁。
FREEZE:指定 FREEZE 等价于参数 vacuum_freeze_min_age 设置为0的 VACUUM。
VERBOSE:为每个表打印一份详细的清理活动报告。
ANALYZE:更新优化器用以决定最有效执行一个查询的方法的统计信息。
table:要清理的表的名称(可以有模式修饰)。缺省时是当前数据库中的所有表。
column:要分析的指定列的名称。缺省是所有列。

注解

VACUUM 不能再一个事务块中执行。建议经常清理活动的生产数据库(至少每晚一次),以保证移除失效的行。在增加或删除了大量行之后,对受影响的表执行 VACUUM ANALYZE 命令,将把最近的更改更新到系统目录,并且允许数据库查询规划器在规划用户查询时做出更好的选择。
VACUUM 会导致 I/O 流量的大幅度增加,这可能导致其他活动会话性能变差。因此,有时建议使用基于代价的清理延迟特性。
对于堆表,无效行被记录在一个叫做空闲空间映射地方。空闲空间映射必须足够大能够覆盖数据库中所有堆表的无效行。如果空间不足,那些从空闲空间映射溢出的无效行占用的空间将不能被一个 VACUUM 回收。VACUUM 命令略过外部包。VACUUM FULL 回收所有无效行空间,然后它需要获取一个排它锁在它当前处理的每个表上面,这是一个非常昂贵的操作,有可能会耗费很长的时间再那些大的,分布式的数据库的表上。执行 VACUUM FULL 在维护数据库期间。作为一个 VACUUM FULL 的替代方案,用户可以通过使用 CREATE TABLE AS 重新构建表,然后删除旧的表。
将空闲空间映射设置为适当的大小。通过下面的配置参数来配置空闲空间映射:
max_fsm_pages
max_fsm_relations 对于追加优化表,VACUUM 要求有足够的磁盘空间来容纳新的 Segment 文件在 VACUUM 执行过程中。如果在一个 Segment 文件中隐藏行的行数占总行数的比率小于一个阈值(默认值10),那么 Segment 文件不会进行压缩。
阈值可以通过 gp_appendonly_compaction_threshold 来进行配置。VACUUM FULL 忽略阈值同时重写段文件而不考虑比率。可以通过 gp_appendonly_compaction 参数来关闭在追加优化表上 VACUUM 的使用。在追加优化表被清理时如果检测到一个并发的可序列化事务,那么当前和后续的 Segment 文件都不会被紧缩。如果一个 Segment 文件已经被紧缩但是在删除原始 Segment 文件的事务中检测到在一个并发可序列化事务,则会跳过删除。这样在清理完成后,可能会留下一个或两个状态为“awaiting drop”的 Segment 文件。
更多关于数据库并发控制的信息,见“数据库管理员指南”中的“日常系统维护任务”部分。

示例

清理当前数据库下的所有表:
VACUUM;
只清理一张特定的表:
VACUUM mytable;
清理当前数据库下的所有表同时为查询优化器收集统计信息:
VACUUM ANALYZE;

兼容性

在 SQL 标准中没有 VACUUM。

另见

ANALYZE