大批量插入数据报单条sql内存不足错误的建议

【 TiDB 使用环境】测试
【 TiDB 版本】7.1.1
tidb复制表,即往新表里插入较大批量数据时,报单条sql内存不足错误,我的建议如下:
1、tidb为什么不学mysql或oracle,采用临时文件,一定要全部在内存完成吗,报这种错误很不优化
2、有参数控制吗,单条sql内存使用多少内存就写临时文件,这样用户体验好,这点感觉mysql、oracle等做的不错,建议tidb学习一下


你可以试试用batch语句来拆分dml语句
https://docs.pingcap.com/zh/tidb/stable/sql-statement-batch#batch

1 个赞

这个参数控制的
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_mem_quota_query

支持下,tidb这里确实应该用临时文件,batch什么的不太好用,最好也支持create table as select
用oracle这点数据根本不会oom

3 个赞

分布式和单体数据库不一样 tidb相当于一个收集器数据收集完了再output 慢慢来 如果是优化提给表妹即可

这个参数只是扩大单sql使用的内存,不是单条sql使用了这么多内存后就开始写临时文件

这个不是写临时文件的

连接到那个tidb节点,就临时存在在那个节点,等语句完成,删除临时文件,或类似oracle undo表空间一样,循环使用也行

可以在这个板块提建议,毕竟临时表都实现了,这里应该会有更好的解决方案~

1 个赞

tidb_enable_tmp_storage_on_oom,用这个

支持,才600多万数据就报这种错误。

1、tidb为什么不学mysql或oracle,采用临时文件,一定要全部在内存完成吗,报这种错误很不优化
临时文件也有坏处的,一个效率差,二个如果出现异常恢复的时候比较慢;用临时文件会避免报错,但是性能很多人接收不了,当然tidb也支持用临时文件,需要你来调整参数控制。
2、有参数控制吗,单条sql内存使用多少内存就写临时文件,这样用户体验好,这点感觉mysql、oracle等做的不错,建议tidb学习一下
tidb_mem_quota_query用来设置sql最多用多少内存,tidb_enable_tmp_storage_on_oom这个参数用来设置查过内存是否使用临时文件

将查询t_dch_patient_card表的语句添加条件,让t_dch_patient_card表经过多次完成导入
同时使用系统变量tidb_mem_quota_query来配置一条SQL执行过程中的内存使用阈值
https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage#如何配置一条-sql-执行过程中的内存使用阈值

mysql或oracle有临时表空间和undo,tidb可以考虑下

底层存储逻辑不同,一个是BTREE单机 一个是LSM分布式,先考虑底层适合什么在谈上层redo undo吧。鱼和熊掌不可兼得

临时表空间的话,实际就是在磁盘上开辟一个磁盘文件,用来干内存的活,好处是不太会报错,坏处是用了效率变差,tidb现在也支持这种模式
undo的话,mysql和oracle都是将修改的数据放到一个单独开辟的undo磁盘文件,其他会话查询的时候直接查这个,而tidb本身是通过mvcc的方式进行,修改的数据就放在数据文件中,其他会话直接查即可。

tidb_enable_tmp_storage_on_oom 参数仅支持部分算子使用临时磁盘,并非所有操作都支持