暂无图片
openGauss列存中,行存delta表转列存后,原行存中每条entry的可见性如何处理?
我来答
分享
杨培瑜
2023-10-30
openGauss列存中,行存delta表转列存后,原行存中每条entry的可见性如何处理?

openGauss列存中,网上的文章都说openGauss的列存mvcc可见性是基于CUDesc这个行存表的,也就是说1个CU中所有行共用一个可见性,这在bulk_insert中我是可以理解的,因为是在一个事务中。

但是如果delta表开启(小数据插入走delta表),行存delta表转列存后,生成一条entry写入CUDesc中,那么原行存delta表中每条entry的可见性如何处理?是取delta表中最大或者最小的事务id或者tp点作为可见性依据?还是说这会生成一个特殊的CU,行存中每条entry的可见性会跟随这个CU一起下盘?

当然,这个问题不限于openGauss,hana/sql server/oracle的行列转换过程我都有同样的疑问,恳请懂关系型数据库 列存的大佬能聊聊一二,感谢!

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
sung

会以行存转列存这个事务的 txn1 的 id 作为生成的 cudesc 的事务id。 delta 表中对 txn1 可见的数据会出现在列存中,对 txn1 不可见的数据不会转到列存中。

暂无图片 评论
暂无图片 有用 2
暂无图片
杨培瑜
升级问题到: 紧急故障
暂无图片 评论
暂无图片 有用 5
sung

转列存成功的数据,会在同一个事务删除。如果有并发事务查询 delta 表的数据,可见性不会产生问题,因为被删除的历史版本还在。

暂无图片 评论
暂无图片 有用 1
杨培瑜
题主
2023-10-30
了解,所以openGauss的这种方法是全局只有一张delta表,行转列触发时把表中可见的数据转成列,插入CUDesc,并在delta表中删除转换的数据,最后一起commit对吧?感觉这样对delta表的vacuum挑战挺大的。
sung

但转到列存的数据,事务信息会有一定的缺失,最开始的delta表中的数据的写入事务信息会丢失。同一批转到列存的数据事务信息,会修改为行存转列存这个事务的信息,也就是这些数据仿佛是一个新事务写入的。

暂无图片 评论
暂无图片 有用 1
sung

delta表是每个列存表有一张(如果是分区表,每个列存分区一个delta表),而且有开关控制,默认开关是关闭的,也就是默认数据不插入delta表。列存设计应该是为数据分析准备,建议是大批量写入。但如果用户少量写入可能会造成存储空间浪费的问题(列存默认是8K对齐),应该是为了解决这个问题引入 delta表作为少量数据写入的缓存,然后可以等有一定数据量了再一批数据转成列存。列存本身是为OLAP设计,但是功能上需要兼容完整的SQL语法,同时还要兼顾性能和效率。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏