GBase 8a集群删除数据后释放磁盘空间shrink space

背景

gbase 8a 集群在delete一些行后,是不释放其占用的磁盘空间的,只是在这些行打上了一个【已删除】的标记。 其空间也不会被后续新加入的数据重复使用。

原因是8a是列存,每65536行做成一个DataCell单元,并对其做了压缩后,集中保存。

如果每删除一行就释放空间,那么所有的数据都要重新计算一遍,来避免空间浪费,其成本是很大的。

而如果复用,不仅不能确保新数据压缩后,一定不会超过原来占用的磁盘大小,而且由于delete数据不连续,也会造成大量的随机读写,影响性能。

解决方案

1、alter table TTT shrink space

释放掉连续删除的数据文件的空间。请注意,8a集群按列存储,如果某个列的数据超过了2G(压缩后), 则新建一个文件,并增加一个数字的后缀。 如果要删除,必须这个文件里的所有行,都处于【被删除】状态。 否则即使这2G文件里,即使只有1行非删除,将不能删除文件来释放空间。

批量删除文件可以快速的释放空间,对于每日有大量数据入库和删除的,可以逐渐接近空间占用平衡。

2、alter table TTT shrink space full

如果你非常在意磁盘空间,或者由于某些原因,无法实现2G的数据文件里全部处于【被删除】状态,比如频繁更新的表,有些数据可能很长的时间不会被更新。

这个full参数,是让数据库完全重建这个表,回收所有的空间。副作用是耗时很长,基本可以理解为新建一个表,然后把数据insert select过去。

3、使用天表或者天分区

然后按照整天或者整个分区的drop掉就可以了。 前提是你的数据有比较强的时间关联性。

总结

对于大量时间相关的数据,建议考虑天表或天分区,快速释放空间。

对于频繁更新的表,建议定期,比如每周(需要根据性能下降情况以及磁盘使用情况评估),执行一次shrink space full

其它的,可以定期执行shrink space释放整片的空间,然后再更长的一个时间周期,执行shrink space full。

备注:

默认update操作,底层实际做的是Delete + Insert。

发表评论

您的电子邮箱地址不会被公开。