SQL解析器的性能測试
对同一个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 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
SQL解析器的性能測试的更多相关文章
- LR杂记 - 性能測试指标及经常使用的监控工具
监控指标 性能測试通常须要监控的指标包含: 1.serverLinux(包含CPU.Memory.Load.I/O). 2.数据库:1.Mysql 2.Oracle(缓存命中.索引.单条SQL性能.数 ...
- Linux 性能測试工具
Linux 性能測试工具 linux performance 查看系统配置 查看CPU信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64- ...
- Druid SQL 解析器概览
概览 Druid 的官方 wiki 对 SQL 解析器部分的讲解内容并不多,但虽然不多,也有利于完全没接触过 Druid 的人对 SQL 解析器有个初步的印象. 说到解析器,脑海里便很容易浮现 par ...
- SQL解析器详解
1.概述 最近,有同学留言关于SQL解析器方面的问题,今天笔者就为大家分享一下SQL解析器方便的一些内容. 2.内容 2.1 SQL解析器是什么? SQL解析与优化是属于编辑器方面的知识,与C语言这类 ...
- 如何实现一个SQL解析器
作者:vivo 互联网搜索团队- Deng Jie 一.背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进 ...
- mongodb3.0 性能測试报告 一
mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver 共6台 cpu: 单颗8核 ...
- Window平台搭建Redis分布式缓存集群 (一)server搭建及性能測试
百度定义:Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset(sort ...
- mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'
mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...
- 系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式
PS:以下是性能測试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...
随机推荐
- Java单例你所不知道的事,与Volatile关键字有染
版权声明:本文为博主原创文章,未经博主允许不得转载. 如果问一个码农最先接触到的设计模式是什么,单例设计模式一定最差也是“之一”. 单例,Singleton,保证内存中只有一份实例对象存在. 问:为什 ...
- Filenames and paths
Files are organized into directories (also called ‘folders’). Every running program has a ‘current d ...
- Kali linux 2016.2(Rolling)中metasploit的主机探测
不多说,直接上干货! 1.活跃主机扫描 root@kali:~# ping -c 202.193.58.13 PING () bytes of data. bytes ttl= time=25.4 m ...
- SSRS 报表 报表迁移
数据拷贝下来以后在新的服务器上面还是进行原来的设置 点击报表服务器的连接查看报表服务器列表 这是给每个账户增加访问权限 在主界面点击文件夹设置,给每个角色分配操作报表的权限.,上面那个权限和这个权限都 ...
- HDU 4324 Triangle LOVE【拓扑排序】
题意:给出n个人,如果a喜欢b,那么b一定不喜欢a,如果b不喜欢a,那么a一定喜欢b 就是这n个点里面的任意两点都存在一条单向的边, 所以如果这n个点不能构成拓扑序列的话,就一定成环了,成环的话就一定 ...
- bzoj 2259: [Oibh]新型计算机 最短路 建模
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...
- git diff的文字说明
-U<n>--unified=<n> Generate diffs with <n> lines of context instead of the usual t ...
- 求第区间第k大数 TLE归并树
题 给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入: 第一行包含两个正整数N.M,分别表示序列的长度和查询的个数. 第二行包含N个正整数,表示这个序列各项的数字. 接下来M ...
- AWK行处理的用法实例
第一节 awk的工作流程及基础用法 awk操作符会先检索文件的行信息,然后在行信息里找需要的内容. Awk的默认分割付是空格,awk '/模式/{print $1,$2}' file ##模式的位置可 ...
- Android后台进程与前台线程间的区别使用
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 很早就翻译过Android API的一篇文章Android高级 ...