VACUUM — 垃圾回收并选择性地分析数据库
VACUUM [ (option[, ...] ) ] [table_and_columns[, ...] ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [table_and_columns[, ...] ] whereoptioncan be one of: FULL [boolean] FREEZE [boolean] VERBOSE [boolean] ANALYZE [boolean] DISABLE_PAGE_SKIPPING [boolean] SKIP_LOCKED [boolean] INDEX_CLEANUP { AUTO | ON | OFF } PROCESS_MAIN [boolean] PROCESS_TOAST [boolean] TRUNCATE [boolean] PARALLELintegerSKIP_DATABASE_STATS [boolean] ONLY_DATABASE_STATS [boolean] BUFFER_USAGE_LIMITsizeandtable_and_columnsis:table_name[ (column_name[, ...] ) ]
VACUUM 回收死元组占用的存储空间。在正常的 PostgreSQL 操作中,通过更新删除或过时的元组不会从其表中物理删除;它们会一直存在,直到执行 VACUUM。因此,有必要定期执行 VACUUM,尤其是在经常更新的表上。
如果没有 table_and_columns 列表,VACUUM 将处理当前用户有权对其进行 vacuum 操作的当前数据库中的每个表和物化视图。如果提供了列表,VACUUM 将只处理那些表。
VACUUM ANALYZE 执行 VACUUM,然后为每个选定的表执行 ANALYZE。这是一种方便的组合形式,可用于例行维护脚本。有关其处理的更多详细信息,请参见 ANALYZE。
普通 VACUUM(不带 FULL)只是回收空间并使其可供重新使用。此命令形式可以与表的正常读写并行操作,因为不会获取排他锁。但是,在大多数情况下,不会将额外空间返回给操作系统;它只是保持可用状态以在同一表中重新使用。它还允许我们利用多个 CPU 来处理索引。此功能称为并行 vacuum。要禁用此功能,可以使用 PARALLEL 选项并将并行工作进程指定为零。 VACUUM FULL 将表的整个内容重写到一个没有额外空间的新磁盘文件中,从而允许将未使用的空间返回给操作系统。此形式要慢得多,并且在处理每个表时需要一个 ACCESS EXCLUSIVE 锁。
当选项列表被括号包围时,可以按任何顺序编写选项。如果没有括号,则必须按上面显示的顺序指定选项。括号语法在 PostgreSQL 9.0 中添加;不带括号的语法已弃用。
FULL选择“full” vacuum,它可以回收更多空间,但需要更长时间并独占锁定表。此方法还需要额外的磁盘空间,因为它会写入表的副本,并且在操作完成之前不会释放旧副本。通常,这仅应在需要从表中回收大量空间时使用。
FREEZE选择元组的激进““冻结””。指定 FREEZE 等同于执行 VACUUM,其中 vacuum_freeze_min_age 和 vacuum_freeze_table_age 参数设置为零。重写表时始终执行激进冻结,因此当指定 FULL 时,此选项是多余的。
VERBOSE为每个表打印详细的 vacuum 活动报告。
ANALYZE更新规划器用于确定执行查询的最有效方式的统计信息。
DISABLE_PAGE_SKIPPING通常,VACUUM 将根据 可见性映射 跳过页面。已知所有元组都已冻结的页面始终可以跳过,而已知所有元组对所有事务都可见的页面可以在不执行激进 vacuum 的情况下跳过。此外,除了在执行激进 vacuum 时,还可以跳过某些页面,以避免等待其他会话完成对它们的使用的操作。此选项禁用所有页面跳过行为,并且仅在可见性映射的内容可疑时使用,这仅在导致数据库损坏的硬件或软件问题时才会发生。
SKIP_LOCKED指定 VACUUM 在开始对关系进行操作时不应等待释放任何冲突锁:如果无法立即锁定关系而不等待,则跳过该关系。请注意,即使使用此选项,VACUUM 在打开关系的索引时仍可能阻塞。此外,VACUUM ANALYZE 在从分区、表继承子项和某些类型的外部表获取样本行时仍可能阻塞。此外,虽然 VACUUM 通常处理指定分区表的全部分区,但如果分区表存在冲突锁,此选项将导致 VACUUM 跳过所有分区。
INDEX_CLEANUP通常,当表中死元组非常少时,VACUUM 将跳过索引 vacuum。当发生这种情况时,处理表的所有索引的成本预计将大大超过删除死索引元组的好处。此选项可用于强制 VACUUM 在存在多于零个死元组时处理索引。默认值为 AUTO,它允许 VACUUM 在适当的时候跳过索引 vacuum。如果 INDEX_CLEANUP 设置为 ON,VACUUM 将保守地从索引中删除所有死元组。这对于向后兼容 PostgreSQL 的早期版本可能很有用,在这些版本中这是标准行为。
INDEX_CLEANUP 还可以设置为 OFF,以强制 VACUUM 始终跳过索引清理,即使表中有许多死元组。当需要让 VACUUM 尽可能快地运行以避免即将发生的交易 ID 环绕(请参阅 第 25.1.5 节)时,这可能很有用。但是,由 vacuum_failsafe_age 控制的环绕故障安全机制通常会自动触发以避免交易 ID 环绕故障,并且应该是首选。如果不定期执行索引清理,性能可能会受到影响,因为随着表的修改,索引将累积死元组,而表本身将累积死行指针,在完成索引清理之前无法删除这些指针。
对于没有索引的表,此选项不起作用,并且如果使用 FULL 选项,则会忽略此选项。它对交易 ID 环绕故障安全机制也没有影响。触发时,即使将 INDEX_CLEANUP 设置为 ON,它也会跳过索引清理。
PROCESS_MAIN指定 VACUUM 应尝试处理主关系。这通常是所需的行为,也是默认行为。当只需要清理关系的相应 TOAST 表时,将此选项设置为 false 可能很有用。
PROCESS_TOAST指定 VACUUM 应尝试为每个关系(如果存在)处理相应的 TOAST 表。这通常是所需的行为,也是默认行为。当只需要清理主关系时,将此选项设置为 false 可能很有用。使用 FULL 选项时需要此选项。
TRUNCATE指定 VACUUM 应尝试截断表末尾的任何空页面,并允许将截断页面的磁盘空间返回给操作系统。这通常是所需的行为,并且是默认行为,除非已将 vacuum_truncate 选项设置为 false 以清理要清理的表。将此选项设置为 false 可能有助于避免截断所需的表上的 ACCESS EXCLUSIVE 锁。如果使用 FULL 选项,则会忽略此选项。
PARALLEL使用 integer 个后台工作进程并行执行 VACUUM 的索引清理和索引清理阶段(有关每个清理阶段的详细信息,请参阅 表 28.45)。用于执行操作的工作进程数等于支持并行清理的关系上的索引数,该数受使用 PARALLEL 选项指定的(如果有)工作进程数限制,而该数又受 max_parallel_maintenance_workers 限制。当且仅当索引大小大于 min_parallel_index_scan_size 时,索引才能参与并行清理。请注意,不能保证在执行期间使用 integer 中指定的并行工作进程数。清理可能会使用少于指定的工作进程运行,甚至根本不使用工作进程。每个索引只能使用一个工作进程。因此,只有当表中至少有 2 个索引时,才会启动并行工作进程。清理工作进程在每个阶段开始之前启动,并在阶段结束时退出。这些行为可能会在未来版本中发生更改。此选项不能与 FULL 选项一起使用。
SKIP_DATABASE_STATS指定 VACUUM 应跳过更新有关最旧未冻结 XID 的数据库范围统计信息。通常,VACUUM 会在命令结束时更新这些统计信息一次。但是,在表非常多的数据库中,这可能需要一段时间,而且除非包含最旧未冻结 XID 的表在被清理的表中,否则这不会有任何效果。此外,如果并行发出多个 VACUUM 命令,则一次只能有一个命令更新数据库范围统计信息。因此,如果应用程序打算发出许多 VACUUM 命令,则可以将此选项设置在除最后一个命令之外的所有命令中;或者在所有命令中设置此选项,然后单独发出 VACUUM (ONLY_DATABASE_STATS)。
ONLY_DATABASE_STATS指定 VACUUM 除了更新关于最旧未冻结 XID 的数据库范围统计信息之外不执行任何操作。如果指定此选项,则 table_and_columns 列表必须为空,并且除了 VERBOSE 之外,不得启用任何其他选项。
BUFFER_USAGE_LIMIT指定 VACUUM 的 缓冲区访问策略 环形缓冲区大小。此大小用于计算作为此策略一部分将被重用的共享缓冲区的数量。 0 禁用使用 Buffer Access Strategy。如果还指定了 ANALYZE,则 BUFFER_USAGE_LIMIT 值将用于 vacuum 和分析阶段。此选项不能与 FULL 选项一起使用,除非还指定了 ANALYZE。如果未指定此选项,则 VACUUM 将使用 vacuum_buffer_usage_limit 中的值。较高的设置可以使 VACUUM 运行得更快,但设置过大可能会导致从共享缓冲区中驱逐太多其他有用的页面。最小值为 128 kB,最大值为 16 GB。
boolean指定是否应启用或禁用所选选项。您可以编写 TRUE、ON 或 1 来启用该选项,以及 FALSE、OFF 或 0 来禁用该选项。也可以省略 boolean 值,在这种情况下将假定为 TRUE。
integer指定传递给所选选项的非负整数值。
size指定以千字节为单位的内存量。大小也可以指定为一个字符串,其中包含数值大小,后跟以下任何一个内存单位:B(字节)、kB(千字节)、MB(兆字节)、GB(千兆字节)或 TB(太字节)。
table_name要 vacuum 的特定表或物化视图的名称(可选模式限定)。如果指定表是分区表,则其所有叶分区都将被 vacuum。
column_name要分析的特定列的名称。默认为所有列。如果指定了列列表,则还必须指定 ANALYZE。
当指定 VERBOSE 时,VACUUM 会发出进度消息以指示当前正在处理哪个表。还会打印有关表的各种统计信息。
要对表进行真空操作,通常必须是表的拥有者或超级用户。但是,数据库所有者被允许对数据库中的所有表(共享目录除外)进行真空操作。(共享目录的限制意味着只有超级用户才能执行真正的数据库范围的 VACUUM 操作。) VACUUM 将跳过调用用户无权对其进行真空操作的任何表。
VACUUM 无法在事务块内执行。
对于具有 GIN 索引的表, VACUUM(任何形式)还会完成任何待定的索引插入,方法是将待定的索引条目移动到主 GIN 索引结构中的适当位置。有关详细信息,请参见 第 70.4.1 节。
我们建议定期对所有数据库进行真空操作,以删除死行。PostgreSQL 包含一个 “autovacuum” 工具,可以自动执行例行真空维护。有关自动和手动真空操作的详细信息,请参见 第 25.1 节。
不建议将 FULL 选项用于例行操作,但在特殊情况下可能很有用。例如,当您已删除或更新表中的大多数行,并希望表物理收缩以占用更少的磁盘空间并允许更快的表扫描时。 VACUUM FULL 通常会比普通 VACUUM 更多地收缩表。
PARALLEL 选项仅用于真空操作。如果将此选项与 ANALYZE 选项一起指定,则它不会影响 ANALYZE。
VACUUM 会导致 I/O 流量大幅增加,这可能会导致其他活动会话的性能不佳。因此,有时建议使用基于成本的真空延迟功能。对于并行真空,每个工作进程都会根据该工作进程所做的工作成比例地休眠。有关详细信息,请参见 第 20.4.4 节。
每个运行 VACUUM(不带 FULL 选项)的后端都会在 pg_stat_progress_vacuum 视图中报告其进度。运行 VACUUM FULL 的后端将改为在 pg_stat_progress_cluster 视图中报告其进度。有关详细信息,请参见 第 28.4.5 节 和 第 28.4.2 节。
要清理单个表 onek,为优化器分析它并打印详细的真空活动报告
VACUUM (VERBOSE, ANALYZE) onek;
SQL 标准中没有 VACUUM 语句。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。