对表执行 vacuum 操作
要在加载或一系列增量更新操作后清理表,您需要对整个数据库或对单个表运行 VACUUM 命令。
注意
仅表所有者或超级用户可对表高效地执行 vacuum 操作。如果您不具有某个表的所有者或超级用户权限,则指定单个表的 VACUUM 操作将失败。如果您对整个数据库运行 VACUUM 而不指定表名称,尽管该操作将成功完成,但对您不具有所有者或超级用户权限的表不起作用。由于这个原因,同时由于对整个数据库执行 vacuum 操作可能是一项昂贵的操作,因此建议您按需对各个表执行 vacuum 操作。
当您执行删除时,这些行被标记为删除,而不是移除。Amazon Redshift 根据数据库表中已删除行的数目,在后台自动运行 VACUUM DELETE 操作。Amazon Redshift 安排 VACUUM DELETE 在负载减少期间运行,并在高负载期间暂停运行。
对于带排序键的表,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 命令时包含表名称和 TO threshold PERCENT 参数。
Vacuum 类型
您可以运行完全 vacuum、仅删除 vacuum、仅排序 vacuum,或用完全 vacuum 重建索引。
-
VACUUM FULL
VACUUM FULL 对行重新排序并从删除的行回收空间。Amazon Redshift 在后台自动执行 VACUUM DELETE ONLY 操作,对于大多数应用程序,VACUUM FULL 和 VACUUM SORT ONLY 是等效的。VACUUM FULL 与 VACUUM 等效。完全 vacuum 是默认的 vacuum 操作。
-
VACUUM DELETE ONLY
DELETE ONLY vacuum 与完全 vacuum 相同,只不过前者会跳过排序操作。Amazon Redshift 在后台自动执行 DELETE ONLY vacuum,因此,您很少需要运行 DELETE ONLY vacuum。
-
VACUUM SORT ONLY
SORT ONLY 不回收磁盘空间。在大多数情况下,与完全 vacuum 相比,几乎没有什么好处。
-
VACUUM REINDEX
对使用交错排序键的表使用 VACUUM REINDEX。
最初使用 COPY 或 CREATE TABLE AS 加载空交错表时,Amazon Redshift 自动构建交错索引。如果您最初使用 INSERT 加载交错表,则需要在之后运行 VACUUM REINDEX 以初始化交错索引。
REINDEX 重新分析表的排序键列中的值分配,然后执行完全 VACUUM 操作。VACUUM REINDEX 花费的时间比 VACUUM FULL 长得多,因为它需要对数据执行额外的分析过程,而且合并新的交错数据可能需要接触所有数据块。
如果 VACUUM REINDEX 操作在完成前终止,则下一个 VACUUM 将恢复重建索引操作,然后执行 vacuum 操作。