一种提升SQL改写效率的方法

这篇具有很好参考价值的文章主要介绍了一种提升SQL改写效率的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自天翼云开发者社区《一种提升SQL改写效率的方法》,作者:唐****律

一、背景

SQL改写是数据库产品中使用比较频繁的一个技术,在大多数产品中的调用频率也非常高,通常对性能的需求需要接近对应数据库产品的上限。例如在天翼云关系型数据库中的Mysql语法兼容组件,其性能测试标准需要达到接近30万TPS,也意味着SQL改写环节的性能标准需要支持至少每秒30万次以上,否则会成为系统的性能瓶颈。

SQL改写的基础是抽象语法树,而抽象语法树则是由SQL字符串经过词法分析和语法分析之后得到的。词法分析器和语法分析器在市面上有非常多的种类可供挑选,例如Lexer、YACC、Antlr、Druid等,一般数据库产品都只在其基础上进行SQL改写,例如基于C语言开发的PG的分布式数据库插件Citus。对于一些Java语言开发的数据库产品,SQL解析的性能则会有所下降,有的数据库会在此基础上再进行优化,例如分布式数据库Mycat,则是在Druid的基础上再加入了一个SQL缓存,用以减轻SQL解析和改写的代价。但是这对于一些对于SQL改写需求特别大或者请求语句特别复杂的数据库产品来说还是不够的,例如在天翼云关系型数据库中的Mysql语法兼容组件中,SQL改写过程中需要进行元数据收集、类型推断、通配符分析、子查询和嵌套查询处理、别名分析和修正、类型适配、隐式类型转换、系统参数计算、以及近50条语法兼容规则,这样一来,每次进行SQL改写就是一个非常大的开销,因此需要对SQL改写环节进行性能优化。

对于此类问题,业界也有一些的解决方案,例如分布式数据库Mycat,它使用缓存对SQL改写进行性能优化,以SQL为key对抽象语法树进行缓存,减轻了部分SQL解析的负担,特点是缓存命中率低,性能提升有限,消耗内存大。

二、方案

本方案以提高解析能力为目标,从缓存方向出发,考虑如何提高缓存命中率,以减少不必要的性能消耗。结合应用在使用SQL的过程中的主体结构不轻易改变的特性,使用参数化SQL作为缓存key,处理过程中预先对SQL进行词法分析,分解为参数化SQL和参数列表,并以参数化SQL为key对抽象语法树进行缓存。如果缓存未命中,则对参数化SQL依次进行词法分析、语法分析、改写处理,最后在改写完毕之后,再结合先前记录的参数生成目标SQL,即完成完整的SQL改写过程。

这个方案减少了大部分的性能消耗,缓存命中率高,内存消耗小,大幅提升了性能,其核心逻辑是以额外的性能消耗极小的词法分析和参数化环节为代价,大幅缩短了性能消耗极高的抽象语法树改写过程。

需要注意的是,该方案的应用对改写环节提出了更高的要求,开发者需要预见参数在整个改写过程中的作用并进行正确的处理。举例来说,在分布式数据库中有一些SQL改写,需要依据过滤条件的值的hash值,来决定将哪些SQL分发到哪些数据节点,这个时候由于过滤条件的值已被参数化,所以SQL改写过程中就不能直接决定其需要分发的节点了,而是要改为在最后结合参数生成目标SQL的时候计算分发的节点。

三、优点

本方案提出一种提升SQL改写效率的方法,通过预先对SQL进行词法分析,分解为参数化SQL和参数列表,并以参数化SQL为key对抽象语法树进行缓存,然后进行抽象语法树改写,最后再结合参数列表生成目标SQL,大幅提升了缓存命中率和SQL改写效率。

经过相同环境下的测试对比,可知本方案在提高SQL改写效率方面产生了巨大的提升,并且由于测试样本较少,缓存命中率更高的方案显然会在实际应用场景中获得更大的优势。表1为3种方案对于SQL改写的性能对比:从天翼云云电脑生产环境中随机摘取100万条数据对其进行Mysql语法到PostgreSQL语法的改写,在Intel Core i7-6700 CPU 和24GB内存的测试环境下,各使用10个线程分别按上述3个方案进行测试。文章来源地址https://www.toymoban.com/news/detail-710220.html

到了这里,关于一种提升SQL改写效率的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 逆向效率提升工具与方法汇总(持续更新...)

    油猴插件,可以把它理解为一个脚本,相当于给浏览器添加一些新功能。在逆向时我一般会用它来hook逆向参数位置,大家可以直接在浏览器应用商城搜索下载,或者进入官网下载,具体使用文档可以参考此文章 最强浏览器插件:油猴脚本的安装及使用教程 SwitchyOmega是一款在

    2024年02月03日
    浏览(80)
  • Mysql 提升索引效率优化的八种方法

    目录 1. 选择唯一性索引 2. 为经常需要排序、分组和联合操作的字段建立索引 3. 为常作为查询条件的字段建立索引 4. 限制索引的数目 5. 尽量使用数据量少的索引 6. 数据量小的表最好不要使用索引 7. 尽量使用前缀来索引 8. 删除不再使用或者很少使用的索引 总结 索引的设计可

    2024年04月26日
    浏览(43)
  • 提升效率:PostgreSQL准确且快速的数据对比方法

    作为一款强大而广受欢迎的开源关系型数据库管理系统,PostgreSQL 在数据库领域拥有显著的市场份额。其出色的可扩展性、稳定性使其成为众多企业和项目的首选数据库。而在很多场景下(开发|生产环境同步、备份恢复验证、数据迁移、数据合并等),不同环境中的数据库数

    2024年02月09日
    浏览(37)
  • C# LINQ常用操作方法——提升你的编程效率

    导语:C# LINQ(Language Integrated Query)是一种强大且灵活的查询语言,可以将数据查询、过滤、排序和转换等操作无缝集成到C#代码中。本文将介绍一些常用的LINQ操作方法,帮助熟练掌握LINQ的使用,并进一步提升编程效率。 对于初学者来说,基本的查询操作是使用LINQ时的关键

    2024年02月06日
    浏览(41)
  • 解决流水线瓶颈、提升编码效率的五个方法(上篇)

    不是吹牛,但我所管理的开发团队在软件开发速度上表现出色,能够高质量地编写代码,并在白噪声的陪伴下保持高效。 但就像所有的故事一样,一开始并不是这样的,甚至相去甚远。我们经历了时间、沟通、合作、失败、成功以及许多关于生产力的会议(有时很尴尬,但它

    2023年04月20日
    浏览(45)
  • 一键完成,批量转换HTML为PDF格式的方法,提升办公效率

    在当今数字化的时代,HTML和PDF已经成为两种最常用的文件格式。HTML用于网页内容的展示,而PDF则以其高度的可读性和不依赖于平台的特性,成为文档分享和传播的首选格式。然而,在办公环境中,我们经常需要在这两种格式之间进行转换。那有没有一种方法可以一键完成,

    2024年01月21日
    浏览(43)
  • 【JavaScript精通之道】掌握数据遍历:解锁现代化遍历方法,提升开发效率!

    ​ 🎬 岸边的 风 :个人主页  🔥  个人专栏  :《 VUE 》 《 javaScript 》 ⛺️  生活的理想,就是为了理想的生活 ! ​ 目录  📚 前言  📘 1. reduce方法 📘 2. forEach方法 📘 3. map方法  📘 4. for循环 📘 5. filter方法 📘 6. for...of循环 📘 7. Object.keys方法 📘 8. Object.values方法 📘

    2024年02月10日
    浏览(46)
  • 分享一种快速移植OpenHarmony Linux内核的方法

    本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带 Linux 内核的现有能力,快速移植 OpenHarmony 到三方芯片平台的方法。 内核态层和用户态层 为了更好的解释整个内核移植,首先需要介绍一些概念: 我们可以把 OpenHarmony 简单的分为

    2024年04月26日
    浏览(52)
  • 深度学习论文解读分享之diffGrad:一种卷积神经网络优化方法

    diffGrad: An Optimization Method for Convolutional Neural Networks Shiv Ram Dubey , Member, IEEE, Soumendu Chakraborty , Swalpa Kumar Roy , Student Member, IEEE, Snehasis Mukherjee, Member, IEEE, Satish Kumar Singh, Senior Member, IEEE, and Bidyut Baran Chaudhuri, Life Fellow, IEEE Adaptive moment estimation (Adam), difference of gradient, gradient descent,

    2024年01月17日
    浏览(53)
  • 效率起飞!天翼云并行文件服务HPFS高效应对AI时代大模型训练存储挑战!

    国内外AI大模型层出不穷,训练数据复杂程度更是呈指数级增加。如今,在万亿级参数时代,单个资源池已无法满足大模型训练场景中动辄PB级的数据存储量,对于企业来说,启用多个资源池构成的分布式存储势在必行。     为了应对AI大模型训练对数据存储的需求,天翼云推

    2024年03月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包