# [KB]关于TiDB 处理 SQL点查慢的问题

## Description

一个点查 sql 执行慢，compile 时长大，查看慢 sql 详细信息后给的反馈信息是这样的：这条 SQL 不是 prepare 的。通过分析 sql 语句，认为可能是 golang runtime 的问题。

## Root Cause

经开发排查，检查 goroutine 发现有大约 1.7 万 goroutine 卡在 (\*slowQueryRetriever).parseSlowLog 上，heap profile 显示 parse slow log 占用了 95GB，于是判断是 goroutine 泄漏导致的内存泄漏。而接近十三万个 goroutine 使得 go runtime 的调度压力上升，从而出现 build plan 耗时 2.5 秒。 该问题在 v4.0.9 修复：[https://github.com/pingcap/tidb/pull/21496](https://github.com/pingcap/tidb/pull/21496) ，

## Diagnostic Steps

生产上有不少点查慢 sql，一直在产生，显示优化时长太长，这些sql手动执行很快。 排查步骤： 

1. 收集慢sql所在节点的tidb debug信息，命令：`curl http://{tidb-server-ip:status_port/debug/zip?seconds=60 --output tidb_debug.zip`

2. 通过监控查看各个节点的内存使用情况，发现慢sql所在tidb节点的内存使用率明显高于其他节点的内存使用率。 

3. 排查发现问题sql只在一个tidb-server节点产生。 

4. 应用连的是负载均衡地址。 

## Resolution

升级到未受影响版本

## Workaround

重启 TiDB 可以临时解决，但随着慢日志的查询越来越多，该问题可能会重新出现。需要定期清理 slow log 文件 。

## Affect Version

v4.0.0-v4.0.8