

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

# 对表执行 vacuum 操作
<a name="t_Reclaiming_storage_space202"></a>

Amazon Redshift 可以在后台自动对表进行排序并执行 VACUUM DELETE 操作。要在加载或一系列增量更新操作后清理表，您也可以对整个数据库或对单个表运行 [VACUUM](r_VACUUM_command.md) 命令。

**注意**  
只有拥有必要的表权限的用户才能有效地对表执行 vacuum 操作。如果在没有必需的表权限的情况下运行 VACUUM 操作，该操作将成功完成，但不起任何作用。有关能有效运行 VACUUM 操作的有效表权限列表，请参阅[VACUUM](r_VACUUM_command.md)。  
出于此原因，我们建议根据需要对各个表执行 vacuum 操作。我们也推荐此方法，因为对整个数据库进行 vacuum 操作可能会消耗大量资源。

## 自动表排序
<a name="automatic-table-sort"></a>

Amazon Redshift 在后台自动对数据进行排序以按照其排序键顺序保留表数据。Amazon Redshift 将跟踪您的扫描查询以确定表的哪些部分将从排序中受益。Amazon Redshift 还会跟踪来自并发扩展集群的扫描查询。对于使用 Amazon Redshift 数据共享的多集群架构，Amazon Redshift 还会跟踪来自数据网格中使用者集群/工作组（包括不同区域的集群/工作组）的扫描查询。系统将来自主集群、并发扩展集群和使用者集群中的扫描统计数据聚合在一起，来确定表的哪些部分可以从排序中获益。

根据系统上的负载，Amazon Redshift 自动启动排序操作。此自动排序减少了运行 VACUUM 命令以按排序键顺序保留数据的需求。如果您需要按排序键顺序对数据进行完全排序（例如，在加载大量数据之后），则您仍可以手动运行 VACUUM 命令。要通过运行 VACUUM SORT 来确定您的表是否将受益，请监控 `vacuum_sort_benefit` 中的 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 列。

Amazon Redshift 跟踪在每个表上使用排序键的扫描查询。Amazon Redshift 估计每个表（如果表已完全排序）在数据扫描和筛选方面的最大改进百分比。此估计值在 `vacuum_sort_benefit` 中的 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 列中可见。您可以将此列与 `unsorted` 列结合使用，确定查询何时可以从手动对表运行 VACUUM SORT 中受益。`unsorted` 列反映表的物理排序顺序。`vacuum_sort_benefit` 列指定通过手动运行 VACUUM SORT 对表进行排序的影响。

例如，请考虑以下查询：

```
select "table", unsorted,vacuum_sort_benefit from svv_table_info order by 1;
```

```
 table | unsorted | vacuum_sort_benefit 
-------+----------+---------------------
 sales |    85.71 |                5.00
 event |    45.24 |               67.00
```

对于表“sales”，即使该表的物理未排序项约为 86%，其对查询性能的影响也仅为 5%。这可能是因为查询只访问表的一小部分内容，也可能是因为访问表的查询几近于无。对于表“event”，该表的物理未排序项约为 45%。不过，67% 的查询性能影响表明查询访问了表的更大部分内容，或者访问表的查询的数量很多。表“event”可能会从运行 VACUUM SORT 中受益。

## 自动 vacuum 删除
<a name="automatic-table-delete"></a>

执行 delete 操作时，会将行标记为删除，但不会删除。Amazon Redshift 会根据数据库表中已删除的行数在后台自动运行 VACUUM DELETE 操作。Amazon Redshift 安排 VACUUM DELETE 在负载减少期间运行，并在高负载期间暂停操作。

**Topics**
+ [自动表排序](#automatic-table-sort)
+ [自动 vacuum 删除](#automatic-table-delete)
+ [vacuum 频率](#vacuum-frequency)
+ [排序阶段和合并阶段](#vacuum-stages)
+ [vacuum 阈值](#vacuum-sort-threshold)
+ [vacuum 类型](#vacuum-types)
+ [最大程度地减少 vacuum 次数](vacuum-managing-vacuum-times.md)

## vacuum 频率
<a name="vacuum-frequency"></a>

您应按照所需的频率执行 vacuum 操作以保持一致的查询性能。在确定运行 VACUUM 命令的频率时，请考虑以下因素：
+ 在预计集群上的活动最少的时间段（例如，夜晚或指定的数据库管理时段）内运行 VACUUM。
+ 在维护时段之外运行 VACUUM 命令。有关更多信息，请参阅[计划维护时段](https://docs.amazonaws.cn/redshift/latest/dg/c_best-practices-avoid-maintenance.html)。
+ 大型未排序区域将导致更长的 vacuum 时间。如果您延迟 vacuum 操作，则 vacuum 操作将需要更长的时间，因为需要识别更多数据。
+ VACUUM 是 I/O 密集型操作，因此，完成 vacuum 操作所需的时间越长，它对您的集群上运行的并发查询和其他数据库操作的影响就越大。
+ 对于使用交错排序的表，VACUUM 花费的时间更长。要评估是否必须对交错的表重新排序，请查询 [SVV\$1INTERLEAVED\$1COLUMNS](r_SVV_INTERLEAVED_COLUMNS.md) 视图。

## 排序阶段和合并阶段
<a name="vacuum-stages"></a>

Amazon Redshift 按照两个阶段执行 vacuum 操作：首先，它会对未排序区域中的行进行排序；然后，如有必要，会将表结尾处的新排序的行与现有行合并。在对大型表执行 vacuum 操作时，vacuum 操作将在合并后继续一系列步骤（包括增量排序）。如果操作失败，或者如何 Amazon Redshift 在 vacuum 操作期间脱机，已部分执行 vacuum 操作的表或数据库将处于一致状态，但您必须手动重启 vacuum 操作。增量排序将丢失，但不需要再次对失败前已提交的合并行执行 vacuum 操作。如果未排序区域较大，则浪费的时间可能更多。有关排序阶段和合并阶段的更多信息，请参阅[减少合并的行数](vacuum-managing-vacuum-times.md#vacuum-managing-volume-of-unmerged-rows)。

在对表执行 vacuum 操作时，用户可以访问表。您可以在对表执行 vacuum 操作的同时执行查询和写入操作，但如果 DML 和 vacuum 操作同时运行，则二者可能花费更长时间。如果您在 vacuum 操作期间执行 UPDATE 和 DELETE 语句，则系统性能可能会降低。增量合并会临时阻止并发 UPDATE 和 DELETE 操作，而 UPDATE 和 DELETE 反过来会临时阻止对受影响的表执行增量合并步骤。在对表执行完 vacuum 操作前，DDL 操作（例如 ALTER TABLE）将被阻止。

**注意**  
VACUUM 的各种修饰符控制它的工作方式。您可以使用它们来根据当前需求定制 vacuum 操作。例如，使用 VACUUM RECLUSTER 可通过不执行完全合并操作来缩短 vacuum 操作。有关更多信息，请参阅 [VACUUM](r_VACUUM_command.md)。

## vacuum 阈值
<a name="vacuum-sort-threshold"></a>

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

## vacuum 类型
<a name="vacuum-types"></a>

有关不同 vacuum 类型的信息，请参阅[VACUUM](r_VACUUM_command.md)。