在生产系统里,SQL 变慢从来不是"突然发生的"。
它只是到了一个节点,你终于看见它慢了。
大多数 DBA 真正的痛点,不在于不会看执行计划,而在于:
执行计划没问题,SQL 却就是慢。
Explain plan 很完美,索引齐全,逻辑正常,可用户体验就是不对。这种时候再反复 explain 只是在"安慰自己",它无法告诉你数据库当下到底在干什么。
10046 的价值就在这里,它给你的不是"理论路径",而是执行过程的完整现场记录。
10046 到底解决什么问题?
很多人把 10046 当成"高级版 explain plan",这是误解。
Explain plan 解决的是:
优化器打算怎么跑。
10046 解决的是:
数据库真正正在干什么。
它记录的不仅是路径,还有:
• 每一次物理读和逻辑读
• 每一个等待事件
• 每一次 parse / execute / fetch 的耗时
• 每一次绑定值的真实输入
• 执行过程是否被打断、等待、阻塞
这意味着什么?
意味着当你面对"偶发慢 SQL""线上抖动""某些用户卡顿",你不再靠猜。
你能看到:
• 这次慢是因为走了全表扫描?
• 还是磁盘响应慢?
• 是锁没放?
• 是 PGA 不够?
• 还是执行计划发生了翻转?
这些在 trace 里是实打实写出来的,不是推断。
一次标准的开启流程
执行顺序固定,不要省略:
alter session set timed_statistics = true;
alter session set statistics_level = all;
alter session set max_dump_file_size = unlimited;
alter session set events '10046 trace name context forever, level 12';
你执行 SQL。
跑完立刻关闭:
alter session set events '10046 trace name context off';
为什么必须 level 12?
因为:
• 不要只看 SQL
• 不要只看执行时间
• DBA 只需要最完整版本
tkprof:你真正该看的入口
原始 .trc 文件可读性很差,不建议直接翻。
直接格式化:
tkprof xxx.trc output.txt sys=no sort=exeela,fchela
Execution Plan:你唯一该信的那份
进入 output 文件,直接搜:
Execution Plan
你看到的不是 explain plan,不是 display_cursor。
而是:
SQL 实际走过的执行路径。
这是重要到值得强调的一点:
很多 SQL 的性能问题,本质就发生在------
"你以为它走 A,但它其实走了 B"。
最常见的翻车现场包括:
• 预期走索引,实际全表
• 希望 Nested Loop,结果 Hash Join
• 明明有复合索引,却拆开扫描
• 表数据量暴增但统计信息没更新
这些,你在 explain 阶段看不出来,
10046 会让你当场看到。
慢从哪来:不是只看 elapsed
你必须学会看这一段:
call count cpu elapsed disk query current
Parse
Execute
Fetch
这是诊断 SQL 的命根子。
经验判断:
• elapsed 远大于 CPU,说明不在算,在等
• disk/query 畸高,说明 IO 在拖后腿
• fetch 次数很少但时间很长,大概率锁或远程访问
• execute 阶段慢,意味着执行路径效率本身有问题
• parse 时间反复高,说明 SQL 没被复用
这一步的价值在于:
你不再纠结 SQL 写法,
而是明确瓶颈是算力问题、IO问题、锁问题、设计问题。
这是 DBA 和"调 SQL 工程师"的分水岭。
等待事件:数据库不会"无缘无故慢"
在 tkprof 中搜:
WAIT
你会看到这条 SQL 在执行期间:
到底:
• 在等 IO
• 在等 latch
• 在等 lock
• 在等 commit
• 在等 buffer
数据库的世界很简单:
不是在干活,
就是在等别人干完。
10046 唯一的意义就在于:
你知道它是在"干",还是在"等"。
Bind 值:谁在坑你,一目了然
Level 12 会把绑定变量打出来。
你真正能看到:
Bind#0: value=...
这意味着:
• 你能发现数据倾斜
• 能验证是否选错执行路径
• 能判断参数化是否合理
• 能确认是输入问题还是 SQL 设计问题
这一步,是 explain 做不到的。
什么时候才值得用 10046?
如果你满足这些情况之一:
• SQL 偶发慢
• 下载跑飞
• 锁查不清
• 同 SQL 不同表现
• 执行计划频繁抖动
• "有时快有时慢"
那你就不该再犹豫。
DBA 的底牌
10046 不是常规工具,它是:
DBA 手里的取证设备。
当别人说"数据库慢",
你没有感觉,没有猜测,只有图和证据。
这才是 DBA 的底气。