对表执行 vacuum 操作
Amazon Redshift 可以在后台自动对表进行排序并执行 VACUUM DELETE 操作。要在加载或一系列增量更新操作后清理表,您也可以对整个数据库或对单个表运行 VACUUM 命令。
注意
只有拥有必要的表权限的用户才能有效地对表执行 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 操作将需要更长的时间,因为需要识别更多数据。
-
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。