rewriteBatchedStatements参数导致无Queries Using Plan Cache OPS 命中

【 TiDB 使用环境】测试
【 TiDB 版本】
V6.1.2
【遇到的问题】
应用场景为批量删除数据,然后批量写入数据,使用的是Jdbc的batch处理
在TIDB上进行测试时,发现如果不使用rewriteBatchedStatements=true,写入速度很慢,但是监控中【Queries Using Plan Cache OPS】这一项,能命中缓存,【CPS By Type】这一项也是StmtExecute,基本无Query。

如果使用rewriteBatchedStatements=true,写入速度能提高很多,但是监控中【Queries Using Plan Cache OPS】这一项一直是0,无法命中缓存,【CPS By Type】这一项全是Query。

是因为重写的insert…values语句无法缓存么?

【现象更新】
我怀疑是批次太大,重写后的sql超出prepStmtCacheSqlLimit,导致无命中,将批次改小为10个sql一批,重跑后可以命中【Queries Using Plan Cache OPS】,但是我将批次改到100,无论prepStmtCacheSqlLimit设置多大,都无法命中【Queries Using Plan Cache OPS】。
是TIDB服务端对批量语句长度有限制么?

【测试2】
具体的jdbc 连接串是这样:
jdbc:mysql://11.139.35.194:4000/busiData?useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=1000&prepStmtCacheSqlLimit=2147483647&rewriteBatchedStatements=true&useConfigs=maxPerformance&allowMultiQueries=true
prepStmtCacheSqlLimit已经是 Integer.MAX_VALUE,还改到过更大的值20480000000000000000000,一样没有效果

数据库相关参数
tidb_prepared_plan_cache_size :100
tidb_ignore_prepared_cache_close_stmt :ON

又分别用batchSize=10和100跑了2次
这次测试场景是批量入库2张表的数据,一张表有56个字段,一张表有146个字段,猜测batch insert的语句会很大,但是不知道在哪能找到重写后的语句?
但是客户端并没有收到 max_allowed_packet 相关的报错,全部正常入库了
batchSize=10时,监控图:


batchSize=100时,监控图:

没有找到在TIDB-》Executor的监控中,没找到 Plan Cache Memory Usage的监控图
batchSize=100时,Memory Usage监控到内存升的很快

还可能是什么问题呢?该怎么排查呢?感谢帮助!

看了下参数,sql个数的限制有,MB长度级别的sql都支持,有见过10多兆的sql,可能支持到64MB。所以看下你的insert语句的长度。还有别的方式影响cache命中,可以参考下这里:
https://docs.pingcap.com/zh/tidb/v6.4/sql-prepared-plan-cache#prepared-plan-cache-的内存管理

sql长度限制参考:请问tidb 最大sql语句长度有没有限制? - #17,来自 疾风之狼

因为一个客户端 bug,批量更新时如果要配置 rewriteBatchedStatements = trueuseServerPrepStmts = true ,推荐同时配置 allowMultiQueries = true 参数来避免这个 bug。
https://docs.pingcap.com/zh/tidb/v6.4/java-app-best-practices#prepstmtcachesqllimit
建议同步修改下这个参数试一下。

感谢回复, allowMultiQueries这个参数已经设置为true了,具体jdbc连接串如下
jdbc:mysql://11.139.35.194:4000/busiData?useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=1000&prepStmtCacheSqlLimit=2147483647&rewriteBatchedStatements=true&useConfigs=maxPerformance&allowMultiQueries=true

感谢您的帮助,回复时贴图一直失败,又测试时的一些监控图放到了帖子正文了。

猜测batch insert的语句会很大,但是不知道在哪能找到jdbc重写后的批量语句?
怎么判断是否超出了plan cache的内存限制?
版本是6.1.2 监控中未找到 【Plan Cache Memory Usage】,应该是后续版本才有。


不知道是否可以在dashboard里面的sql语句里面可以找到语句分析或者topsql?

在【sql语句分析】里找到了原始的插入语句,如图



你好
batchSize=10 可以 cache,batchSize=100 cache 不到。
应该是 sql 太大了放不进去内存了,plan cache 给每个语句预留的内存很小,如果太大放不进去就不会走 plan cache。

感谢回答
有没有相关的参数可以设置这个值?

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。