VACUUM

VACUUM

垃圾收集并可选地分析数据库。

概要

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

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

描述

VACUUM回收已删除的元组占用的存储。 在正常的Greenplum数据库操作中,被更新删除或废弃的元组不会从表中物理删除; 它们将保留在磁盘上,直到完成VACUUM。 因此,有必要定期进行VACUUM,尤其是在频繁更新的表上。

如果没有参数,VACUUM将处理当前数据库中的每个表。 使用参数,VACUUM仅处理该表。

VACUUM ANALYZE对每个选定的表执行VACUUM,然后执行ANALYZE。 这是日常维护脚本的便捷组合形式。 有关处理的更多详细信息,请参见ANALYZE

VACUUM(无FULL)在表和索引中标记已删除和过时的数据以供将来重用, 并且仅当该空间位于表的末尾并且可以轻松获得独占表锁时,才可以回收该空间以供重用。 表开始或中间的未使用空间保持不变。 对于堆表,这种形式的命令可以与表的正常读取和写入并行运行,因为不会获得排他锁。 但是,在大多数情况下,多余的空间不会返回给操作系统。 它只是可以在同一张表中重复使用。 VACUUM FULL将表的全部内容重写为一个没有额外空间的新磁盘文件,从而允许将未使用的空间返回给操作系统。 这种形式要慢得多,并且在处理过程中需要在每个表上获得排他锁。

使用追加优化表,VACUUM首先清理索引, 然后依次压缩每个段文件,最后清理辅助表并更新统计信息,从而压缩表。 在每个段上,将可见行从当前段文件复制到新的段文件,然后计划删除当前段文件,并使新的段文件可用。 追加优化表的普通VACUUM允许在压缩段文件的同时扫描,插入,删除和更新表。 但是,将使用Access Exclusive锁短暂删除当前段文件并激活新的段文件。

VACUUM FULL进行更广泛的处理,包括在块之间移动元组以尝试将表压缩到最小数量的磁盘块。 这种形式要慢得多,并且在处理每个表时都需要申请Access Exclusive锁。 Access Exclusive锁可确保所有者是以任何方式访问表的唯一事务。

当选项列表用括号括起来时,可以按任何顺序写入选项。 不带括号的选项必须严格按照上面显示的顺序指定。 括号中的语法是在Greenplum数据库6.0中添加的;不带括号的语法已弃用。

Important: 有关使用VACUUMVACUUM FULLVACUUM ANALYZE的信息, 请参阅注解
输出

当指定了VERBOSE时,VACUUM发出进度消息以指示当前正在处理哪个表。 还将打印有关表格的各种统计信息。

参数

FULL
选择full vacuum,这可以回收更多空间,但是需要更长的时间排他锁定表。 此方法还需要额外的磁盘空间,因为它会写入表的新副本,并且在操作完成之前不会释放旧副本。 通常,仅在需要从表中回收大量空间时才应使用此选项。
FREEZE
指定FREEZE等效于将vacuum_freeze_min_age服务器配置参数设置为零来执行VACUUM。 请参阅服务器配置参数以获取有关vacuum_freeze_min_age的信息。
VERBOSE
为每个表打印详细的vacuum活动报告。
ANALYZE
更新优化器使用的统计信息,以确定执行查询的最快方法。
table
要vacuum的表的名称(可以用schema修饰)。 默认为当前数据库中的所有表。
column
要分析的特定列的名称。 默认为所有列。 如果指定了列列表,则意味着ANALYZE

注解

VACUUM无法在事务块内执行。

频繁(至少每晚一次)vacuum活跃数据库,以便删除过期的行。 添加或删除大量行后,对受影响的表运行VACUUM ANALYZE命令可能会很有用。 这将使用所有最近更改的结果来更新系统catalog,并使Greenplum数据库查询优化器可以在计划查询中做出更好的选择。

Important: PostgreSQL有一个单独的可选服务器进程,称为autovacuum daemon,其目的是自动执行VACUUMANALYZE命令。 Greenplum数据库开启autovacuum守护程序仅在Greenplum数据库模板数据库template0上执行VACUUM操作。 为template0启用了autovacuum,因为不允许连接到template0。 autovacuum守护程序在template0上执行VACUUM操作以管理事务ID(XID),并帮助避免template0中的事务ID环绕问题。

必须在用户定义的数据库中执行手动VACUUM操作,以管理这些数据库中的事务ID(XID)。

VACUUM导致I/O流量大幅增加,这可能会导致其他活动会话的性能下降。 因此,建议在低使用率时vacuum数据库。

VACUUM命令跳过外部表。

VACUUM FULL回收所有过期的行空间, 但是它需要对每个正在处理的表进行独占锁定,这是一项非常昂贵的操作, 并且可能需要很长时间才能完成大型分布式Greenplum数据库表。 在数据库维护期间执行VACUUM FULL操作。

不建议例行使用FULL选项,但在特殊情况下可能有用。 例如,当您删除或更新了表中的大多数行,并希望该表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。 VACUUM FULL通常比普通VACUUM将表缩小更多。

作为VACUUM FULL的替代方法, 您可以使用CREATE TABLE AS语句重新创建表并删除旧表。

对于附加优化表,VACUUM需要足够的可用磁盘空间以在VACUUM过程中容纳新的段文件。 如果段文件中隐藏行与总行的比率小于阈值(默认为10),则不会压缩段文件。 可以使用gp_appendonly_compaction_threshold服务器配置参数来配置阈值。 VACUUM FULL忽略阈值并重写段文件,而不考虑比率。 可以使用gp_appendonly_compaction服务器配置参数为附加优化表禁用VACUUM。 有关服务器配置参数的信息,请参阅服务器配置参数

如果在清理附加优化表时检测到并发可序列化事务,则不会压缩当前和后续段文件。 如果已压缩段文件,但是在删除原始段文件的事务中检测到并发可序列化事务,则将忽略该删除。 清理完成后,这可能会使一个或两个段文件处于“等待删除”状态。

有关Greenplum数据库中并发控制的更多信息,请参阅Greenplum数据库管理员指南中的“例行系统维护任务”。

示例

要清理单个表onek,请对它进行优化分析并打印详细的vacuum活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

清理当前数据库中的所有表:

VACUUM;

仅清理特定表:

VACUUM (VERBOSE, ANALYZE) mytable;

清理当前数据库中的所有表并收集查询优化器的统计信息:

VACUUM ANALYZE;

兼容性

SQL标准中没有VACUUM语句。

另见

ANALYZE