SQL解析器的性能测试

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

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 micmiu
				parser.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 block
			e.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 block
			e.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

时间: 2024-08-05 19:34:12

SQL解析器的性能测试的相关文章

java sql解析器比较druid sql parser vs jsqlparser vs fdb-sql-parser

先上结论. 功能上:druid sql parser(支持分区.WITH.DUAL等.使用mysql语法解析时,已知oracle的一些操作符会被转为mysql,如|| 转为OR.使用oracle解析器时,union all里面的括号会被移到外面,从而导致可能执行出错) > jsqlparser(不支持分区) > fdb-sql-parser(不支持很复杂的SQL).因此,首先排除fdb-sql-parser.都不支持不执行SQL语句解析语义,调用preparestatement即可,不是问题.

mybtis plus 3.2.0 动态表名sql解析器的配置

一.Configuration @Configuration public class MybatisPlusConfiguration { public static ThreadLocal<String> inputTableName = new ThreadLocal<>(); @Bean public PaginationInterceptor paginationInterceptor(){ PaginationInterceptor paginationIntercep

SQL解析器

主要分为词法分析.语法和语义分析.优化.执行代码生成,分析后的代码会生成语法树 参考:http://www.elecfans.com/emb/20180618696111.html 原文地址:https://www.cnblogs.com/fxtx/p/11456494.html

atitit.java解析sql语言解析器解释器的实现

1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的基本的流程,词法分析,而后进行语法分析,语义分析,构建sql的AST 1 3. 词法分析器 2 4. 语法分析器--ANTLR 2 5. Eclipse插件,,ANTLR Studio 3 6. 一个基于javacc实现的解析器JSqlParser0.7(yr2011), 3 7. 样例代码-----解析sql表格列的名称and类型 3 8. }Sql的历史 4 9. 解析select语句 4 10. zql,

MySQL技术探索01实现SQL语法解析器

本文将介绍如何使用开源的语法和词法分析框架bison和flex来实现SQL解析器.出于技术学习的目的,本文做描述的微型SQL解析器仅能实现对微型SQL的语法解析. 1.MySQL中的SQL解析器 包括JDBC.ODBC.ADO等等关系数据库客户端应用开发框架在内的各种SDK,核心功能是帮助程序员简化各种客户端的数据库操作,同时将SQL语句通过网络形式发送给MySQL等关系数据库的服务器进程.MySQL服务器进行负责解析并执行这些SQL语句.SQL语句中的语法规则多种多样,MySQL服务器是如何实

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

MYSQL服务器接收SQL格式的查询,首先要对sql进行解析,内部将文本格式转换为二进制结构,这个转换就是解析器,解析的目的是为了让优化器更好的处理指令,以便以最优的路径,最少的耗时返回我们想要的结果.sql解析器的构成:1.词法分析(Lexical scanner):作用是将整个查询分解为多个元素.2.语法规则(Grammar rule module):寻找sql语法规则组合,产生一个序列,执行这些规则相关的代码.1 and 2 产生一棵解析树,提供给优化器使用.mysql解析器的特殊性在于它

数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析

关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 认真的源码交流微信群. 1. 概述 2. SQLParsingEngine 3. SQLParser SQL解析器 3.2.1 #parse

数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(一)之语法解析

关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 1. 概述 2. Lexer 词法解析器 3. Token 词法标记 3.2.1 Literals.IDENTIFIER 词法关键词 3.2

利用 druid 解析器解析SQL

最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写. 1. 对 insert 语句进行解析: private static String convertInsertSQL(String sql){ try{ MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseSt