Analyze及Vaccum命令

Analyze命令

  • 当加载到空表时,COPY 命令默认会先执行ANALYZE命令来收集一些信息。

  • 如果使用 COPY 命令加载非空表,则在大多数情况下,不需要显式运行 ANALYZE 命令。

  • Redshift 会监控工作负载的变化并在后台自动更新统计数据。 为了最大限度地减少对系统性能的影响,自动分析(Analyze)会在工作负载较轻的时期运行。

如果您需要在加载后立即分析表,您仍然可以手动运行 ANALYZE 命令。

要对orders表运行 ANALYZE,执行以下命令:

ANALYZE orders;

image-20231119203623584

Vaccum命令

Vaccum Delete

当对表执行删除时,行会被标记为删除(软删除),但数据不会真的被删除。 执行更新时,现有行将被标记为删除(软删除),更新的行将作为新行插入。

Redshift 自动在后台运行 VACUUM DELETE 操作,以回收由 UPDATE 和 DELETE 操作标记为删除的行占用的磁盘空间,并压缩表以释放消耗的空间。 为了最大限度地减少对系统性能的影响,自动 VACUUM DELETE 在工作负载较轻时运行。

如果需要在大型删除操作后立即回收磁盘空间,例如在加载大量数据后,可以手动运行 VACUUM DELETE 命令。


让我们看下 VACUUM DELETE 在删除操作后如何回收表空间。

首先,获取 ORDERS 的 tbl_rows(表中的总行数。该值包括标记为删除但尚未清理的行)和estimated_visible_rows(表中估计的可见行。该值不包括标记为删除的行) 。 运行:

select "table", size, tbl_rows, estimated_visible_rows
from SVV_TABLE_INFO
where "table" = 'orders';

image-20231119203954954

接下来,从 ORDERS 表中删除行。:

delete orders where o_orderdate between '1997-01-01' and '1998-01-01';

image-20231119204052044

接下来获取删除后的ORDERS 表的 tbl_rows 和estimated_visible_rows

select "table", size, tbl_rows, estimated_visible_rows
from SVV_TABLE_INFO
where "table" = 'orders';

image-20231119204357193

请注意,删除后 tbl_rows 值没有更改。 这是因为行被标记为软删除,但尚未运行VACUUM DELETE 来回收空间

现在我们来运行VACCUM DELETE命令:

vacuum delete only orders;

通过再次运行以下查询,并注意到 tbl_rows 值已更改,从而确认 VACUUM 命令回收了空间:

select "table", size, tbl_rows, estimated_visible_rows
from SVV_TABLE_INFO
where "table" = 'orders';

image-20231119204537624

Vaccum Sort

当在表上定义排序键(sort key)时,Redshift 会自动在后台对数据进行排序,以按照排序键的顺序维护表数据。

Redshift 会跟踪用户的查询,以确定表的哪些部分将受益于排序,并且它会自动运行 VACUUM SORT 来维护排序键顺序。 为了最大限度地减少对系统性能的影响,自动 VACUUM SORT 在工作负载较轻的时期运行。

COPY 命令自动按排序键顺序对数据进行排序和加载。 因此,如果您使用 COPY 命令加载空表,则数据已经按排序键顺序排列。 如果使用 COPY 命令加载非空表,则可以通过按排序键顺序加载数据来优化加载,因为当加载已经按排序键顺序时,将不需要 VACUUM SORT

例如,orderdate 是订单表上的排序键。 如果后面会持续将数据加载到订单表中,其中 orderdate 是当前日期,由于当前日期是向前递增的,因此数据将始终以增量 sortkey(orderdate) 顺序加载。 因此,在这种情况下,订单表将不需要 VACUUM SORT。

如果需要运行 VACUUM SORT,仍然可以手动运行它:

vacuum sort only orders;

Vaccum recluster

尽可能使用 VACUUM recluster 进行手动 VACUUM 操作。 这对于频繁摄取和仅访问最新数据的查询的大型对象尤其重要。

Vacuum recluster 仅对表中未排序的部分进行排序,因此运行速度更快。 表中已排序的部分保持不变。 此命令不会将新排序的数据与已排序的区域合并。 它也不会回收所有标记为删除的空间。

例如:

vacuum recluster orders;

Vaccum Boost

Boost 使用可用的额外计算资源运行 VACUUM 命令。 使用 BOOST 选项,VACUUM 在一个窗口中运行,并在 VACUUM 操作期间阻止并发删除和更新

请注意,使用 BOOST 选项运行 Vacuum 会争用系统资源,这可能会影响其他查询的性能。 因此,建议在系统负载较轻时(例如在维护操作期间)运行 VACUUM BOOST

例如:

vacuum recluster orders boost;