对同一个sql语句,使用3种解析器解析出ast语法树(这是编译原理上的说法,在sql解析式可能就是解析器自定义的statement类型),执行100万次的时间对比。

package demo.test;
import java.io.StringReader;
import java.sql.SQLSyntaxErrorException;import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParser;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.statement.Statement;import org.opencloudb.parser.SQLParserDelegate;import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.foundationdb.sql.parser.QueryTreeNode;
import com.foundationdb.sql.parser.SQLParser;
import com.foundationdb.sql.parser.SQLParserFeature;public class TestParser {public static void main(String[] args) {String sql = "insert into employee(id,name,sharding_id) values(5, 'wdw',10010)";int count = 1000000;long start = System.currentTimeMillis();System.out.println(start);try {for(int i = 0; i < count; i++) {SQLParser parser = new SQLParser();parser.getFeatures().add(SQLParserFeature.DOUBLE_QUOTED_STRING);parser.getFeatures().add(SQLParserFeature.MYSQL_HINTS);parser.getFeatures().add(SQLParserFeature.MYSQL_INTERVAL);// fix 位操作符号解析问题 add by micmiuparser.getFeatures().add(SQLParserFeature.INFIX_BIT_OPERATORS);QueryTreeNode ast =parser.parseStatement(sql);//    QueryTreeNode ast = SQLParserDelegate.parse(sql,"utf-8" );}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}long end = System.currentTimeMillis();System.out.println(count + "times parse,fdb cost:" + (end - start) + "ms");start = end;try {for(int i = 0; i < count; i++) {//Statements stmt = CCJSqlParserUtil.parseStatements(sql);Statement stmt =new CCJSqlParserManager().parse(new StringReader(sql));}} catch (JSQLParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}end = System.currentTimeMillis();System.out.println(count + "times parse,JSQLParser cost:" + (end - start) + "ms");start = end;for(int i = 0; i < count; i++) {MySqlStatementParser parser = new MySqlStatementParser(sql);SQLStatement statement = parser.parseStatement();}end = System.currentTimeMillis();System.out.println(count + "times parse ,druid cost:" + (end - start) + "ms");  }
}

输出结果:

1419327695186
1000000times parse,fdb cost:24468ms
1000000times parse,JSQLParser cost:11469ms
1000000times parse ,druid cost:1454ms

100万次:druid比fdbparser快16倍,比JSQLParser快近8倍

参考:Mycat路由新解析器选型分析与结果.docx

https://github.com/MyCATApache/Mycat-doc/blob/master/Mycat%E8%B7%AF%E7%94%B1%E6%96%B0%E8%A7%A3%E6%9E%90%E5%99%A8%E9%80%89%E5%9E%8B%E5%88%86%E6%9E%90%E4%B8%8E%E7%BB%93%E6%9E%9C.docx

SQL解析器的性能测试相关推荐

  1. 自定义sql_基于Calcite自定义SQL解析器

    这本应该是<我也能写数据库>系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了. 本文会介绍如何扩展Calcite的SQL解析器使之更符合你的业 ...

  2. MySQL的SQL解析器是干什么的?底层原理是什么?

    MySQL的SQL解析器(SQL parser)是一个负责将SQL语句转换为可执行的指令的组件.其主要功能是将输入的SQL语句分解为语法单元,然后将这些语法单元转换为内部表示的数据结构,最终生成一个可 ...

  3. 如何实现一个SQL解析器

    1. 背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询.SQL作为一个学习成本很低的语言,支持S ...

  4. 机器学习从入门到精通50讲(九)-基于 ANTLR 自己实现一个 SQL 解析器

    一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...

  5. java sql分析器_java sql解析器比较druid sql parser vs jsqlparser vs fdb-sql-parser

    先上结论. 功能上:druid sql parser(支持分区.WITH.DUAL等.使用mysql语法解析时,已知oracle的一些操作符会被转为mysql,如|| 转为OR.使用oracle解析器 ...

  6. jsqlparser mysql_java sql解析器比较druid sql parser vs jsqlparser vs fdb-sql-parser

    先上结论. 功能上:druid sql parser(支持分区.WITH.DUAL等.使用mysql语法解析时,已知oracle的一些操作符会被转为mysql,如|| 转为OR.使用oracle解析器 ...

  7. 使用Lemon编写最简单的SQL解析器

    使用SQLite自带的Lemon解析器生成工具,制作最简单的解析器.以解析器仅解析Create table语句. 以下的生成解析器所需的.y文件. // All token codes are sma ...

  8. MySQL内核源码解读-SQL解析之解析器浅析

    MYSQL服务器接收SQL格式的查询,首先要对sql进行解析,内部将文本格式转换为二进制结构,这个转换就是解析器,解析的目的是为了让优化器更好的处理指令,以便以最优的路径,最少的耗时返回我们想要的结果 ...

  9. mysql解释器_atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

最新文章

  1. CPU的自动调度矩阵乘法
  2. [转载]Outlook 2016 显示正在启动... 无法进入Outlook的解决方案
  3. MySQL Infobright 数据仓库快速安装笔记[转]
  4. SAP Marketing Cloud功能简述(二) Target Group
  5. React-Native 指定模拟器RUN-IOS
  6. 微软发布PowerShell Core第一个版本:支持多平台开发
  7. 【python】 类、对象的练习题
  8. Java转型,多态和契约设计
  9. Effective Modern C++ 第四章,C++智能指针
  10. Perl调用shell命令方法小结
  11. Pytorch——计算机视觉工具包:torchvision
  12. 产品经理三大文档--BRD、MRD、PRD解读
  13. unity与3dmax 单位统一的方法
  14. 打印机扫描显示服务器拒绝访问,怎么解决打印机拒绝访问问题?打印机拒绝访问的解决方法...
  15. TestCenter测试管理工具问题详解(6)
  16. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究
  17. 大学计算机课程学情分析,大学计算机基础课程教学内容调查分析.doc
  18. 梯度grad公式_FLAC3D梯度计算详解
  19. C++OpenCV系统学习(3)——图像混合、调整亮度与对比度
  20. EFR32蓝牙串口透传程序流程

热门文章

  1. php 输出答案,php 如何只输出最后生成的那个值??
  2. ssh中exit命令退出远程服务器_解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止...
  3. android python 纠正图片,Python脚本替换Android资源(包名,图片,文件内容)
  4. 【机器学习算法专题(蓄力计划)】十一、特征数据预处理
  5. 博士申请 | 美国罗格斯大学王灏助理教授招收机器学习方向博士生
  6. 清华大学刘知远组:基于Prompt Tuning对低维本征任务子空间进行探索
  7. 博后招募 | 新加坡国立大学WING实验室招募自然语言处理方向博士后
  8. AI 引领产业变革:相关岗位起薪33w
  9. 实录分享 | 计算未来轻沙龙:深度学习工具专场(PPT下载)
  10. java实验四 集合与函数式编程实验