## 真空 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 操作中,被更新删除或废弃的元组不会从它们的表中物理删除;他们一直在场,直到`真空`已经完成了。因此有必要做`真空`定期,尤其是在频繁更新的表上。 没有*`表和列`*列表,`真空`处理当前数据库中当前用户有权清理的每个表和物化视图。带着清单,`真空`仅处理那些表。 `真空分析`执行一个`真空`然后一个`分析`对于每个选定的表。这是一种方便的日常维护脚本组合形式。看[分析](sql-analyze.html)有关其处理的更多详细信息。 清楚的`真空`(没有`满的`) 只是回收空间并使其可供重复使用。这种形式的命令可以与正常的表读写并行操作,因为没有获得排他锁。但是,额外的空间不会返回给操作系统(在大多数情况下);它只是保留在同一张表中以供重复使用。它还允许我们利用多个 CPU 来处理索引。此功能被称为*平行真空*.要禁用此功能,可以使用`平行线`选项并将并行工作者指定为零。`真空已满`将表的全部内容重写到没有额外空间的新磁盘文件中,允许将未使用的空间返回给操作系统。这种形式要慢得多,需要一个`访问独家`在处理每个表时锁定它。 When the option list is surrounded by parentheses, the options can be written in any order.没有括号,选项必须完全按照上面显示的顺序指定。括号中的语法是在 PostgreSQL 9.0 中添加的;不推荐使用带括号的语法。 ## 参数 `满的` 选择“full”vacuum,它可以回收更多空间,但需要更长的时间并专门锁定表。此方法还需要额外的磁盘空间,因为它会写入表的新副本并且在操作完成之前不会释放旧副本。通常这应该只在需要从表中回收大量空间时使用。 `冻结` 选择元组的激进“冻结”。指定`冻结`相当于执行`真空`与[真空\_冻结\_分钟\_年龄](runtime-config-client.html#GUC-VACUUM-FREEZE-MIN-AGE)和[真空\_冻结\_桌子\_年龄](runtime-config-client.html#GUC-VACUUM-FREEZE-TABLE-AGE)参数设置为零。表被重写时总是执行主动冻结,所以这个选项是多余的`满的`被指定。 `详细` 为每个表打印详细的真空活动报告。 `分析` 更新计划程序使用的统计信息,以确定执行查询的最有效方式。 `DISABLE_PAGE_SKIPPING` 一般,`真空`将根据[能见度图](routine-vacuuming.html#VACUUM-FOR-VISIBILITY-MAP).总是可以跳过已知所有元组都被冻结的页面,并且可以跳过已知所有元组对所有事务可见的页面,除非执行激进的清理。此外,除了执行激进的清理时,可能会跳过某些页面以避免等待其他会话完成使用它们。此选项禁用所有页面跳过行为,并且仅在可见性映射的内容可疑时使用,只有在存在导致数据库损坏的硬件或软件问题时才会发生这种情况。 `SKIP_LOCKED` 指定`真空`在开始处理关系时不应等待释放任何冲突的锁:如果不等待就无法立即锁定关系,则跳过该关系。请注意,即使使用此选项,`真空`打开关系的索引时可能仍会阻塞。此外,`真空分析`从分区、表继承子表和某些类型的外部表获取样本行时,仍可能会阻塞。另外,虽然`真空`通常处理指定分区表的所有分区,该选项将导致`真空`如果分区表上存在冲突锁,则跳过所有分区。 `INDEX_CLEANUP` 一般,`真空`当表中的死元组很少时,将跳过索引清理。当发生这种情况时,处理所有表索引的成本预计将大大超过删除死索引元组的好处。此选项可用于强制`真空`当死元组超过零时处理索引。默认是`汽车`, 这使得`真空`在适当的时候跳过索引清理。如果`INDEX_CLEANUP`被设定为`在`,`真空`将保守地从索引中删除所有死元组。这对于向后兼容 PostgreSQL 的早期版本(这是标准行为)可能很有用。 `INDEX_CLEANUP`也可以设置为`离开`强迫`真空`到*总是*跳过索引清理,即使表中有许多死元组。这在需要时可能很有用`真空`尽可能快地运行以避免即将发生的事务 ID 环绕(请参阅[第 25.1.5 节](routine-vacuuming.html#VACUUM-FOR-WRAPAROUND))。然而,由控制的环绕式故障安全机制[真空\_故障保护\_年龄](runtime-config-client.html#GUC-VACUUM-FAILSAFE-AGE)通常会自动触发以避免事务 ID 环绕失败,应该是首选。如果不定期执行索引清理,性能可能会受到影响,因为随着表的修改,索引会积累死元组,而表本身也会积累死线指针,这些指针在索引清理完成之前无法删除。 此选项对没有索引的表无效,如果`满的`使用选项。它对事务 ID 环绕故障安全机制也没有影响。触发时,它将跳过索引清理,即使`INDEX_CLEANUP`设定为`在`. `PROCESS_TOAST` 指定`真空`应该尝试处理相应的`吐司`每个关系的表(如果存在)。这通常是所需的行为,并且是默认设置。当只需要清理主关系时,将此选项设置为 false 可能很有用。此选项是必需的,当`满的`使用选项。 `截短` 指定`真空`应该尝试截断表末尾的任何空页面,并允许将截断页面的磁盘空间返回给操作系统。这通常是所需的行为,并且是默认行为,除非`真空截断`对于要清理的表,选项已设置为 false。将此选项设置为 false 可能有助于避免`访问独家`锁定截断所需的表。如果`满的`使用选项。 `平行线` 执行索引真空和索引清理阶段`真空`并行使用*`整数`*后台工作人员(每个真空阶段的详细信息,请参阅[表 28.39](progress-reporting.html#VACUUM-PHASES))。用于执行操作的工作人员数量等于支持并行真空的关系上的索引数量,该数量受使用指定的工作人员数量限制`平行线`如果有任何进一步限制的选项[最大限度\_平行线\_维护\_工作人员](runtime-config-resource.html#GUC-MAX-PARALLEL-MAINTENANCE-WORKERS).当且仅当索引的大小大于[分钟\_平行线\_指数\_扫描\_尺寸](runtime-config-query.html#GUC-MIN-PARALLEL-INDEX-SCAN-SIZE).请注意,不能保证指定的并行工作者数量*`整数`*将在执行期间使用。真空吸尘器运行的工人数量可能少于规定的数量,甚至根本没有工人。每个索引只能使用一名工作人员。所以只有在至少有`2`表中的索引。真空工人在每个阶段开始之前启动并在阶段结束时退出。这些行为可能会在未来的版本中改变。此选项不能与`满的`选项。 *`布尔值`* 指定是否应打开或关闭所选选项。你可以写`真的`,`在`, 或者`1`启用该选项,并且`错误的`,`离开`, 或者`0`禁用它。这*`布尔值`*value 也可以省略,在这种情况下`真的`假设。 *`整数`* 指定传递给选定选项的非负整数值。 *`表名`* 要清理的特定表或物化视图的名称(可选的模式限定)。如果指定的表是一个分区表,它的所有叶子分区都会被清理。 *`列名`* 要分析的特定列的名称。默认为所有列。如果指定了列列表,`分析`也必须指定。 ## 输出 什么时候`详细`被指定,`真空`发出进度消息以指示当前正在处理哪个表。还打印了有关表的各种统计信息。 ## 笔记 要清理表,通常必须是表的所有者或超级用户。但是,允许数据库所有者清空其数据库中的所有表,共享目录除外。(共享目录的限制意味着真正的数据库范围`真空`只能由超级用户执行。)`真空`将跳过调用用户无权清理的任何表。 `真空`不能在事务块内执行。 对于具有 GIN 索引的表,`真空`(以任何形式)还通过将挂起的索引条目移动到主 GIN 索引结构中的适当位置来完成任何挂起的索引插入。看[第 67.4.1 节](gin-implementation.html#GIN-FAST-UPDATE)详情。 我们建议经常(至少每晚)清理活动的生产数据库,以删除死行。添加或删除大量行后,最好发出`真空分析`受影响表的命令。这将使用所有最近更改的结果更新系统目录,并允许 PostgreSQL 查询规划器在规划查询时做出更好的选择。 这`满的`不建议常规使用该选项,但在特殊情况下可能有用。例如,当您删除或更新了表中的大部分行并希望表在物理上缩小以占用更少的磁盘空间并允许更快的表扫描时。`真空已满`通常会比普通的缩小桌子更多`真空`将。 这`平行线`选项仅用于真空目的。如果此选项与`分析`选项,不影响`分析`. `真空`导致 I/O 流量大幅增加,这可能会导致其他活动会话的性能下降。因此,有时建议使用基于成本的真空延迟功能。对于并行真空,每个工人的睡眠与该工人所做的工作成比例。看[第 20.4.4 节](runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST)详情。 PostgreSQL 包含一个“autovacuum”工具,可以自动执行日常真空维护。有关自动和手动吸尘的更多信息,请参阅[第 25.1 节](routine-vacuuming.html). 每个后端运行`真空`没有`满的`选项将报告其进度`pg_stat_progress_vacuum`看法。后端运行`真空已满`而是报告他们在`pg_stat_progress_cluster`看法。看[第 28.4.3 节](progress-reporting.html#VACUUM-PROGRESS-REPORTING)和[第 28.4.4 节](progress-reporting.html#CLUSTER-PROGRESS-REPORTING)详情。 ## 例子 清理单个表`一克`,为优化器分析它并打印详细的真空活动报告: ``` VACUUM (VERBOSE, ANALYZE) onek; ``` ## 兼容性 没有`真空`SQL 标准中的语句。 ## 也可以看看 [真空数据库](app-vacuumdb.html), [第 20.4.4 节](runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST), [第 25.1.6 节](routine-vacuuming.html#AUTOVACUUM), [第 28.4.3 节](progress-reporting.html#VACUUM-PROGRESS-REPORTING), [第 28.4.4 节](progress-reporting.html#CLUSTER-PROGRESS-REPORTING)