VACUUM
VACUUM¶
垃圾收集并可选地分析数据库。
- 语法
-
``` sql VACUUM [({ FULL | FREEZE | VERBOSE | ANALYZE } [, …])] [table [(column [, …] )]]
VACUUM [FULL] [FREEZE] [VERBOSE] [table]
VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE [table [(column [, …] )]] ```
- 描述
-
VACUUM
回收已删除的元组占用的存储。 在正常的SeaboxMPP数据库操作中,被更新删除或废弃的元组不会从表中物理删除;它们将保留在磁盘上,直到完成VACUUM
。 因此,有必要定期进行VACUUM
,尤其是在频繁更新的表上。如果没有参数,
VACUUM
将处理当前数据库中的每个表。 使用参数,VACUUM
仅处理该表。VACUUM ANALYZE
对每个选定的表执行VACUUM
,然后执行ANALYZE
。 这是日常维护脚本的便捷组合形式。有关处理的更多详细信息,请参见ANALYZE
。VACUUM
(无FULL
)在表和索引中标记已删除和过时的数据以供将来重用,并且仅当该空间位于表的末尾并且可以轻松获得独占表锁时,才可以回收该空间以供重用。表开始或中间的未使用空间保持不变。 对于堆表,这种形式的命令可以与表的正常读取和写入并行运行,因为不会获得排他锁。但是,在大多数情况下,多余的空间不会返回给操作系统。它只是可以在同一张表中重复使用。VACUUM FULL
将表的全部内容重写为一个没有额外空间的新磁盘文件,从而允许将未使用的空间返回给操作系统。这种形式要慢得多,并且在处理过程中需要在每个表上获得排他锁。使用列存表,
VACUUM
首先清理索引, 然后依次压缩每个段文件,最后清理辅助表并更新统计信息,从而压缩表。在每个段上,将可见行从当前段文件复制到新的段文件,然后计划删除当前段文件,并使新的段文件可用。列存表的普通VACUUM
允许在压缩段文件的同时扫描,插入,删除和更新表。 但是,将使用Access Exclusive锁短暂删除当前段文件并激活新的段文件。VACUUM FULL
进行更广泛的处理,包括在块之间移动元组以尝试将表压缩到最小数量的磁盘块。这种形式要慢得多,并且在处理每个表时都需要申请Access Exclusive锁。 Access Exclusive锁可确保所有者是以任何方式访问表的唯一事务。当选项列表用括号括起来时,可以按任何顺序写入选项。 不带括号的选项必须严格按照上面显示的顺序指定。
当指定了
VERBOSE
时,VACUUM
发出进度消息以指示当前正在处理哪个表。 还将打印有关表格的各种统计信息。新增VACUUM语法,形如
VACUUM BEFORE "时间戳" table_name
或VACUUM BEFORE "时间间隔" table_name
。 当VACUUM指定时间戳时,VACUUM只清理指定时间戳之前的被删除的数据 当VACUUM指定时间间隔时,VACUUM只清理当前时间向前推移指定时间间隔后的删除的数据。 此新功能配合闪回功能进行验证。 - 参数
-
该SQL命令参数说明见下
FULL
- 选择full vacuum,这可以回收更多空间,但是需要更长的时间排他锁定表。此方法还需要额外的磁盘空间,因为它会写入表的新副本,并且在操作完成之前不会释放旧副本。通常,仅在需要从表中回收大量空间时才应使用此选项。
FREEZE
- 指定
FREEZE
等效于将vacuum_freeze_min_age
服务器配置参数设置为零来执行VACUUM
。 VERBOSE
- 为每个表打印详细的vacuum活动报告。
ANALYZE
- 更新优化器使用的统计信息,以确定执行查询的最快方法。
table
- 要vacuum的表的名称(可以用schema修饰)。 默认为当前数据库中的所有表。
column
- 要分析的特定列的名称。 默认为所有列。 如果指定了列列表,则意味着
ANALYZE
。
- 注解
-
VACUUM
无法在事务块内执行。频繁(至少每晚一次)vacuum活跃数据库,以便删除过期的行。 添加或删除大量行后,对受影响的表运行
VACUUM ANALYZE
命令可能会很有用。这将使用所有最近更改的结果来更新系统catalog,并使SeaboxMPP数据库查询优化器可以在计划查询中做出更好的选择。- 重要:SeaboxSQL有一个单独的可选服务器进程,称为autovacuum daemon,其目的是自动执行
VACUUM
和ANALYZE
命令。SeaboxMPP数据库开启autovacuum守护程序仅在SeaboxMPP数据库模板数据库template0
上执行VACUUM
操作。为template0
启用了autovacuum,因为不允许连接到template0
。autovacuum守护程序在template0
上执行VACUUM
操作以管理事务ID(XID),并帮助避免template0
中的事务ID环绕问题。
必须在用户定义的数据库中执行手动
VACUUM
操作,以管理这些数据库中的事务ID(XID)。VACUUM
导致I/O流量大幅增加,这可能会导致其他活动会话的性能下降。 因此,建议在低使用率时vacuum数据库。VACUUM
命令跳过外部表。VACUUM FULL
回收所有过期的行空间, 但是它需要对每个正在处理的表进行独占锁定,这是一项非常昂贵的操作,并且可能需要很长时间才能完成大型分布式SeaboxMPP数据库表。在数据库维护期间执行VACUUM FULL
操作。不建议例行使用
FULL
选项,但在特殊情况下可能有用。例如,当您删除或更新了表中的大多数行,并希望该表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。VACUUM FULL
通常比普通VACUUM
将表缩小更多。作为
VACUUM FULL
的替代方法, 您可以使用CREATE TABLE AS
语句重新创建表并删除旧表。对于列存表,
VACUUM
需要足够的可用磁盘空间以在VACUUM
过程中容纳新的段文件。如果段文件中隐藏行与总行的比率小于阈值(默认为10),则不会压缩段文件。可以使用
scolumn_compaction_threshold
服务器配置参数来配置阈值。VACUUM FULL
忽略阈值并重写段文件,而不考虑比率。可以使用
sc_scolumn_compaction
服务器配置参数为列存表禁用VACUUM
。如果在清理列存表时检测到并发可序列化事务,则不会压缩当前和后续段文件。如果已压缩段文件,但是在删除原始段文件的事务中检测到并发可序列化事务,则将忽略该删除。清理完成后,这可能会使一个或两个段文件处于“等待删除”状态。
- 重要:SeaboxSQL有一个单独的可选服务器进程,称为autovacuum daemon,其目的是自动执行
- 示例
-
要清理单个表
onek
,请对它进行优化分析并打印详细的vacuum活动报告:VACUUM (VERBOSE, ANALYZE) onek;
清理当前数据库中的所有表:
VACUUM;
仅清理特定表:
VACUUM (VERBOSE, ANALYZE) mytable;
清理当前数据库中的所有表并收集查询优化器的统计信息:
VACUUM ANALYZE;
- 兼容性说明
- SQL标准中没有
VACUUM
语句。 - 相关SQL命令
ANALYZE