【 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监控到内存升的很快
还可能是什么问题呢?该怎么排查呢?感谢帮助!