Redshift的设计是Blocks are immutable。当进行更新操作时,会写到新的block上面;当删除行时,记录并没有从磁盘上移除,只是做了个删除标记,被删除的行依然占用磁盘空间,当进行查询时依然会被扫描到。所以,这会造成磁盘空间的浪费和查询性能的降低。
Redshift可以在后台自动执行 VACUUM
操作,VACCUUM
命令可以恢复空间、重新进行table sort。
当系统空闲时,Redshift会自动在后台执行VACUUM
;而当系统负载过高时,会暂停操作。当表进行vacuum
操作时,用户依然可以进行查询操作。
最佳实践是尽可能频繁的进行VACUUM
操作,以提高查询性能。当系统负载不高(例如深夜时),或者维护窗口期,可以进行vacuum操作。
执行VACCUM的一些最佳实践:
svv_vacuum_progress
表,可以查看VACUUM的进度BOOST
模式,该模式下会给VACCUM命令分配更多的内存/磁盘资源,加快进度。但执行的时候会阻拦delete/update操作。在大表上进行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;