对表执行 vacuum 操作 - Amazon Redshift

对表执行 vacuum 操作

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

注意

仅表所有者或超级用户可对表高效地执行 vacuum 操作。如果您不具有某个表的所有者或超级用户权限,则指定单个表的 VACUUM 操作将失败。如果您对整个数据库运行 VACUUM,而不指定表名,则操作将成功完成。不过,该操作不会影响您不具有其所有者或超级用户权限的表。

出于此原因,我们建议根据需要对各个表执行 vacuum 操作。我们也推荐此方法,因为对整个数据库进行 vacuum 操作可能会消耗大量资源。

自动表排序

Amazon Redshift 在后台自动对数据进行排序以按照其排序键顺序保留表数据。Amazon Redshift 将跟踪您的扫描查询以确定表的哪些部分将从排序中受益。

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

Amazon Redshift 跟踪在每个表上使用排序键的扫描查询。Amazon Redshift 估计每个表(如果表已完全排序)在数据扫描和筛选方面的最大改进百分比。此估计值在 vacuum_sort_benefit 中的 SVV_TABLE_INFO 列中可见。您可以将此列与 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 删除

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

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 的各种修饰符控制它的工作方式。您可以使用它们来根据当前需求定制 vacuum 操作。例如,使用 VACUUM RECLUSTER 可通过不执行完全合并操作来缩短 vacuum 操作。有关更多信息,请参阅VACUUM

vacuum 阈值

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

vacuum 类型

有关不同 vacuum 类型的信息,请参阅VACUUM