近日,上海交通大学软件学院副院长王肇国和高斯实验室GaussDB数据库优化器专家Ethan联手开展了一场以《智能优化揭秘——GaussDB数据库查询重写的自动挖掘与生成》为主题的技术对谈,深入探讨了WeTune 2.0的重写规则与GaussDB的合作落地。直播过程包含对WeTune 2.0的项目背景、WeTune改写规则的自动发掘方式及实现、WeTune 2.0版本优势、在GaussDB中的应用与技术转化、未来前景等内容的解析与分享,一起倾听他们产教融合背后的故事吧。以下是本访谈的文字记录。
查询改写是数据库SQL优化过程中非常重要的部分,在语义不变的情况下,它可以把一条普通的或者性能不好的SQL语句优化成一条性能更好的SQL语句,实现查询效率的提升。改写规则作为查询改写中最关键的一个组件,想要在数据库里面添加改写规则,往往依赖于数据库专家经验的积累。如今,SQL语句的生成对象不再受限于程序员,外部框架和大模型也能够自动生成,随着生成源的增加,原来的SQL改写规则不再适用。
由上海交通大学软件学院副院长王肇国团队开发出的WeTune刚好能解决这一问题,其核心思想就是自动发掘某些场景下的改写规则。于是,华为云数据库GaussDB团队与王肇国教授团队深度合作,成功完成WeTune 2.0在GaussDB产品上的落地。
自动挖掘的前提是暴力枚举,枚举之后检验语义是否正确,通过等价性验证去把最后一道关,所以,WeTune的等价性验证能力决定了它能够枚举哪些规则。下面是WeTune的改写规则的自动发掘方式:
方式一,尝试暴力枚举所有在语法上合法的改写规则;
方式二,用形式化验证的方式去验证枚举的规则是否正确(输入、输出的SQL是否在语义上等价);
方式三,借鉴数据库cost estimation技术检验改写规则是否有效,SQL优化性能是否更好。
在实际运用中,以上改写规则的三种自动发掘方式也面临着一些现实层面的挑战。
暴力枚举虽然空间大,但开销也大,导致很多算力浪费。不过,上海交通大学软件学院副院长王肇国团队通过开发的一种只枚举小规则的技术,用小规则去推大规则,解决算力浪费的问题。
等价性验证。改写规则等价性验证,本质上就是SQL等价性验证,把不可判定问题的验证转换成可满足性等价、可判定问题的验证。另外,SQL等价性本身是一个关系型代数,把它转换成线性代数的求解。通过这两个维度解决了现有的SQL等价性验证问题,使得改写规则的枚举能力和范围大大提升。目前WeTune 2.0支持SQL:1999所有语法的验证。
除了借鉴数据库cost estimation技术来检验SQL优化性能是否更好以外,还会创建数据库实例,将改写规则在数据库实例上运行,以保证SQL优化效果最佳。
有了这三方面的解决方案之后,2022年,上海交通大学软件学院副院长王肇国团队对WeTune 1.0版本进行了一个性能测试。他们从GitHub上通过对起始时间、受欢迎程度等维度进行筛选排序,找了涵盖电商、论坛等不同应用场景的20个开源应用,并在这些应用上运行程序,共收集了大概8500多条SQL语句。结果显示,WeTune 1.0优化的SQL语句大概674条,而其他商业数据库只能优化427条。相较而言,WeTune 1.0 优化效果大幅领先。
WeTune 2.0在SQL等价性验证、枚举的能力和范围、规则的表达上都进行了精心设计,对GaussDB使用体验有极大提升。
第一,WeTune有验证规则的能力。对于开发流程来讲,验证规则是很重要的一步。
第二,WeTune有自动发现规则的能力。重写规则依赖人工、偏场景化会导致发现规则比较缓慢。WeTune可以帮助做优化,提高发现规则的效率。
第三,WeTune有自动枚举的能力。等价验证加上自动枚举,自动挖掘一次能够发现成千上万条规则,相当于把查询重写整个模块开发流程做了一个加速。对于一个商业的数据库来讲, WeTune自动挖掘可以减少开发人员冗余的规则添加,提高开发效率,降低人力成本。
第四,WeTune定义新的查询重写语言。WeTune应用在GaussDB数据库里,进行查询重写规则扩充的时候,其实定义了一种新的查询重写的语言。以前要写很多行的代码,才能给一套规则注入到引擎里面。现在不用写代码,只需要两三行的语言描述,通过规则验证后,直接放在数据库引擎里面,完成一个规则的实现。对开发者来说,体验非常好,对验证流程和开发流程帮助极大。
相比WeTune 1.0版本,WeTune 2.0版本有几个比较大的优势:
第一,增强的WeTune枚举能力,包括枚举的速度和枚举更多的复杂规则;
第二,增强的WeTune验证能力,可以支持更多的SQL特性;
第三,可以让用户可读、可加载、甚至可以直接使用手写。
对比现有基于代码的查询引擎,WeTune 2.0不需要代码、不需要编译、不需要去发布版本,客户自己可以写改写规则,写完之后,通过GaussDB提早准备的接口,直接放到数据库里面就可以即时生效。GaussDB可以为用户提前预留好很多重写规则,后续如发现重写规则不够用,可自行增加,非常方便。
第四,改写规则可在客户端实现部署。WeTune目前主要部署在云端,后面改写规则也可以部署在客户端,进行自动加载,实现不同用户间互不干扰。
WeTune和现有数据库应用落地过程中,不同的架构会面临不同挑战。WeTune 2.0在华为云GaussDB的落地,从技术角度来讲,GaussDB数据库是System-R架构,它的重写规则是耦合在代码里面,增加或卸载一个规则需要改写查询引擎。把WeTune应用在System-R架构上面涉及到理论、技术、工程层面的一些问题。
不过,上海交通大学和华为的积极交流和深入探讨,也为彼此提供了不同的视角。
在数据库开发过程中,改写规则非常依赖人工经验。随着客户场景越来越多,很多规则已经超出了现有的承载能力。从产品开发流程层面上讲,想要在GaussDB里面添加一个新的重写规则,论证重写规则是否等价是非常困难的。但是有了WeTune以后,开发者只要按照形式化语言去描述重写规则,然后WeTune拿去做验证,证明该规则在约束下是等价的,就可以放心地将该重写规则添加到GaussDB中,节约验证时间,对GaussDB的开发等流程非常有帮助。
WeTune从框架上去解决了这两个重写规则是否等价的问题,这是WeTune非常突出的贡献点。对于客户来说,在使用GaussDB进行SQL优化时,只管放心用,优化交给GaussDB;对于开发者来说,只需要关心SQL语义,性能交给GaussDB。
GaussDB引入WeTune2.0以后,自然会产生非常多的规则,帮助用户优化SQL的同时,也引入了另外一个成本,即会产生了SQL优化代价。
从客户角度来讲,很多业务其实是相对比较固定的,而且上线之前也提前会做系统测试。若系统里面SQL优化度很高,那么就不必改写规则和暴力枚举,这样就可以降低优化成本。
在实际环境中,大家希望数据库有成千上万条的改写规则可以给用户去用,可以生成改写的SQL语句。但是,改写规则非常多的时候,会导致改写和规则匹配的时间非常长,导致资源的极大浪费,也会影响用户体验。那如何在性能上做加速呢?
目前来讲,主要通过两方面来去解决:
一方面是从通用的匹配算法入手。当改写规则非常多的时候,匹配算法能够帮助性能有数量级的提升;
另一方面,从应用的场景或从SQL产生的源头来进行分类。不同应用场景下、不同业务目的、不同的框架需要的改写规则不一样,WeTune 2.0可以对于不同场景和需求来去做定制化的规则探索。
WeTune是多个技术合起来形成了一个规则挖掘。从学术角度来讲,SQL等价性验证可以往数据库测试这个方向再迈一步。
在数据库测试过程中,对于SQL的优化引擎,可以使用差分测试。差分测试是一种很经典的数据库测试方式,验证重写规则可以使用,验证SQL优化引擎过程中也适用。WeTune等价性验证器可以去枚举语义等价但形式完全不同的两条SQL,这样可以确保在测试对比过程中,程序运行是不一样的路径,可以更高效或覆盖面更广地完成数据库引擎的测试任务。
WeTune不仅减轻了数据库开发者或者DBA的负担,目前在教育领域里有一定的应用,WeTune等价性验证帮助国内外很多高校助教批改学生的数据库作业,减轻数据库教育工作者的工作压力。
华为与高校的深度合作将持续推进,融合双方的技术优势和科研力量,共同探索数据库领域的前沿技术,培养更多高水平的数据库人才。未来,华为和上海交通大学研究团队将携手,共同突破数据库查询重写技术的瓶颈,通过持续的创新和优化,进一步提升GaussDB的查询性能和效率。我们期待更多的技术合作和探索,推动数据库技术向智能化、自动化方向发展,为广大企业和用户带来更多价值。
关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云