大数据量进行insert会挤爆内存吗?

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】3.2.1
【问题描述】现在遇到这样一个场景,有一个查询结果集A(600w数据)需要插入到B表中,运维担心多个这样的操作会把数据库内存挤爆,于是要求对结果集A需要进行分页, 5w数据进行一次commit,这样大大影响了运行效率。
【复现路径】问题出现前后相关操作
【问题现象及影响】
根据OceanBase官网给的架构图中,数据插入应该都会写入Mem Table中,异步合并后写入SSTable。我理解,多次commit,不仅不会减少内存占用,反而会增加事务数量。也不知道我理解的对不对,求大佬解答 :heart:
【附件】

如果转储速度跟不上导入速度,就容易报错 Over tenant memory limit.

2 个赞

会有转储,将内存中的落盘。转储速度跟不上,会出现写入失败,这个时候调整转储参数或者调大租户内存。或者两个都调整才可以

1 个赞

看你memtore的内存大小了,如果单台observer中的memstore内存很大,600w的数据也就占10%,可以一次性提交事务。建议批处理后,业务空闲期,手动合并一次。既可以更新统计信息,也可以增加缓存命中率

多次commit会增加事务数量,600w的数据根据列相关信息占用内存大小也不一样,插入期间观察内存使用情况,选择一个合适的提交数量

commit操作我理解应该不会触发转储吧,那多次commit和一次commit有什么区别呢?

OceanBase 导数工具文档中有介绍是怎么调优导入数据的,文档中有参数介绍:
https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000002037950

3.2以上的版本里ob已经能支持问题描述的大事务了, 具体行为也可以本地测试验证下

但是运维拆分小事务的建议从整体查询性能上看是一个更好的选择, 如果大量活跃事务数据写入同时中间发生转储的话, 查询性能会受到一定影响

如果不是强依赖事务语义的话, 从性能角度考虑, 还是可以拆分下事务