列存表多次插入后出现表膨胀
问题现象
列存表多次执行INSERT后,发现表膨胀。
原因分析
列存表数据按列存储,一列的每60000行存储为一个CU,同一列的CU连续存储在一个文件中,当该文件大于1GB时,切换到新文件中。CU文件数据不能更改只能追加写。对频繁进行删除和更新的列存表VACUUM后,由于列存表的CU无法更改,即使标识为可用的空间也是无法进行复用的(复用需要更改CU)。因此不建议在GaussDB(DWS)中对列存表频繁进行删除和更新 。
处理方法
建议开启列存表的delta表功能。
1
|
ALTER TABLE table_name SET (ENABLE_DELTA = ON); |
- 开启列存表的delta表功能,在导入单条或者小规模数据进入表中时,能够防止小CU的产生,所以开启delta表能够带来显著的性能提升,例如在3CN、6DN的集群上操作,每次导入100条数据,导入时间能减少25%,存储空间减少97%,所以在需要多次插入小批量数据前应该先开启delta表,等到确定接下来没有小批量数据导入了再关闭。
- delta表就是列存表附带的行存表,那么将数据插入delta表后将失去列存表的高压缩比等优势,正常情况下使用列存表的场景都是大批量数据导入,所以默认关闭delta表,如果开启delta表做大批量数据导入,反而会额外消耗更多时间和空间,同样在3CN、6DN的集群上操作,每次导入10000条数据时,开启delta表会比不开启时慢4倍,额外消耗10倍以上的空间。所以开启delta表需谨慎,根据实际业务需要来选择开启和关闭。