业务通过 JDBC 执行查询会返回上万条数据,SQL 本身执行速度正常,但慢查询中 fetch and wait 等待耗时占比极大,客户端直连查询无明显异常,服务器资源负载正常,请问该调整哪些 TiDB 参数优化结果集拉取环节的性能?
fetch and wait 高 = TiDB 结果集回传流速跟不上 JDBC 拉取速度,只需调大 chunk 批次、流式并发、流水线队列、关闭服务端流控 四个方向,就能大幅降低结果集等待耗时。可以试试:
SET GLOBAL tidb_max_chunk_size = 512;
SET GLOBAL tidb_init_chunk_size = 128;
SET GLOBAL tidb_distsql_scan_concurrency = 32;
SET GLOBAL tidb_executor_concurrency = 8;
SET GLOBAL pipeline_queue_size = 512;
SET GLOBAL tidb_flow_control_enable = OFF;
该问题是服务端结果集回传速度跟不上客户端拉取速度,可通过调整参数优化:
调大 tidb_max_chunk_size、tidb_init_chunk_size 增大数据传输批次,
调高 tidb_distsql_scan_concurrency、tidb_executor_concurrency 提升并发,
加大 pipeline_queue_size 队列容量,
关闭 tidb_flow_control_enable 服务端流控,以此降低 fetch and wait 耗时。
性能瓶颈要从 TiDB 的架构分层来分析:TiDB Server 是计算层,TiKV 是存储层,PD 负责调度。建议先确认瓶颈在哪一层——TiKV 慢可能是 RocksDB 的 compaction 压力大,TiDB 慢可能是优化器选错执行计划。用 keyvisual 可以直观看到 Region 的热点分布。
统计信息过期导致执行计划不准,analyze table一下。
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。