那条突然变慢的 SQL,到底经历了什么?

凌晨三点,运维群炸了。

一个跑了大半年、稳如老狗的查询,就在昨晚数据库例行重启之后,慢了整整 40 倍。

代码一行没改,数据量也没暴涨,可它就是慢了。有人怀疑是缓存,有人怀疑是网络,折腾到天亮,真相才浮出水面------

执行计划,变了。

优化器在重启后重新"思考"了一遍,然后挑了一条看起来更聪明、实际上更慢的路。而这一切,没有任何日志、没有任何告警,它就那么悄无声息地发生了。

一个防不胜防的"无声杀手"

这种现象,业内叫执行计划漂移

它是数据库世界里最难缠的性能问题之一:不报错、不告警,你永远不知道它什么时候来,也不知道它动了哪条 SQL。等到业务报警、CPU 飙红,往往已经错过了最佳排查时机,只能靠经验一条条 SQL 去猜。

说白了,过去我们面对执行计划退化,手里缺了四样东西:

  • 升级/重启后计划漂移了,看不见
  • SQL 计划变了,却定位不到是哪条、变成了啥样
  • 同一条 SQL 优化前后的效果,没法量化
  • 想拿历史计划做对比,根本没有数据

GreatSQL 8.4.4-5 决定,给这个"无声杀手"装上监控探头。

思路朴素,却直击要害

新特性「执行计划变更异常捕获」的做法说穿了很简单------对付这种突然变慢的SQL,GreatSQL 8.4.4-5的做法是给每条 SQL 的执行计划留一份"档案",然后定期查岗。

数据库运行时,它以 SQL Digest 为维度,持续把每条 SQL 当前走的执行路径记录成基线;到了重启后、或运行一段时间后,拿新旧两份"档案"一比对,哪条计划"变心"了、cost 变高了,立刻标记出来,连带对应的存疑 SQL 一起摆到你面

前。

从"事后靠猜",一步跨到"事前预警"。

两步启用,几乎零负担

它以插件形式工作,装个插件、开俩开关就能跑:

sql 复制代码
-- 安装插件
INSTALL PLUGIN plan_baseline SONAME 'libgreatdb_plan_baseline.so';

-- 开启采集
SET GLOBAL plan_baseline_enable_summary    = ON;
-- 开启持久化
SET GLOBAL plan_baseline_enable_persistent = ON;

之后,执行计划基线、历史计划、原始 SQL 信息会自动沉淀到专门的数据表里,配合内置的差分比对能力,同一条 SQL 前后的 cost 变化一目了然。

而最让人安心的,是它的工程设计------采集与查询解耦、内存缓存优先、异步落盘、查询无锁访问 。这套"监控探头"几乎不占用数据库干正事的主链路,高并发下照样稳。就算某条 SQL 采集时出了岔子,也只是被静静跳过,绝不拖累整体

真正做到了:抓 Bug,不添乱。

写在最后

如果说以前排查执行计划退化,靠的是"运气 + 经验 + 一身冷汗",那么现在,GreatSQL 给了你一双随时在线的眼睛

在性能问题爆发之前,就把那条"变心"的 SQL,抓个现行。

想了解更多细节,可查阅 GreatSQL 官方用户手册 8.4.4-5 版本

相关推荐
GreatSQL3 天前
从库复制又延迟了?GreatSQL 8.4.4-5 让并行回放"不再堵车"
greatsql
GreatSQL4 天前
大事务提交总是卡?GreatSQL 让 binlog "零拷贝"落盘,延迟直降七成
greatsql
GreatSQL8 天前
GreatSQL 8.4.4-5 GA(2026-06-30)
greatsql
GreatSQL17 天前
参数引发的复制中断:max_binlog_cache_size 导致 SQL 线程异常的复现与分析
greatsql
GreatSQL20 天前
openGauss 迁移到 GreatSQL:DataX 全流程实操指南
greatsql
GreatSQL22 天前
gt-checksum v4.0.0 新功能解读系列文章(6):权限预检与修复安全策略——先确认能看见,再决定怎么修
greatsql
GreatSQL23 天前
gt-checksum v4.0.0 新功能解读系列文章(5):DSN 密文保护——连接串密码不再明文裸奔
greatsql
GreatSQL1 个月前
gt-checksum v4.0.0 新功能解读系列文章(2):自定义数据类型映射——异构迁移不再手工对齐
greatsql