9.3 9.4 9.5 9.6 10 11 12 13 14
阿里云PostgreSQL 问题报告 纠错本页面

VACUUM

VACUUM — 垃圾收集并根据需要分析一个数据库

大纲

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

其中option可以是下列之一:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP { AUTO | ON | OFF }
    PROCESS_TOAST [ boolean ]
    TRUNCATE [ boolean ]
    PARALLEL integer

table_and_columns是:

    table_name [ ( column_name [, ...] ) ]

描述

VACUUM收回由死亡元组占用的存储空间。在通常的PostgreSQL操作中,被删除或者被更新废弃的元组并没有在物理上从它们的表中移除,它们将一直存在直到一次VACUUM被执行。因此有必要周期性地做VACUUM,特别是在频繁被更新的表上。

在没有table_and_columns列表的情况下,VACUUM会处理当前用户具有清理权限的当前数据库中的每一个表和物化视图。如果给出一个列表,VACUUM可以只处理列表中的那些表。

VACUUM ANALYZE对每一个选定的表ANALYZE。这是两种命令的一种方便的组合形式,可以用于例行的维护脚本。其处理细节可参考ANALYZE

简单的 VACUUM(不带FULL)简单地收回空间并使其可以被重用。 这种形式的命令可以和表的普通读写操作并行,因为它不会获得一个排他锁。 但是,这种形式中额外的空间并没有被还给操作系统(在大多数情况下),它仅仅被保留在同一个表中以备重用。 它还允许我们利用多个 CPU 来处理索引。 此功能称为parallel vacuum。 要禁用此功能,可以使用PARALLEL选项并将并行工作程序指定为零。 VACUUM FULL将表的整个内容重写到一个新的磁盘文件中,并且不包含额外的空间,这使得没有被使用的空间被还给操作系统。 这种形式的命令更慢并且在其被处理时要求在每个表上保持一个ACCESS EXCLUSIVE 锁。

当选项列表被包围在圆括号中时,选项可以被写成任何顺序。如果没有圆括号,选项必须严格按照上面所展示的顺序指定。有圆括号的语法在PostgreSQL 9.0时被加入,无圆括号的语法则被废弃。

参数

FULL

选择完全清理,它可以收回更多空间,并且需要更长时间和表上的排他锁。这种方法还需要额外的磁盘空间,因为它会创建该表的一个新拷贝,并且在操作完成之前都不会释放旧的拷贝。通常这种方法只用于需要从表中收回数量庞大的空间时。

FREEZE

选择激进的元组冻结。指定FREEZE 等价于参数vacuum_freeze_min_agevacuum_freeze_table_age设置为0的 VACUUM。当表被重写时总是会执行激进的冻结, 因此指定FULL时这个选项是多余的。

VERBOSE

为每个表打印一份详细的清理活动报告。

ANALYZE

更新优化器用以决定最有效执行一个查询的方法的统计信息。

DISABLE_PAGE_SKIPPING

通常,VACUUM将基于可见性映射跳过页面。已知所有元组都被冻结的页面总是会被跳过,而那些所有元组对所有事务都可见的页面则可能会被跳过(除非执行的是激进的清理)。此外,除非在执行激进的清理时,一些页面也可能会被跳过,这样可避免等待其他页面完成对其使用。这个选项禁用所有的跳过页面的行为,其意图是只在可见性映射内容被怀疑时使用,这种情况只有在硬件或者软件问题导致数据库损坏时才会发生。

SKIP_LOCKED

规定VACUUM在开始处理关系时不等待任何冲突锁被释放:如果关系不能立即锁定而不等待,则跳过关系。 请注意即使采用此选项,VACUUM在打开关系的索引时仍可能阻塞。 此外,VACUUM ANALYZE在从分区、继承子表和某些类型的外表获取示例行时,仍然可能阻塞。 还有,虽然VACUUM通常处理指定分区表的所有分区,但如果分区表上的锁冲突, 此选项将导致VACUUM跳过所有分区。

INDEX_CLEANUP

通常,当表中的死亡元组很少时,VACUUM将跳过索引清理。 处理全部表索引的成本预计将大大超过删除死索引元组的好处,当这发生时。 当多于零个死元组时,此选项可用于强制VACUUM处理索引。 默认值是AUTO,这允许VACUUM在适当的时候略过索引清理。 如果INDEX_CLEANUP设置为ONVACUUM将适当地从索引中删除所有死元组。 这对于向后兼容PostgreSQL的早期版本是很有用的,在那里这是标准的行为。

INDEX_CLEANUP也可以设置为OFF来强制VACUUM 总是 略过索引清理,即使表中有许多死元组。 当需要使VACUUM尽可能快地运行,以避免临近的事务ID回卷时,这可能很有用(参见第 25.1.5 节)。 然而,由vacuum_failsafe_age控制的回卷失效保护机制通常会自动触发,以避免事务ID回卷失败,并且将被优先考虑。 如果索引清理不被定期执行,性能可能会变差, 因为当表被修改时,索引会累积死元组,并且表自己也会累积死线指针,这些在索引清理完成之前无法删除。

该选项对没有索引的表无影响,并且如果使用了FULL选项就会被忽略。 它对事务ID回卷失效保护机制也没有影响。 当触发它时会略过索引抽清理,即使INDEX_CLEANUP设置为ON

PROCESS_TOAST

Specifies that VACUUM should attempt to process the corresponding TOAST table for each relation, if one exists. This is usually the desired behavior and is the default. Setting this option to false may be useful when it is only necessary to vacuum the main relation. This option is required when the FULL option is used.

TRUNCATE

指定VACUUM尝试截断表末尾的任何空页,并允许将截断页的磁盘空间返回到操作系统。 这通常是所需的行为,并且是默认行为,除非将vacuum_truncate选项设置为 false,对要被清空的表。 将此选项设置为 false 可能有助于避免ACCESS EXCLUSIVE锁定需要截断的表。如果使用FULL选项,则忽略此选项。

PARALLEL

使用integer后台处理器并行执行VACUUM 的索引真空和索引清理阶段(每个真空阶段的详细信息请参考表 28.39))。 用于执行操作的处理器数量等于关系上支持并行清理的索引数量,该数量受PARALLEL 选项指定的工人数量的限制,如果有的话,该数量还受到max_parallel_maintenance_workers限制。 当且仅当索引的大小大于min_parallel_index_scan_size时,索引才能参与并行清理。 请注意,不保证在执行期间会使用integer中指定的并行工作线程数。 清理运行时可能需要比指定的更少的处理器,甚至根本没有处理器。每个索引只能使用一名处理器。 所以只有当表中至少有2索引时才会启动并行工作程序。 在每个阶段开始之前启动清理工作进程,并在阶段结束时退出。这些行为可能会在未来的版本中发生变化。 此选项不能与FULL选项一起使用。

boolean

指定打开还是关闭所选选项。你可以写入TRUEON1以启用该选项,以及FALSEOFF0来禁用它。 在TRUE被假定的情况下,boolean 值也可以被省略。

integer

指定传递给所选选项的非负整数值。

table_name

要清理的表或物化视图的名称(可以有模式修饰)。如果指定的表示一个分区表,则它所有的叶子分区也会被清理。

column_name

要分析的指定列的名称。缺省是所有列。如果指定了一个列的列表,则ANALYZE也必须被指定。

输出

如果声明了VERBOSEVACUUM会发出进度消息来表明当前正在处理哪个表。各种有关这些表的统计信息也会打印出来。

注意

要清理一个表,操作者通常必须是表的拥有者或者超级用户。但是,数据库拥有者被允许清理他们的数据库中除了共享目录之外的所有表(对于共享目录的限制意味着一个真正的数据库范围的VACUUM只能被超级用户执行)。VACUUM将会跳过执行者不具备清理权限的表。

VACUUM不能在一个事务块内被执行。

对具有GIN索引的表,VACUUM(任何形式)也会通过将待处理索引项移动到主要GIN索引结构中的合适位置来完成任何待处理的索引插入。详见第 67.4.1 节

我们建议经常清理活动的生产数据库(至少每晚一次),以保证移除失效的行。在增加或删除了大量行之后, 对受影响的表执行VACUUM ANALYZE命令是一个很好的做法。这样做将把最近的更改更新到系统目录,并且允许 PostgreSQL查询规划器在规划用户查询时做出更好的选择。

日常使用时,不推荐FULL选项,但在特殊情况时它会有用。一个例子是当你删除或者更新了一个表中的绝大部分行时,如果你希望在物理上收缩表以减少磁盘空间占用并且允许更快的表扫描,则该选项是比较合适的。VACUUM FULL通常会比简单VACUUM更多地收缩表。

PARALLEL选项仅用于清理目的。如果此选项与ANALYZE选项一起指定,则不会影响ANALYZE

VACUUM会导致I/O流量的大幅度增加,这可能导致其他活动会话性能变差。因此,有时建议使用基于代价的清理延迟特性。 对于并行清理,每个处理器的睡眠与该处理器完成的工作成比例。详情请参阅第 20.4.4 节

PostgreSQL包括了一个autovacuum工具,它可以自动进行例行的清理维护。关于自动和手动清理的更多信息请见第 25.1 节

每个后端运行没有FULL选项的VACUUM时,将在pg_stat_progress_vacuum视图中报告它的进度。 运行VACUUM FULL的后端将改为在pg_stat_progress_cluster视图中报告它的进度。 详见第 28.4.3 节第 28.4.4 节

例子

清理单一表onek,为优化器分析它并且打印出详细的清理活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

兼容性

在SQL标准中没有VACUUM语句。

参见

vacuumdb, 第 20.4.4 节, 第 25.1.6 节, 第 28.4.3 节, 第 28.4.4 节