本文分享自天翼云开发者社区《一种提升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个方案进行测试。

一种提升SQL改写效率的方法的更多相关文章

  1. 提高SQL查询效率的30种方法

    转载:提高SQL查询效率的30种方法 内容摘录如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中 ...

  2. 提高SQL执行效率的16种方法

      项目中优化sql语句执行效率的方法:1)尽量选择较小的列2)将where中用的比较频繁的字段建立索引3)select子句中避免使用'*'4)避免在索引列上使用计算.not in 和<> ...

  3. 提升jmeter脚本编写效率的方法:Fiddler导出jmx文件

    有效提升编写JMeter脚本效率的方法 jmeter的脚本来源有以下几种:badboy录制.jmeter自带的录制功能.手动编写脚本(使用fiddler/wireshark来抓包,然后构造协议写脚本) ...

  4. lua中,两种json和table互转方法的效率比较

    lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据 ...

  5. [转]SQL三种获取自增长的ID方法

     最新更新请访问: http://denghejun.github.io   SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...

  6. 【老孟Flutter】6种极大提升Flutter开发效率的工具包

    老孟导读:本文介绍6种极大提升Flutter开发效率的工具包. [1] 强大的日志软件包 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面 ...

  7. 你用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 Query 时间), 并定位和分析脚本执行和数据库查询的瓶颈所在?

    php: 一般是在你要检查的代码开头记录一个时间,结尾记录一个时间.取差值, 数据库SQL的效率    sql的explain(mysql),启用slow query log记录慢查询.   通常还要 ...

  8. 新三种求数列中值SQL之效率再比拼

    在  https://www.cnblogs.com/xiandedanteng/p/12677688.html 中我列举了三种求中值方案,其中日本人MICK的做法因为不适用于二百万结果集而放弃,取而 ...

  9. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...

  10. SQl 执行效率总结

    SQL执行效率总结 1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2 ...

随机推荐

  1. go官方包依赖管理工具之mod

    1.1.go mod是什么 go mod 是Golang 1.11 版本引入的官方包(package)依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理. 之前Golang ...

  2. 【实战问题】-- 布隆过滤器的三种实践:手写,Redission以及Guava(2)

    前面我们已经讲过布隆过滤器的原理[实战问题]-- 缓存穿透之布隆过滤器(1),都理解是这么运行的,那么一般我们使用布隆过滤器,是怎么去使用呢?如果自己去实现,又是怎么实现呢? 目录 布隆过滤器 手写布 ...

  3. cmu15545笔记-并发控制总结(Concurrency Control Summary)

    目录 总览 ACID 串行化与冲突操作 隔离级别 概念层级 二阶段锁 原理 级联回滚 强二阶段锁 死锁检测和避免 锁层级 实践应用 实现的隔离级别 OOC 原理 三个阶段 实现的隔离级别 处理幻读 M ...

  4. word操作类

    public class WordUtility { private _Application wordApp = null; private _Document wordDoc = null; pu ...

  5. nvm切换版本报exec: “cmd”: executable file not found in %PATH% 问题

    由于也是第一次用,出了个这报错懵了 搜了下也没个准确的解决办法(也可能是问题太简单),有的说可能是cmd变量没配好,检查了一遍没问题 后来想到报的是cmd,而cmd存储位置在 C:\Windows\S ...

  6. R机器学习:重复抽样在机器学习模型建立过程中的地位理解

    在做机器学习项目的时候,一开始我们会将数据集分为训练集和测试集,要记住测试集只能用一次,只能用来评估最终最好的模型.如果你反复去使用测试集,反复测试后从里面挑最好的,你就是在耍流氓. 建模过程中肯定有 ...

  7. Flutter showModalBottomSheet改变高度

    showModalBottomSheet改变高度 将isScrollControlled设置为true,此时弹窗会全屏展示,再返回一个带高度的SizedBox,就可以指定弹窗的高度了 showModa ...

  8. 中电金信:源启混沌工程平台(V4)与东方通TongwebV7.0完成适配认证

    ​近日,源启混沌工程平台(V4)与北京东方通科技股份有限公司(以下简称东方通)应用服务器软件东方通TongwebV7.0完成产品兼容互认证,通过在产品功能.性能.兼容性方面的全面严格测试,得出结论:东 ...

  9. Docker 部署数据可视化 Superset 3.0.0 深度汉化并配置元数据存储为 Postgres

    services: postgres: image: postgres:14.10 container_name: postgres hostname: postgres environment: P ...

  10. sublime text 4 安装(含激活码)

    一.下载步骤 官网地址:Sublime Text - the sophisticated text editor for code, markup and prose windows下载链接:Than ...