版本升级问题

版本升级后单条 SQL 表现异常:DB 客户端直接执行耗时约 100ms,Java 应用调用耗时 10s~300s,升级前应用执行均在 300ms 内;服务器 CPU、内存、磁盘 IO 资源水位正常无瓶颈。SQL 执行耗时观测:慢 SQL 明细里pipeline_queue_wait、fetch and wait、min_local_stream、max_local_stream耗时显著偏高,执行计划逻辑无明显变动。

1 个赞

TiDB 8.5.6 升级后流式返回、LocalStream、Pipeline 调度机制变化,导致 JDBC 应用端出现严重的结果集拉取阻塞,表现为队列等待和网络取数耗时极高,与客户端直连形成巨大性能差异。

1 个赞

升级前建议先看 release notes,大版本之间有些参数默认值会变。另外生产环境升级建议先在一个 TiKV 节点灰度验证,观察一段时间没问题再全量升级。

  1. 关闭 8.5 新的 Pipeline 执行引擎(最关键)
    SET GLOBAL tidb_enable_pipelined_execution = OFF;
  2. 关闭 LocalStream 异步消费(解决 min/max_local_stream 等待)
    SET GLOBAL tidb_enable_local_stream_async_consume = OFF;
  3. 关闭 8.5 新 LocalStream 优化(官方已知问题开关)
    SET GLOBAL tidb_opt_fix_control = ‘59118:0’;
1 个赞

在新旧两个版本上运行相同的 SQL 语句,观察执行计划和性能差异。

1 个赞

TiDB 的兼容性跟执行计划的生成机制有关,同样的 SQL 在 MySQL 和 TiDB 上的优化器决策可能不同,特别是子查询和 JOIN 的处理方式。迁移前建议用 SQL Plan Management 做下 SQL 兼容性扫描。

1 个赞

DB 客户端直接执行耗时约 100ms,Java 应用调用耗时 10s~300s,升级前应用执行均在 300ms 内


DB客户端 和 Java 应用采用了不同的 JDBC 版本?是否有应用官方提供的版本?
最好能提供 DB 直连 和 JAVA 应用请求的详细 SQL 和执行计划数据进行对照

1 个赞

使用慢查询日志来找到执行时间长的 SQL 语句, 对有问题的 SQL 使用 EXPLAINEXPLAIN ANALYZE 来分析其执行计划

1 个赞

调大 TiDB 参数tidb_init_chunk_size,减少分片数据流次数。

需要把升级前后的版本发不出来。
检查执行路径是否正确。

开启set global tidb_enable_streaming = 1,调大tidb_max_chunk_size提升单批返回行数,减少网络往返等待。