> 通过 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 执行计划可视化服务会是星辰大海。