VACUUM

为什么需要VACUUM

Redshift的设计是Blocks are immutable。当进行更新操作时,会写到新的block上面;当删除行时,记录并没有从磁盘上移除,只是做了个删除标记,被删除的行依然占用磁盘空间,当进行查询时依然会被扫描到。所以,这会造成磁盘空间的浪费和查询性能的降低。

Redshift可以在后台自动执行 VACUUM操作,VACCUUM命令可以恢复空间、重新进行table sort。

当系统空闲时,Redshift会自动在后台执行VACUUM;而当系统负载过高时,会暂停操作。当表进行vacuum操作时,用户依然可以进行查询操作。

最佳实践是尽可能频繁的进行VACUUM操作,以提高查询性能。当系统负载不高(例如深夜时),或者维护窗口期,可以进行vacuum操作。


执行VACCUM的一些最佳实践:

  • 查询svv_vacuum_progress表,可以查看VACUUM的进度
  • 推荐使用BOOST模式,该模式下会给VACCUM命令分配更多的内存/磁盘资源,加快进度。但执行的时候会阻拦delete/update操作。

Deep Copy

在大表上进行vaccum操作速度非常慢。当表大于700GB时,可以考虑使用deep copy:

deep copy示例:

create table partscopy(
 ps_partkey bigint not null,
  ps_suppkey integer not null,
  ps_availqty integer not null
) diststyle even;
insert into public.partscopy( select * from parts);
drop table parts;
alter table partscopy rename to parts;

第二种方式:

create table public.partscopy (like public.parts);
insert into public.partscopy (select * from parts);
drop table parts;
alter talbe partscopy rename to parts;