批量插入的预处理语句的执行计划和执行计划缓存

这对你这个版本,跑批的相关的session,建议:
1、tidb_prepared_plan_cache_size按照默认值100设置即可。
2、确保该session跑批时候的语句种类不超过tidb_prepared_plan_cache_size,最好不超过10个,这样让这种insert into values很多行的情况可以常驻plancache,一定要注意不要和其它非批次业务混合跑,避免其它非批次语句执行过于频繁导致批次大语句被刷出plancache触发GC问题。
3、控制跑批语句的session是单独的连接(不要和正常的业务放在一个连接池,或者放在一起也不要释放连接,不然可能会污染其它连接,导致所有连接都缓存这个“大语句”的执行计划导致整体内存占用过多)
4、确保insert语句用的是statement=“insert into xx values (?,?,?..)” 绑定变量形式,可以使用plancache。

其实对于你的问题“批量插入500行一组,因参数过多导致执行计划缓存巨大频繁导致tidb oom” ,导致tidb oom的会有两个方面原因:
1、SQL文本确实太大了,多个连接都缓存了这个语句的执行计划,导致整体内存过大。
2、该大语句频繁的被淘汰出plancache,导致后台golang的GC压力过大,可能GC不及时导致占用内存过大最终OOM。

1 个赞