# 真空

VACUUM — 垃圾收集和可选分析数据库

# 概要

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

where option can be one of:

    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

and table_and_columns is:

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

# 描述

真空回收死元组占用的存储空间。在正常的 PostgreSQL 操作中,被更新删除或废弃的元组不会从它们的表中物理删除;他们一直在场,直到真空已经完成了。因此有必要做真空定期,尤其是在频繁更新的表上。

没有*表和列*列表,真空处理当前数据库中当前用户有权清理的每个表和物化视图。带着清单,真空仅处理那些表。

真空分析执行一个真空然后一个分析对于每个选定的表。这是一种方便的日常维护脚本组合形式。看分析有关其处理的更多详细信息。

清楚的真空(没有满的) 只是回收空间并使其可供重复使用。这种形式的命令可以与正常的表读写并行操作,因为没有获得排他锁。但是,额外的空间不会返回给操作系统(在大多数情况下);它只是保留在同一张表中以供重复使用。它还允许我们利用多个 CPU 来处理索引。此功能被称为平行真空.要禁用此功能,可以使用平行线选项并将并行工作者指定为零。真空已满将表的全部内容重写到没有额外空间的新磁盘文件中,允许将未使用的空间返回给操作系统。这种形式要慢得多,需要一个访问独家在处理每个表时锁定它。

When the option list is surrounded by parentheses, the options can be written in any order.没有括号,选项必须完全按照上面显示的顺序指定。括号中的语法是在 PostgreSQL 9.0 中添加的;不推荐使用带括号的语法。

# 参数

满的

选择“full”vacuum,它可以回收更多空间,但需要更长的时间并专门锁定表。此方法还需要额外的磁盘空间,因为它会写入表的新副本并且在操作完成之前不会释放旧副本。通常这应该只在需要从表中回收大量空间时使用。

冻结

选择元组的激进“冻结”。指定冻结相当于执行真空真空_冻结_分钟_年龄真空_冻结_桌子_年龄参数设置为零。表被重写时总是执行主动冻结,所以这个选项是多余的满的被指定。

详细

为每个表打印详细的真空活动报告。

分析

更新计划程序使用的统计信息,以确定执行查询的最有效方式。

DISABLE_PAGE_SKIPPING

一般,真空将根据能见度图.总是可以跳过已知所有元组都被冻结的页面,并且可以跳过已知所有元组对所有事务可见的页面,除非执行激进的清理。此外,除了执行激进的清理时,可能会跳过某些页面以避免等待其他会话完成使用它们。此选项禁用所有页面跳过行为,并且仅在可见性映射的内容可疑时使用,只有在存在导致数据库损坏的硬件或软件问题时才会发生这种情况。

SKIP_LOCKED

指定真空在开始处理关系时不应等待释放任何冲突的锁:如果不等待就无法立即锁定关系,则跳过该关系。请注意,即使使用此选项,真空打开关系的索引时可能仍会阻塞。此外,真空分析从分区、表继承子表和某些类型的外部表获取样本行时,仍可能会阻塞。另外,虽然真空通常处理指定分区表的所有分区,该选项将导致真空如果分区表上存在冲突锁,则跳过所有分区。

INDEX_CLEANUP

一般,真空当表中的死元组很少时,将跳过索引清理。当发生这种情况时,处理所有表索引的成本预计将大大超过删除死索引元组的好处。此选项可用于强制真空当死元组超过零时处理索引。默认是汽车, 这使得真空在适当的时候跳过索引清理。如果INDEX_CLEANUP被设定为,真空将保守地从索引中删除所有死元组。这对于向后兼容 PostgreSQL 的早期版本(这是标准行为)可能很有用。

INDEX_CLEANUP也可以设置为离开强迫真空总是跳过索引清理,即使表中有许多死元组。这在需要时可能很有用真空尽可能快地运行以避免即将发生的事务 ID 环绕(请参阅第 25.1.5 节)。然而,由控制的环绕式故障安全机制真空_故障保护_年龄通常会自动触发以避免事务 ID 环绕失败,应该是首选。如果不定期执行索引清理,性能可能会受到影响,因为随着表的修改,索引会积累死元组,而表本身也会积累死线指针,这些指针在索引清理完成之前无法删除。

此选项对没有索引的表无效,如果满的使用选项。它对事务 ID 环绕故障安全机制也没有影响。触发时,它将跳过索引清理,即使INDEX_CLEANUP设定为.

PROCESS_TOAST

指定真空应该尝试处理相应的吐司每个关系的表(如果存在)。这通常是所需的行为,并且是默认设置。当只需要清理主关系时,将此选项设置为 false 可能很有用。此选项是必需的,当满的使用选项。

截短

指定真空应该尝试截断表末尾的任何空页面,并允许将截断页面的磁盘空间返回给操作系统。这通常是所需的行为,并且是默认行为,除非真空截断对于要清理的表,选项已设置为 false。将此选项设置为 false 可能有助于避免访问独家锁定截断所需的表。如果满的使用选项。

平行线

执行索引真空和索引清理阶段真空并行使用*整数后台工作人员(每个真空阶段的详细信息,请参阅表 28.39)。用于执行操作的工作人员数量等于支持并行真空的关系上的索引数量,该数量受使用指定的工作人员数量限制平行线如果有任何进一步限制的选项最大限度_平行线_维护_工作人员.当且仅当索引的大小大于分钟_平行线_指数_扫描_尺寸.请注意,不能保证指定的并行工作者数量整数*将在执行期间使用。真空吸尘器运行的工人数量可能少于规定的数量,甚至根本没有工人。每个索引只能使用一名工作人员。所以只有在至少有2表中的索引。真空工人在每个阶段开始之前启动并在阶段结束时退出。这些行为可能会在未来的版本中改变。此选项不能与满的选项。

布尔值

指定是否应打开或关闭所选选项。你可以写真的,, 或者1启用该选项,并且错误的,离开, 或者0禁用它。这*布尔值*value 也可以省略,在这种情况下真的假设。

整数

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

表名

要清理的特定表或物化视图的名称(可选的模式限定)。如果指定的表是一个分区表,它的所有叶子分区都会被清理。

列名

要分析的特定列的名称。默认为所有列。如果指定了列列表,分析也必须指定。

# 输出

什么时候详细被指定,真空发出进度消息以指示当前正在处理哪个表。还打印了有关表的各种统计信息。

# 笔记

要清理表,通常必须是表的所有者或超级用户。但是,允许数据库所有者清空其数据库中的所有表,共享目录除外。(共享目录的限制意味着真正的数据库范围真空只能由超级用户执行。)真空将跳过调用用户无权清理的任何表。

真空不能在事务块内执行。

对于具有 GIN 索引的表,真空(以任何形式)还通过将挂起的索引条目移动到主 GIN 索引结构中的适当位置来完成任何挂起的索引插入。看第 67.4.1 节详情。

我们建议经常(至少每晚)清理活动的生产数据库,以删除死行。添加或删除大量行后,最好发出真空分析受影响表的命令。这将使用所有最近更改的结果更新系统目录,并允许 PostgreSQL 查询规划器在规划查询时做出更好的选择。

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

平行线选项仅用于真空目的。如果此选项与分析选项,不影响分析.

真空导致 I/O 流量大幅增加,这可能会导致其他活动会话的性能下降。因此,有时建议使用基于成本的真空延迟功能。对于并行真空,每个工人的睡眠与该工人所做的工作成比例。看第 20.4.4 节详情。

PostgreSQL 包含一个“autovacuum”工具,可以自动执行日常真空维护。有关自动和手动吸尘的更多信息,请参阅第 25.1 节.

每个后端运行真空没有满的选项将报告其进度pg_stat_progress_vacuum看法。后端运行真空已满而是报告他们在pg_stat_progress_cluster看法。看第 28.4.3 节第 28.4.4 节详情。

# 例子

清理单个表一克,为优化器分析它并打印详细的真空活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

# 兼容性

没有真空SQL 标准中的语句。

# 也可以看看

真空数据库, 第 20.4.4 节, 第 25.1.6 节, 第 28.4.3 节, 第 28.4.4 节