Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

对表执行 vacuum 操作

要在批量删除、加载或一系列增量更新操作后清理表,您需要对整个数据库或对单个表运行 VACUUM 命令。

注意

仅表所有者或超级用户可对表高效地执行 vacuum 操作。如果您不具有某个表的所有者或超级用户权限,则指定单个表的 VACUUM 操作将失败。如果您对整个数据库运行 VACUUM 而不指定表名称,尽管该操作将成功完成,但对您不具有所有者或超级用户权限的表不起作用。由于这个原因,同时由于对整个数据库执行 vacuum 操作可能是一项昂贵的操作,因此建议您按需对各个表执行 vacuum 操作。

Amazon Redshift 不会自动回收和重用在您删除行和更新行时释放的空间。为了执行更新,Amazon Redshift 将删除原始行并追加更新后的行,因此每次更新实际上是后于插入操作执行的删除操作。在执行删除操作时,会将行标记为删除而不是将其删除。查询处理器需要扫描已删除的行和未删除的行,因此已删除的行过多会导致不必要的处理。您应在执行大量删除或更新操作后执行 vacuum 操作,以便回收空间和提高查询性能。

对于带排序键的表,VACUUM 命令可确保表中的新数据在磁盘上完全排序。在最初将数据加载到具有排序键的表中时,将按照 CREATE TABLE 语句中的 SORTKEY 规范对数据进行排序。但是,当您使用 COPY、INSERT 或 UPDATE 语句更新表时,新行将存储在磁盘上的单独的未排序区域中,然后根据查询的需求进行排序。如果大量行在磁盘上保持未排序状态,依赖已排序数据的操作(例如,范围受限的扫描或合并联接)的查询性能可能会下降。VACUUM 命令会将新行与现有的已排序行合并,因此范围受限的扫描将更高效,并且执行引擎在查询执行期间无需按需对行进行排序。

在使用交错排序键对表进行排序时,Amazon Redshift 将分析排序键列中的值的分配以确定最佳排序策略。随着时间的推移,该分配会发生更改或偏移,从而可能导致性能下降。运行 VACUUM REINDEX 可重新分析排序键分配并还原性能。有关更多信息,请参阅 交错排序键

VACUUM 频率

您应按照所需频率执行 vacuum 操作以保持一致的查询性能。在确定运行 VACUUM 命令的频率时,请考虑以下因素。

  • 在预计群集上的活动最少的时间段(例如,夜晚或指定的数据库管理时段)内运行 VACUUM。

  • 大型未排序区域将导致更长的 vacuum 时间。如果您延迟 vacuum 操作,则 vacuum 操作将需要更长的时间,因为需要识别更多数据。

  • VACUUM 是 I/O 密集型操作,因此,完成 vacuum 操作所需的时间越长,它对您的群集上运行的并发查询和其他数据库操作的影响就越大。

  • 对于使用交错排序的表,VACUUM 花费的时间更长。要评估是否需对交错的表进行排序,请查询 SVV_INTERLEAVED_COLUMNS 视图。

排序阶段和合并阶段

Amazon Redshift 按照两个阶段执行 vacuum 操作:首先,它会对未排序区域中的行进行排序;然后,如有必要,会将表结尾处的新排序的行与现有行合并。在对大型表执行 vacuum 操作时,vacuum 操作将在合并后继续一系列步骤(包括增量排序)。如果操作失败,或者如何 Amazon Redshift 在 vacuum 操作期间停止运行,已部分执行 vacuum 操作的表或数据库将处于一致状态,但您需要手动重启 vacuum 操作。增量排序将丢失,但不需要再次对失败前已提交的合并行执行 vacuum 操作。如果未排序区域较大,则浪费的时间可能更多。有关排序阶段和合并阶段的更多信息,请参阅管理已合并行的数量

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

Vacuum 阈值

默认情况下,当任意表中有 95% 的行已有序时,VACUUM 会为该表跳过排序阶段。跳过排序阶段能够显著提高 VACUUM 的性能。此外,在删除阶段,VACUUM 将回收空间以使至少 95% 的剩余行不会被标记为删除。VACUUM 通常能够跳过以下过程:重写很多仅包含几个标记为删除的行的数据块。因此,与回收 100% 的删除行相比,VACUUM 在删除阶段所需的时间少得多。要更改某个表的默认排序阈值,请在运行 VACUUM 命令时包含表名称和 TO threshold PERCENT 参数。

Vacuum 类型

您可以运行完全 vacuum、仅删除 vacuum、仅排序 vacuum,或用完全 vacuum 重建索引。

  • VACUUM FULL

    建议在回收空间和对行重新排序同等重要的应用中采用完全 vacuum。运行完全 vacuum 比运行连续的 DELETE ONLY 和 SORT ONLY vacuum 操作更高效。VACUUM FULL 与 VACUUM 等效。完全 vacuum 是默认的 vacuum 操作。

  • VACUUM DELETE ONLY

    DELETE ONLY vacuum 与完全 vacuum 等效,只是它跳过了排序操作。在回收磁盘空间重要但对新行重新排序不重要时,DELETE ONLY vacuum 可节省时间。例如,如果您不需要对行重新排序来优化查询性能,则可执行 DELETE ONLY vacuum 操作。

  • VACUUM SORT ONLY

    SORT ONLY vacuum 无需回收磁盘空间,这可节省一些时间,但在大多数情况下,与完全 vacuum 相比,并没有什么优势。

  • VACUUM REINDEX

    对使用交错排序键的表使用 VACUUM REINDEX。

    最初使用 COPY 或 CREATE TABLE AS 加载空交错表时,Amazon Redshift 自动构建交错索引。如果您最初使用 INSERT 加载交错表,则需要在之后运行 VACUUM REINDEX 以初始化交错索引。

    REINDEX 重新分析表的排序键列中的值分配,然后执行完全 VACUUM 操作。VACUUM REINDEX 花费的时间比 VACUUM FULL 长得多,因为它需要对数据执行额外的分析过程,而且合并新的交错数据可能需要接触所有数据块。

    如果 VACUUM REINDEX 操作在完成前终止,则下一个 VACUUM 将恢复重建索引操作,然后执行 vacuum 操作。