列存 Delta 表是个什么东东
本文分享自华为云社区《GaussDB(DWS) 列存delta表的简单介绍》,作者:上弦月。
Delta 表是什么
Delta 表就是列存表附带的行存表,如果创建列存表时开启了 delta 表(开启/关闭方式见下文),那么在某些情况下,插入该列存表的数据,也会以行存的方式保存。
Delta 表存在的意义
Delta 表是依附于列存表的,所以先简单的介绍下列存的基本原理:
在 GaussDB 中,列存表按列存储数据,每列默认 60000 行存储在一个 CU 中,CU 是列存表存储数据的最下单元,CU 生成后数据固定不可更改。
无论是向列存表中插入 1 条还是 60000 条数据,都只会生成一个 CU,在多次插入少量数据时,不能有效的利用列存压缩能力,导致数据膨胀影响查询的性能和磁盘使用率。
并且 CU 只能追加写。也就是说,后面对这个 CU 中的数据做更新或删除都不会真正更改这个 CU,删除是将老数据在字典中标记为作废,更新操作是标记老数据删除后,再写入一条新记录到新 CU,CU 不会有任何的 modify。
从这里我们可以看出,在对列存表进行多次更新/删除,或每次只插入很少量的数据后,会导致列存表空间膨胀,大量空间无法有效利用,这是因为列存表在设计上就是为了大批量数据导入以及海量数据按列存储/查询。
Delta 表正是为了解决这两个问题。在启用 delta 表后,单条或者小批量数据导入时,数据将进入 delta 表中,避免小 CU 的产生,delta 表的增删改查与行存表一致。开启 delta 表后,将显著提升列存表单条导入的性能。
如何开关 delta 表
Delta 表默认是关闭的,若需要开启 delta 表,可以创建列存表时指定 enable_delta 为 true。
当然表创建完之后也可以随时开关 delta 表:
开启 delta 表:ALTER TABLE table_name SET (enable_delta=TRUE);
关闭 delta 表:ALTER TABLE table_name SET (enable_delta=FALSE);
开启 delta 表后的性能提升
前文说到,开启 delta 表能够防止小 cu 的产生,所以在小规模数据导入时,开启 delta 表能够带来显著的性能提升,在 3CN,6DN 的集群上测试,每次导入 100 条数据,导入时间能减少 25%,存储空间减少 97%,所以在需要多次插入小批量数据前应该先开启 delta 表,等到确定接下来没有小批量数据导入了再关闭。
开启 delta 表的负面影响
Delta 表就是列存表附带的行存表,那么将数据插入 delta 表后将失去列存表的高压缩比等优势,正常情况下使用列存表的场景都是大批量数据导入,所以默认关闭 delta 表,如果开启 delta 表做大批量数据导入,反而会额外消耗更多时间和空间,同样在 3C6D 的集群上测试,每次导入 10000 条数据时,开启 delta 表会比不开启时慢 4 倍,额外消耗 10 倍以上的空间。所以开启 delta 表需谨慎,根据实际业务需要来选择开启和关闭。
将 delta 表的数据转移到主表存储
Delta 表解决了小批量插入的问题,但是在多次小批量插入后,delta 表也会变成一张大表,对此,需要用 deltaMerge 操作将数据从 delta 存储转移到列存储。
GaussDB 提供两种合并操作:自动的 auto-deltaMerge 和手动的 deltaMerge。auto-deltaMerge 会将默认 60000 行以上的数据合并到列存储,而手动 deltaMerge 会将全部数据从 Delta 存储合并至列存储。但手动 deltaMerge 依赖高级别的锁,需谨慎使用。
手动 deltaMerge 的语法:vacuum deltamerge tablename;
总结
本文从 delta 表的概念、来历、用法、开启后的影响,delta 表数据转移到主表几个方面做了详细的介绍。列存 Delta 表应用于行列混合存储,适合实时分析统计,解决了实时小批量数据入库引起的性能问题,定期合并到主表保证分析查询的性能。在实际使用时需要根据业务场景来评估是否需要开启 delta 表,否则不仅无法充分发挥 GaussDB 列存表的优势,反而会造成额外的空间和时间的浪费。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/79960d8f567fa32bbe78a6702】。文章转载请联系作者。
评论