是什么影响了TiDB执行计划

【TiDB 使用环境】生产环境
【TiDB 版本】v6.5.2
【操作系统】CentOS7.9
【部署方式】虚拟机部署(Vmware)
【集群数据量】1.5TB
【集群节点数】3PD、2TiDB、3TiKV、2Tiflash
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
现象:应用程序发起的SQL执行非常慢,抓取的SQL在mysql客户端执行只需要2-3秒;cluster_processlist中应用发起的执行都需要1-2分钟。TIkv Coprocessor 执行耗时几十分钟;执行计划未使用bind;
使用的统计信息:
cmd_dept:pseudo,mid_incomecostdetails_report:pseudo,bms_way_address:pseudo,bms_receipt_review:pseudo,bms_receipt_review_detail:pseudo,tms_schedulingbill:pseudo,cmd_company:pseudo,tms_operationbill:pseudo,oms_way_legal:pseudo,oms_order_address:pseudo,oms_order_main:pseudo,tms_schedulingbill_detail:pseudo




应用发起执行计划TOP sql.txt (317.8 KB)
mysql客户端执行计划 正常.log (406.0 KB)

影响:SQL执行缓慢,占用大量系统资源,影响其他SQL执行
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面

【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

应用发起的sql的执行计划都是用的过期的统计信息。

而mysql客户端发起的并没有发现这些表的统计信息过期。统计信息更新了?

2 个赞

更新过了。使用analyze talbe 更新统计信息,应用新过来的查询仍然没有改变; SHOW STATS_HEALTHY 显示这些表健康度都是100 。

1 个赞

连接串上是不是设置了什么特别的参数?

mysql客户端连接和应用发起连接,没其他本质区别。
不应该导致看到统计信息都不一致。

1 个赞

看到pseudo关键字,先执行analyze table 提升表健康度。

1 个赞

连接参数:jdbc:mysql://172.16.89.80:4000/pro_warehouse?serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true
驱动程序:driver-class-name: com.mysql.cj.jdbc.Driver

令人费解,我试了一下也没法复现。

建议你能使用应用发起连接,使用保存现场信息的功能,提供一个错误的执行计划的执行现场信息,这个是可以方便复现的。

https://docs.pingcap.com/zh/tidb/stable/sql-plan-replayer/#使用-plan-replayer-保存和恢复集群现场信息

1 个赞

看看JDBC里的useServerPrepStmts这个默认值是什么,会不会是预编译导致的?

1 个赞

这个目前获取不了,需要改造应用程序代码。

1 个赞

连接到的 tidb-server 是一个节点么?可以考虑滚动重启下应用端,刷一次连接试试。

1 个赞

影响执行计划一般来说就是统计信息。统计信息有会随着索引数据量的变化而变。先确定是否有正确的索引,然后确定索引的统计信息是否正确。如果都正确,使用hit来处理

1 个赞

有正确的索引,而且统计信息准确。

hit呢

1 个赞

hint需要进行代码改写;当前代码改造受限。

因为当前统计信息是pseudo导致执行计划不优,建议先更新统计信息、优化绑定规则与索引设计,并排查网络及资源瓶颈。

1 个赞

手动收集SQL涉及的所有表统计信息,查询表健康度都是100;应用中的该SQL执行统计信息仍然是pseudo。
为啥执行SQL时使用的统计信息不准确呢?

有点奇怪看不出什么问题,在线蹲一下

1 个赞

如果在mysql客户端执行是正常的,说明数据库本身没有问题。可以往驱动方向思考,会不会是程序接收数据很慢?返回的数据多不多?可以记录一下从第一条返回,到接收结束一共花多长时间

1 个赞

返回几百条数据,不是网络带宽原因。应用程序执行时TIkv Coprocessor 执行耗时几十分钟。

问题解决了:调试了stats相关参数没有效果,今天重启了TiDB Server服务后,大批量应用查询统计信息为:pseudo的问题消失了。

1 个赞