在生產系統里,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 的底氣。




