

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# VACUUM
<a name="r_VACUUM_command"></a>

对行重新排序，并回收指定表或当前数据库中所有表的空间。

**注意**  
只有拥有必要的表权限的用户才能有效地对表执行 vacuum 操作。如果在没有必需的表权限的情况下运行 VACUUM 操作，该操作将成功完成，但不起任何作用。有关能有效运行 VACUUM 操作的有效表权限列表，请参阅以下“必需权限”部分。

Amazon Redshift 自动对数据进行排序，并在后台运行 VACUUM DELETE。这减少了运行 VACUUM 命令的需要。有关更多信息，请参阅 [对表执行 vacuum 操作](t_Reclaiming_storage_space202.md)。

默认情况下，当任意表中有 95% 的行已有序时，VACUUM 会为该表跳过排序阶段。跳过排序阶段能够显著提高 VACUUM 的性能。要更改某个表的默认排序或删除阈值，请在运行 VACUUM 时包含表名称和 TO *threshold* PERCENT 参数。

在对表执行 vacuum 操作时，用户可以访问表。您可以在对表执行 vacuum 操作的同时执行查询和写入操作，但如果数据操作语言 (DML) 命令和 vacuum 操作同时运行，则二者可能花费更长时间。如果您在 vacuum 操作期间执行 UPDATE 和 DELETE 语句，则系统性能可能会降低。VACUUM DELETE 会临时阻止更新和删除操作。

Amazon Redshift 在后台自动执行 DELETE ONLY vacuum 操作。当用户运行数据定义语言 (DDL) 操作（如 ALTER TABLE）时，自动 vacuum 操作将暂停。

**注意**  
Amazon Redshift VACUUM 命令语法和行为与 PostgreSQL VACUUM 操作的语法和行为大不相同。例如，Amazon Redshift 中的默认 VACUUM 操作是 VACUUM FULL，该操作可回收磁盘空间并对所有行进行重新排序。相比之下，PostgreSQL 中的默认 VACUUM 操作只能回收空间并使其可供重复使用。

有关更多信息，请参阅 [对表执行 vacuum 操作](t_Reclaiming_storage_space202.md)。

## 所需的权限
<a name="r_VACUUM_command-privileges"></a>

以下是 VACUUM 所需的权限：
+ Superuser
+ 具有 VACUUM 权限的用户
+ 表拥有者
+ 向其共享表的数据库拥有者

## 语法
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## 参数
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
对指定的表（或当前数据库中的所有表）进行排序，并回收由前面的 UPDATE 和 DELETE 操作标记为删除的行所占用的磁盘空间。VACUUM FULL 是默认值。  
完全 vacuum 操作不会为交错的表重建索引。要在执行完全 vacuum 操作后对交错的表重建索引，请使用 [VACUUM REINDEX](#vacuum-reindex) 选项。  
如果任意表已至少 95% 有序，则默认情况下 VACUUM FULL 会为其跳过排序阶段。如果 VACUUM 能够跳过排序阶段，它将执行 DELETE ONLY 并在删除阶段回收空间，这样，至少有 95% 的剩余行不会被标记为删除。   
如果未达到排序阈值（例如，如果对 90% 的行进行了排序）且 VACUUM 执行了完全排序，则 VACUUM 也会执行一次彻底删除操作，从而从 100% 的已删除行恢复空间。  
您只能为单个表更改默认 vacuum 阈值。要更改某个表的默认 vacuum 阈值，请包含表名称和 TO *threshold* PERCENT 参数。

SORT ONLY   <a name="vacuum-sort-only"></a>
对指定的表（或当前数据库中的所有表）进行排序，而不回收由删除的表所释放的空间。当回收磁盘空间不重要但对新行进行重新排序很重要时，此选项非常有用。当未排序的区域不包含大量已删除行且不跨整个已排序区域时，SORT ONLY vacuum 将减少 vacuum 操作的运行时间。如果应用程序不具有磁盘空间限制，但依赖于要求表行保持排序状态的查询优化，则可从此类 vacuum 操作获益。  
默认情况下，VACUUM SORT ONLY 将跳过任何至少有 95% 的行已排序的表。要更改某个表的默认排序阈值，请在运行 VACUUM 时包含表名称和 TO *threshold* PERCENT 参数。

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift 在后台自动执行 DELETE ONLY vacuum 操作，因此，您很少需要运行 DELETE ONLY vacuum。  
VACUUM DELETE 回收由前面的 UPDATE 和 DELETE 操作标记为删除的行所占用的磁盘空间，并压缩表以释放占用的空间。DELETE ONLY vacuum 操作不对表数据进行排序。  
当回收磁盘空间很重要但对新行进行重新排序不重要时，此选项可减少 vacuum 操作的运行时间。此外，当查询性能已处于最佳状态，且不要求对行重新排序来优化查询性能时，此选项也很有用。  
默认情况下，VACUUM DELETE ONLY 将回收空间，这样，至少有 95% 的剩余行不会被标记为删除。要更改某个表的默认删除阈值，请在运行 VACUUM 时包含表名称和 TO *threshold* PERCENT 参数。    
一些操作（例如 `ALTER TABLE APPEND`）可能会导致对表进行分片。当您使用 `DELETE ONLY`子句时，vacuum 操作将从分片的表中回收空间。95% 的同一阈值适用于碎片整理操作。

REINDEX  <a name="vacuum-reindex"></a>
分析交错排序键列中的值的分配，然后执行完全 VACUUM 操作。如果使用 REINDEX，则表名称是必需的。  
VACUUM REINDEX 所需的时间显著大于 VACUUM FULL 所需的时间，因为它需要执行额外的过程来分析交错排序键。对于交错表，排序和合并操作所花费的时间更长，因为与复合排序相比，交错排序需要重新排列的行可能更多。  
如果 VACUUM REINDEX 操作在完成前终止，则下一个 VACUUM 将恢复重建索引操作，然后执行完全 vacuum 操作。  
VACUUM REINDEX 不支持 TO *threshold* PERCENT。  

RECLUSTER  <a name="vacuum-recluster"></a>
对表中未排序的部分进行排序。表中已按自动表排序进行排序的部分保持不变。此命令不会将新排序的数据与排序区域合并。也不会回收标记为删除的所有空间。完成此命令后，表可能不会显示完全排序，如 SVV\_TABLE\_INFO 中的 `unsorted` 字段所示。  
 我们建议您对具有频繁摄入和仅访问最新数据的查询操作的大型表使用 VACUUM RECLUSTER。  
 VACUUM RECLUSTER 不支持 TO threshold PERCENT。如果使用 RECLUSTER，则表名称是必需的。  
对于具有交错排序键的表和具有 ALL 分配方式的表，不支持 VACUUM RECLUSTER。

 *table\_name*   
要执行 vacuum 操作的表的名称。如果不指定表名称，vacuum 操作将应用于当前数据库中的所有表。您可以指定任何永久或临时的用户创建的表。此命令对于其他对象（例如，视图和系统表）没有用处。  
 如果包含 TO *threshold* PERCENT 参数，则必须指定表名称。

 TO *threshold* PERCENT   
一个子句，指定超过时 VACUUM 将跳过排序阶段的阈值和删除阶段中回收空间的目标阈值。*排序阈值* 是执行 vacuum 操作之前在指定表中已排序的行占总行数的百分比。 *删除阈值* 是执行 vacuum 操作之后未标记为删除的行占总行数的最小百分比。  
由于 VACUUM 仅会在表中已排序行所占的百分比低于排序阈值时对行进行重新排序，Amazon Redshift 经常可以大幅减少 VACUUM 次数。同样，当 VACUUM 不受限于从 100% 的标记为删除的行回收空间时，它通常能够跳过重写仅包含几个已删除行的数据块的过程。  
例如，如果您为 *threshold* 指定 75，则当表中 75% 或以上的行已有序时，VACUUM 会跳过排序阶段。对于删除阶段，VACUUMS 将设置一个回收磁盘空间的目标，这样，在执行 vacuum 操作之后，表中至少有 75% 的行不会被标记为删除。*threshold* 值必须为介于 0 到 100 之间的整数。默认值为 95。如果您指定了值 100，VACUUM 将始终对表进行排序（除非它已完全排序）并从标记为删除的所有行回收空间。如果您指定的值为 0，则 VACUUM 将从不对表进行排序，也从不会回收空间。  
如果您包含 TO *threshold* PERCENT 参数，则必须同时指定表名称。如果忽略表名称，则 VACUUM 操作将失败。  
您不能将 TO *threshold* PERCENT 参数用于 REINDEX。

BOOST  
使用可用的其他资源（例如内存和磁盘空间）运行 VACUUM 命令。利用 BOOST 选项，VACUUM 在一个窗口中运行，并在 VACUUM 操作期间阻止并发删除和更新。使用 BOOST 选项运行会争用系统资源，这可能会影响查询性能。当系统负载很小时（例如，在维护操作期间），运行 VACUUM BOOST。  
在使用 BOOST 选项时，注意以下事项：  
+ 在指定 BOOST 时，需要 *table\_name* 值。
+ 不支持将 BOOST 与 REINDEX 结合使用。
+ BOOST 与 DELETE ONLY 结合使用时将被忽略。

## 使用说明
<a name="r_VACUUM_usage_notes"></a>

对于大多数 Amazon Redshift 应用程序，建议执行完全 vacuum 操作。有关更多信息，请参阅 [对表执行 vacuum 操作](t_Reclaiming_storage_space202.md)。

在运行 vacuum 操作之前，请注意以下行为：
+ 您不能在事务数据块 (BEGIN ... END) 中运行 VACUUM。有关事务的更多信息，请参阅 [Amazon Redshift 中的隔离级别](c_serial_isolation.md)。
+ 对表执行 vacuum 操作时，表可能会出现一定量的增长。当没有可回收空间的已删除行时，或者表的新排序顺序导致数据压缩率降低时，这是预期行为。
+ 在 vacuum 操作期间，会出现一定程度的查询性能降级。一旦 vacuum 操作完成，性能就将恢复正常。
+ 并发写入操作可在 vacuum 操作期间执行，但我们不建议在进行 vacuum 操作时执行写入操作。更高效的方法是，先完成写入操作，然后再运行 vacuum 操作。此外，不能对 vacuum 操作开始后写入的任何数据执行此操作。在这种情况下，有必要执行另一个 vacuum 操作。
+ 如果加载或插入操作已在进行中，则 vacuum 操作可能无法开始。Vacuum 操作临时需要表的独占访问权限才能开始。要求此独占访问权限的时间非常短，vacuum 操作不会阻止任何重要时段内的并发加载和插入操作。
+ 当不需要对特定表执行 vacuum 操作时，将跳过 vacuum 操作；不过，发现可跳过该操作会产生一些开销。如果您知道某个表是原始表或未达到 vacuum 阈值，则不要对其运行 vacuum 操作。
+ 对小型表执行 DELETE ONLY vacuum 操作可能不会减少用于存储数据的块数，特别是当表具有大量列或集群为每个节点使用大量切片时。这些 vacuum 操作会按每个切片、每个列增加一个块，来支持对表执行的并行插入；相比通过回收磁盘空间减少块计数带来的好处，产生的开销可能会得不偿失。例如，如果在执行 vacuum 操作之前，一个 8 节点集群中包含 10 列的表占用了 1000 个块，则 vacuum 不会减少实际块计数，除非由于已删除的行导致回收 80 个以上的磁盘空间块。（每个数据块使用 1MB。）

在满足下列任意条件时，自动 vacuum 操作暂停：
+ 用户运行数据定义语言 (DDL) 操作（例如 ALTER TABLE），该操作需要自动 vacuum 当前正在处理的表上的独占锁定。
+ 高集群负载期间。

### 对并发 VACUUM 的支持
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift 支持在集群或工作组中的不同会话上并发运行多个 vacuum 事务。这意味着，您可以一次发出所有 vacuum 模式的不同和多个实例，每个 vacuum 事务都在一个唯一的表上。两个 vacuum 操作不能同时在单个表上运行。

**运行并发 vacuum 的指导原则**
+ 在不同会话中运行并发 vacuum 事务时，应监控系统资源，并避免并发运行过多 vacuum 操作。
+ 建议的并发级别取决于要回收的空间量、要排序的行数和行宽度、仓库的大小以及与 VACUUM 操作一起运行的工作负载的大小。
+ 根据 vacuum 事务的模式，从两个并发 vacuum 操作开始，然后根据它们的运行时间和系统负载添加更多操作。就像用户发出的其它繁重的查询一样，如果您在 Amazon Redshift 达到系统资源限制时并发运行过多 vacuum 操作，则这些操作可能会开始排队。
+ 运行多个 Vacuum BOOST 操作时，请务必小心。使用 BOOST 选项运行 Vacuum 会争用系统资源，这可能会影响查询性能。当系统负载很小时（例如，在维护操作期间），运行 VACUUM BOOST。
+ 如果不指定表名称，vacuum 操作将应用于当前数据库中的所有表。这些 vacuum 操作仍按顺序运行。

## 示例
<a name="r_VACUUM_command-examples"></a>

根据默认的 95% vacuum 阈值回收所有表中的空间和数据库并对这些表中的行进行重新排序。

```
vacuum;
```

根据默认的 95% 阈值回收 SALES 表中的空间并对该表中的行进行重新排序。

```
vacuum sales;
```

始终回收 SALES 表中的空间并对该表中的行进行重新排序。

```
vacuum sales to 100 percent;
```

仅当 SALES 表中有序行的比例低于 75% 时对该表中的行进行重新排序。

```
 vacuum sort only sales to 75 percent;
```

回收 SALES 表中的空间，以使至少 75% 的剩余行不会在 vacuum 操作之后被标记为删除。

```
vacuum delete only sales to 75 percent;
```

为 LISTING 表重建索引，然后对该表执行 vacuum 操作。

```
vacuum reindex listing;
```

以下命令会返回错误。

```
vacuum reindex listing to 75 percent;
```

重建集群，然后对 LISTING 表执行 vacuum 操作。

```
vacuum recluster listing;
```

重建集群，然后使用 BOOST 选项对 LISTING 表执行 vacuum 操作。

```
vacuum recluster listing boost;
```