通過 TiDB Hackathon 重新認識了自己的潛力。當你想做一件事情,你會發現自己特別專注在上面,然后一些你覺得不會成功、不可能的事情也會變得可能。
——TiVP 團隊
在剛剛結束的 TiDB Hackathon 2021 賽事中,TiVP 賽隊的作品 TiDB Visual Plan 實現了 SQL 執行計劃的可視化,有利于快速定位及解決執行計劃相關的各類問題。由于項目的實用性和從用戶角度出發(無論是外部 TiDB 用戶,還是 PingCAP 內部研發工程師),摘得了 “三等獎” 和 “用戶之選獎”。
項目非常聚焦,有效提升了執行計劃的可讀性,具備一定的索引推薦能力。
——評委馮光普
當我終于看到可視化的執行計劃時,我幾乎流下了激動的淚水。畢竟我們之前診斷慢 SQL 實在是太苦了,那么一大屏的執行計劃,幾乎叫做沒法看,而且如果要對比兩個執行計劃的異同,就更崩潰了。有了可視化,至少分析到底哪里慢的效率會提升很多。
——PingCAP 研發副總裁唐劉
為什么做這個項目?
TiVP 是一支由 PingCAP 員工和社區小伙伴臨時組成的隊伍。在 PingCAP 入職不到半年的 Yves 看到 Hackathon 的宣傳,抱著體驗下的心態報了個名。作為產研消防隊的一員,Yves 在日常工作中會經常看客戶執行計劃方面的問題,最開始他只有一個樸素的想法:TiDB SQL 調優的需求很大,客戶申請的原廠支持里,與執行計劃(Plan)相關的問題就過半;SQL 作為一種聲明性語言,觀察執行計劃是排查執行效率的唯一手段,慢 SQL Explain 出來的執行計劃異常復雜難懂影響分析效率。在強調軟件“可觀測性”的今天,能不能做 SQL 執行計劃的可視化?
于是他私底下找到身邊優化器大佬 Chrysan 聊這個想法,沒想到剛聊兩分鐘就一拍即合,然后大佬拉來了 QA Tammyxia,于是陣容突然就龐大了。但是仨人都是做數據庫后端的,可視化可視化,沒有前端可不行。抱著試試看的心態,Yves 就在 AskTug 上發了個隊友招募貼。

TiDB 開源生態強大的感召力,讓第二天就有好幾位小伙伴找 Yves 交換了聯系方式,其中 92hacker(陳元,在深圳的一個前端開發大牛,盡管其工作內容與數據庫不強相關,但一直關注 PingCAP 公眾號,了解 TiDB 進展) 與他進行了第一次友好深入的交流,于是隊伍就這么拉出來了。
團隊的名稱 TiVP 是 TiDB Visual Plan 的縮寫,大家覺得 VP 也很霸氣,且 PingCAP 有許多以 Ti 打頭的工具,于是團隊就一致通過了這個隊名。組完隊后距離提交 RFC 還有一段時間,團隊瀏覽了 Hackathon 2020 的獲獎項目,還跟往屆選手做了經驗交流,正如 TiVP 團隊所言,dream big、冠軍心,這次首次參賽就獲獎,一個原因就是目標定得高。
項目解決了什么問題?
TiDB Visual Plan,通過收集 TiDB 數據庫側 SQL 的執行計劃和運行時信息,基于開源組件 dalibo/pev2 開發了一個顯示界面用于圖像化呈現 SQL 的執行計劃,對龐雜數據庫輸出的信息做分類梳理,幫助技術人員更便捷地了解、分析 SQL 語句及其執行邏輯,并可對問題關鍵高亮提示,從而快速定位以及解決執行計劃相關的各類問題,如慢 SQL 優化、執行計劃選錯等。

如下圖所示,TiDB Visual Plan 會將左側執行的 SQL 語句,進行 JSON 轉換和相應算子的統計,并以樹形的結構清晰展示執行計劃。每個算子點擊展開后,會顯示其具體的耗時、條數及所使用的資源。算子右上角還會用各類圖標對一些問題進行提示,如耗時比較長、資源消耗比較高、執行計劃預估和實際執行條數出現較大偏差等,通過這些提示,DBA 就能很方便地定位問題模塊進行細節排查。

針對復雜的 SQL 執行計劃,TiDB Visual Plan 還將提供 Advisor 功能,通過 Hint 提示(如下圖的 use_index)和后臺計算,對比優化前后的變動情況,并可通過 “Apply” 一鍵應用優化,實現智能輔助調優【注:該功能為藍圖規劃,本次 Hackathon 僅演示交互流程】。

此外,TiDB Visual Plan 還可通過耗時分析、代價分析等不同維度對 SQL 執行計劃進行可視化,提供樹形圖和經典橫向擴展模式,總之你想要的,這里都有。

比賽中的挑戰與趣事
TiVP 團隊的 4 名成員都是首次參加 TiDB Hackathon,作為混編隊伍,整個參賽過程充滿了挑戰與歡樂。如 92hacker 談到的,非常榮幸通過社區找到三個 P 社小伙伴,讓他對 PingCAP 的整個印象更好了,決賽前就想不論 TiDB Visual Plan 這個項目能不能拿獎,在比賽后都會盡力把它給融入到 TiDB 的 Dashboard 里面,把技術遷移的事情做完。
挑戰
TiDB Dashboard 是 TiDB 自 4.0 版本起提供的圖形化界面,用于監控及診斷 TiDB 集群。團隊剛開始想把 TiDB Visual Plan 的可視化融入到 Dashboard 里面,但在前端選型后,發現一個很大的問題,就是兩個技術棧是不兼容的,整個遷移的成本會非常大。由于團隊成員日常工作就很忙,當時留給前端開發這邊的時間大概只有一兩天,但如果遷移至少得一個星期才能完成。最后團隊就討論決定與其把工作重心放在融入到 Dashboard 上,還不如換個方向,對執行計劃的可視化本身進行優化,比如跑最復雜的測試 SQL、集成 index recommendation 等。從最后的結果來看,當時做這樣一個決策還是相當成功的。
趣事
初賽的時候,Demo 演示的那段視頻只有隊長 Yves 能聽得到聲音,其他人都聽不到聲音,而團隊成員還非常淡定地坐在那里沒有打斷(答辯時 Yves 戴著降噪耳機,答辯完之后沒拔耳機就信心滿滿地給評委放 demo 視頻直到結束——如下圖),以至于讓線上的評委們看了一段無聲版的 Demo(遠在深圳的 92hacker 還以為這個視頻本來就是無聲的),但其實視頻是有精心準備的語音講解。不過沒有講解大家也能看懂,也驗證了團隊的產品哲學,大道至簡。

未來工作展望
除了獲得三等獎,對于被評為 “用戶之選” 獎,TiVP 團隊覺得非常意外。在做這個項目的時候,團隊并不是從一個很大的 scope 著手,而是發現了目前執行計劃存在的痛點。在解決執行計劃可視化的同時,又發現有很多可以改進的地方,包括易用性、交互性,以及未來的一些智能化等。整個項目的思路就是從用戶的角度去想問題,切中用戶的痛點,團隊猜測也許這是打動 TiDB 用戶代表評委的一個重要原因。
盡管 Hackathon 2021 比賽已經落幕,但 TiVP 團隊還在為 TiDB Visual Plan 的技術棧遷移到 Dashboard 而持續努力,推動 TiDB 盡快融入這個新功能,讓 DBA 從滿屏密密麻麻的執行計劃代碼中得到解放。
目前 TiDB Visual Plan 主要是做執行計劃的可視化,未來不僅希望進一步提升內核的可診斷性:如優化器優化流程的可視化;還希望能在深度和廣度兼容上做更多的探索:譬如賦予優化器以 whatif 的思考能力,提供給用戶一鍵調優的極佳體驗;再譬如通過定義接口協議,把 SQL 調優工具從 TiDB 拓展到 MySQL、PostgreSQL、Oracle 以及 SQL Server 等,做成一個更加通用的云服務版本。正如 TiVP 團隊的宣言 “把復雜交給我們,把簡單還給你”,云化后兼具易用性、擴展性和智能化的 SQL 執行計劃可視化服務會是星辰大海。






