TIDB大事物 Insert

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:4.0.0
  • 【问题描述】:执行一个大事物insert时,报Out Of Memory Quota错误;

SQL语句: insert into b select … from a group by …
其中a表有800W左右数据;
select语句可以单独查询出来,数量400W左右,插入时会报Out Of Memory Quota错误;

参数设置:

tidb:
mem-quota-query: 34359738368
oom-action: cancel
performance.txn-total-size-limit: 10737418240

尝试过使用
set @@session.tidb_batch_insert=1;

set @@session.tidb_dml_batch_size=2000;

还是有类似的问题,请教下老师类似的大事物insert 有什么解决的方法;

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. 大事务目前的上限就是 10g, 确认下参数修改已经成功
  2. 能否麻烦查看下 tidb.log 和 slow log 中是否有 OOM 的记录信息,麻烦上传下,多谢。
  3. set 这两个变量不用在尝试了,不生效,不建议使用此方法
  4. 如果这个 sql 确认超过 10g 内存,是否这个表 a 有主键可以分批插入? 用 where 条件限制一下。
  1. 参数改成功了
  2. 没有看到oom相关信息,看到的是语句执行失败的log
    tidb log:
[2020/08/31 09:00:19.396 +08:00] [ERROR] [adapter.go:295] ["execute sql panic"] [conn=447] [sql="INSERT INTO CRM_Tag.UserTag_1_Tmp(UserId,SelectValue) \r\
select ...

slow log:

# Time: 2020-08-31T09:30:36.381308762+08:00
# Txn_start_ts: 419125411462250497
# User: root@
# Conn_ID: 447
# Query_time: 27.88141429
# Parse_time: 0.000254554
# Compile_time: 0.000481802
# Cop_time: 0.30591123 Process_time: 0.253 Wait_time: 1.062 Request_count: 35 Total_keys: 8578145 Process_keys: 8569717
# DB: CRM_Tag
# Is_internal: false
# Digest: f7dbf8f202e26239e8f4676b8f84fa991174c4324824cf2a772a2f6f42635b8f
# Stats: OrderInfos:419125421672759307
# Num_cop_tasks: 35
# Cop_proc_avg: 0.007228571 Cop_proc_p90: 0.009 Cop_proc_max: 0.015 Cop_proc_addr: 
# Cop_wait_avg: 0.030342857 Cop_wait_p90: 0.066 Cop_wait_max: 0.148 Cop_wait_addr: 
# Mem_max: 34414563250
# Prepared: false
# Plan_from_cache: false
# Has_more_results: false
# Succ: false
# Plan: tidb_decode_plan('gwagMAkzXzgJMAkxODI3NjgwLjM4MTc3MjcxNjMJb3JkZXJjdXJyZW50Lm8BDfBAaW5mb3MudXNlcmlkLCBjYXN0KGRpdihDb2x1bW4jNDYsIDI0LjApLCBkZWNpbWFsKDEwLDIpIEJJTkFSWSktPkMNKRw3CjEJNl8xMVZ4ACBncm91cCBieToNWDA1MiwgZnVuY3M6YXZnEW0ENTAdUAA2ESEcZmlyc3Ryb3cVJgwxKS0+dsgAcAoyCTNfMTYJMAk0NjA2NjE0LjkzNjY5NzkxMTUJBeMNhwQ0NRnYDDY1LDRG2AAMNTAsIHZtAH4gAAQKMwGNADJWjQB+WwBEdGltZXN0YW1wZGlmZihIT1VSZm8AFHBpY2t1cAEyZiQAGGRyb3BvZmYBJT1sIDUKNAkzMV8xNValAGRkYXRhOlNlbGVjdGlvbl8xNAo1CTFfMTQJMU5gAQhlcShe1gAoaXNkZWxldGVkLCBBUgRuZWIqAKBzdGF0dXMsIDUpCjYJMTBfMTMJMQk4NTY0Mzk3CXRhYmxlOk9yZGVySUG+SCwga2VlcCBvcmRlcjpmYWxzZQo=')
# Plan_digest: a59f1e0b78679df712c92d95435f654d0e8a38c91d7280aae7f3a242a4c90fa8
INSERT INTO CRM_Tag.UserTag_1_Tmp(UserId,SelectValue)   select UserId,cast(AVG(DiffDate)/24.0 as DECIMAL(10,2)) AS SelectValue   from
... as o GROUP BY o.UserId;
  1. 通过dashboard看这个语句最大内存占用是32G,后来通过select into outfile 的方式导出文件,数据文件大概30M大小(200W行)左右

想请教下:

  1. 目前txn-total-size-limit设置为10G的情况下,单台tikv的内存是否需要达到60G才行呢,还是整个集群内存剩余60G就ok?(实际的单个事务大小限制还取决于服务器剩余可用内存大小,执行事务时 TiDB 进程的内存消耗大约是事务大小 6 倍以上);
  2. 上述insert into select …是在什么地方有问题呢?( 单个大事务大小限制or内存不足or其他?)
1 个赞

大事务当前的上限是 10G , 这个内存已经 32G 了.

看报错是被 mem-quota-query 这一项限制往的

这个看着像执行中崩溃了,有可能是被 mem-quota-query 限制住的
即然要执行大事务,可以把各项限制都打开;至于实际是否内存扛得往,可以试一下然后观察内存使用量