VACUUM
更新时间:2026-06-25
VACUUM
垃圾收集并可选地分析数据库。
语法
SQL
1 VACUUM [({ FULL | FREEZE | VERBOSE | ANALYZE } [, ...])] [table [(column [, ...] )]]
2
3 VACUUM [FULL] [FREEZE] [VERBOSE] [table]
4
5 VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE
6 [table [(column [, ...] )]]
7 ```
8
9
10
11## 描述
12
13`VACUUM`回收已删除的元组占用的存储。 在正常的PalopgMPP数据库操作中,被更新删除或废弃的元组不会从表中物理删除;它们将保留在磁盘上,直到完成`VACUUM`。 因此,有必要定期进行`VACUUM`,尤其是在频繁更新的表上。
14
15 如果没有参数,`VACUUM`将处理当前数据库中的每个表。 使用参数,`VACUUM`仅处理该表。
16
17 `VACUUM ANALYZE`对每个选定的表执行`VACUUM`,然后执行`ANALYZE`。 这是日常维护脚本的便捷组合形式。有关处理的更多详细信息,请参见`ANALYZE`。
18
19 `VACUUM`(无`FULL`)在表和索引中标记已删除和过时的数据以供将来重用,并且仅当该空间位于表的末尾并且可以轻松获得独占表锁时,才可以回收该空间以供重用。表开始或中间的未使用空间保持不变。 对于堆表,这种形式的命令可以与表的正常读取和写入并行运行,因为不会获得排他锁。但是,在大多数情况下,多余的空间不会返回给操作系统。它只是可以在同一张表中重复使用。 `VACUUM FULL`将表的全部内容重写为一个没有额外空间的新磁盘文件,从而允许将未使用的空间返回给操作系统。这种形式要慢得多,并且在处理过程中需要在每个表上获得排他锁。
20
21 使用列存表,`VACUUM`首先清理索引, 然后依次压缩每个段文件,最后清理辅助表并更新统计信息,从而压缩表。在每个段上,将可见行从当前段文件复制到新的段文件,然后计划删除当前段文件,并使新的段文件可用。列存表的普通`VACUUM`允许在压缩段文件的同时扫描,插入,删除和更新表。 但是,将使用Access Exclusive锁短暂删除当前段文件并激活新的段文件。
22
23 `VACUUM FULL`进行更广泛的处理,包括在块之间移动元组以尝试将表压缩到最小数量的磁盘块。这种形式要慢得多,并且在处理每个表时都需要申请Access Exclusive锁。 Access Exclusive锁可确保所有者是以任何方式访问表的唯一事务。
24
25 当选项列表用括号括起来时,可以按任何顺序写入选项。 不带括号的选项必须严格按照上面显示的顺序指定。
26
27 当指定了`VERBOSE`时,`VACUUM`发出进度消息以指示当前正在处理哪个表。 还将打印有关表格的各种统计信息。
28
29 新增VACUUM语法,形如`VACUUM BEFORE "时间戳" table_name`或 `VACUUM BEFORE "时间间隔" table_name`。
30 当VACUUM指定时间戳时,VACUUM只清理指定时间戳之前的被删除的数据
31 当VACUUM指定时间间隔时,VACUUM只清理当前时间向前推移指定时间间隔后的删除的数据。
32 此新功能配合闪回功能进行验证。
33
34
35
36
37## 参数
38
39该SQL命令参数说明见下
40
41 `FULL`
42 : 选择full vacuum,这可以回收更多空间,但是需要更长的时间排他锁定表。此方法还需要额外的磁盘空间,因为它会写入表的新副本,并且在操作完成之前不会释放旧副本。通常,仅在需要从表中回收大量空间时才应使用此选项。
43
44 `FREEZE`
45 : 指定`FREEZE`等效于将`vacuum_freeze_min_age`服务器配置参数设置为零来执行`VACUUM`。
46
47 `VERBOSE`
48 : 为每个表打印详细的vacuum活动报告。
49
50 `ANALYZE`
51 : 更新优化器使用的统计信息,以确定执行查询的最快方法。
52
53 `table`
54 : 要vacuum的表的名称(可以用schema修饰)。 默认为当前数据库中的所有表。
55
56 `column`
57 : 要分析的特定列的名称。 默认为所有列。 如果指定了列列表,则意味着`ANALYZE`。
58
59
60
61注解
62: `VACUUM`无法在事务块内执行。
63
64 频繁(至少每晚一次)vacuum活跃数据库,以便删除过期的行。 添加或删除大量行后,对受影响的表运行`VACUUM ANALYZE`命令可能会很有用。这将使用所有最近更改的结果来更新系统catalog,并使PalopgMPP数据库查询优化器可以在计划查询中做出更好的选择。
65
66
67 * 重要:PalopgSQL有一个单独的可选服务器进程,称为*autovacuum daemon*,其目的是自动执行`VACUUM`和`ANALYZE`命令。PalopgMPP数据库开启autovacuum守护程序仅在PalopgMPP数据库模板数据库`template0`上执行`VACUUM`操作。为`template0`启用了autovacuum,因为不允许连接到`template0`。autovacuum守护程序在`template0`上执行`VACUUM`操作以管理事务ID(XID),并帮助避免`template0`中的事务ID环绕问题。
68
69 必须在用户定义的数据库中执行手动`VACUUM`操作,以管理这些数据库中的事务ID(XID)。
70
71
72 `VACUUM`导致I/O流量大幅增加,这可能会导致其他活动会话的性能下降。 因此,建议在低使用率时vacuum数据库。
73
74 `VACUUM`命令跳过外部表。
75
76 `VACUUM FULL`回收所有过期的行空间, 但是它需要对每个正在处理的表进行独占锁定,这是一项非常昂贵的操作,并且可能需要很长时间才能完成大型分布式PalopgMPP数据库表。在数据库维护期间执行`VACUUM FULL`操作。
77
78 不建议例行使用`FULL`选项,但在特殊情况下可能有用。例如,当您删除或更新了表中的大多数行,并希望该表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。`VACUUM FULL`通常比普通`VACUUM`将表缩小更多。
79
80 作为`VACUUM FULL`的替代方法, 您可以使用`CREATE TABLE AS`语句重新创建表并删除旧表。
81
82 对于列存表,`VACUUM`需要足够的可用磁盘空间以在`VACUUM`过程中容纳新的段文件。如果段文件中隐藏行与总行的比率小于阈值(默认为10),则不会压缩段文件。
83
84 可以使用`scolumn_compaction_threshold`服务器配置参数来配置阈值。 `VACUUM FULL`忽略阈值并重写段文件,而不考虑比率。
85
86 可以使用`sc_scolumn_compaction`服务器配置参数为列存表禁用`VACUUM`。
87
88
89 如果在清理列存表时检测到并发可序列化事务,则不会压缩当前和后续段文件。如果已压缩段文件,但是在删除原始段文件的事务中检测到并发可序列化事务,则将忽略该删除。清理完成后,这可能会使一个或两个段文件处于“等待删除”状态。
90
91
92## 示例
93
94要清理单个表`onek`,请对它进行优化分析并打印详细的vacuum活动报告:
95
96 ``` sql
97 VACUUM (VERBOSE, ANALYZE) onek;
98 ```
99
100 清理当前数据库中的所有表:
101
102 ``` sql
103 VACUUM;
104 ```
105
106 仅清理特定表:
107
108 ``` sql
109 VACUUM (VERBOSE, ANALYZE) mytable;
110 ```
111
112 清理当前数据库中的所有表并收集查询优化器的统计信息:
113
114 ``` sql
115 VACUUM ANALYZE;
116 ```
117
118
119
120兼容性说明
121: SQL标准中没有`VACUUM`语句。
122
123
124
125相关SQL命令
126: ` ANALYZE `
评价此篇文章
