`

SQL解析器的性能测试

 
阅读更多

文章来自:http://blog.csdn.net/wind520/article/details/42109061

 

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

 

  1. package demo.test;  
  2. import java.io.StringReader;  
  3. import java.sql.SQLSyntaxErrorException;  
  4.   
  5. import net.sf.jsqlparser.JSQLParserException;  
  6. import net.sf.jsqlparser.parser.CCJSqlParser;  
  7. import net.sf.jsqlparser.parser.CCJSqlParserManager;  
  8. import net.sf.jsqlparser.statement.Statement;  
  9.   
  10. import org.opencloudb.parser.SQLParserDelegate;  
  11.   
  12. import com.alibaba.druid.sql.ast.SQLStatement;  
  13. import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;  
  14. import com.foundationdb.sql.parser.QueryTreeNode;  
  15. import com.foundationdb.sql.parser.SQLParser;  
  16. import com.foundationdb.sql.parser.SQLParserFeature;  
  17.   
  18.   
  19. public class TestParser {  
  20.     public static void main(String[] args) {  
  21.         String sql = "insert into employee(id,name,sharding_id) values(5, 'wdw',10010)";  
  22.         int count = 1000000;  
  23.         long start = System.currentTimeMillis();  
  24.         System.out.println(start);  
  25.         try {  
  26.             for(int i = 0; i < count; i++) {  
  27.                 SQLParser parser = new SQLParser();  
  28.                 parser.getFeatures().add(SQLParserFeature.DOUBLE_QUOTED_STRING);  
  29.                 parser.getFeatures().add(SQLParserFeature.MYSQL_HINTS);  
  30.                 parser.getFeatures().add(SQLParserFeature.MYSQL_INTERVAL);  
  31.                 // fix 位操作符号解析问题 add by micmiu  
  32.                 parser.getFeatures().add(SQLParserFeature.INFIX_BIT_OPERATORS);  
  33.                 QueryTreeNode ast =parser.parseStatement(sql);  
  34.             //  QueryTreeNode ast = SQLParserDelegate.parse(sql,"utf-8" );  
  35.             }  
  36.               
  37.         } catch (Exception e) {  
  38.             // TODO Auto-generated catch block  
  39.             e.printStackTrace();  
  40.         }  
  41.         long end = System.currentTimeMillis();  
  42.         System.out.println(count + "times parse,fdb cost:" + (end - start) + "ms");  
  43.           
  44.         start = end;  
  45.         try {  
  46.             for(int i = 0; i < count; i++) {  
  47.                 //Statements stmt = CCJSqlParserUtil.parseStatements(sql);  
  48.                 Statement stmt =new CCJSqlParserManager().parse(new StringReader(sql));  
  49.             }  
  50.         } catch (JSQLParserException e) {  
  51.             // TODO Auto-generated catch block  
  52.             e.printStackTrace();  
  53.         }  
  54.         end = System.currentTimeMillis();  
  55.         System.out.println(count + "times parse,JSQLParser cost:" + (end - start) + "ms");  
  56.           
  57.         start = end;  
  58.         for(int i = 0; i < count; i++) {  
  59.             MySqlStatementParser parser = new MySqlStatementParser(sql);  
  60.             SQLStatement statement = parser.parseStatement();  
  61.         }  
  62.           
  63.         end = System.currentTimeMillis();  
  64.         System.out.println(count + "times parse ,druid cost:" + (end - start) + "ms");    
  65.     }  
  66. }  


输出结果:

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

 

100万次:druidfdbparser16倍,比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查询安全性及性能优化

    并不需要SQL语句真正执行,是优化器估算的计算 来自数据库的统计信息,统计信息月准确,执行计划月精确 说明:网络经验:后者效率高于前者,但是以上两个查询语句的性能通过查询计划可以看出其实是一样的,后者...

    mycat路由解析之Druid开发指南.docx

    曾经对一个长sql解析测试,能达到40倍左右。 2、 支持的语法更多。 下面列举一些fdbparser不支持,但是druidparser支持的语法: (1)Insert into ….on duplicate key update….. (2)Insert into (),()…语句 (3...

    plsql-parser:用js编写的Oracle PLSQL解析器

    PL / SQL解析器 欢迎捐款,我对每一个帮助都很满意:) 概念 这将是一个多阶段解析器。这意味着,第一级仅解析一般结构。例如,它发现变量声明,但不检查定义的varchar2变量是否确实具有有效的字符串值。稍后将在字符...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    目录 推荐序 前言 第1章 认识Oracle RAC 1.1 RAC产生的背景 1.2 RAC体系结构 1.2.1整体结构 1.2.2物理层次结构 ...15.4.3 SQL解析 15.4.4 SQL优化 15.4.5 SQL行源生成 15.4.6 SQL执行 15.5本章小结

    深入解析DB2--高级管理,内部体系结构与诊断案例.part1.rar

    9.7 如何影响优化器来提高性能 9.8 优化器总结 第10章 统计信息更新与碎片整理 10.1 统计信息更新 10.2 碎片整理 10.3 重新绑定程序包 10.4 本章小结 第11章 SQL语句调优 11.1 通过监控找出最消耗资源的SQL语句 ...

    marple:解析SQL查询以监控网络性能

    Needlstk:用于表达网络性能查询的系统 名称是针和堆栈的portmanteau,以反映在大海捞针中寻找针的目标。 发音为“ needle stack” 快速开始 需要Java 8:sudo apt-add-repository ppa:webupd8team / java sudo ...

    ORACLE9i_优化设计与系统调整

    §12.7 测试SQL语句性能 151 §12.7.1 SQL_Trace实用工具 151 §12.7.2 TKPROF实用程序 151 §12.8 使用SQL_Trace和TKPROF 151 §12.8.1 设置跟踪初始化参数 152 §12.8.2 启用SQL_Trace实用工具 152 §12.8.3 用...

    炼数成金深度学习PostgreSQL.txt

    目前国内对PostgreSQL的使用,主要反映在两个范畴1 用于取代MySQL和Oracle2 作为数据库产品原型,通过修改源码构筑自己的数据库,例如通过使用pg的sql解析器,省去自己编写sql解析器的困难。某些拿了政府大量补贴的...

    lbadd:LBADD:一个实验性的分布式SQL数据库

    从解析器到寻呼机,随时关注每个组件的开发。建筑该数据库由几个单独的组件组成。 这些处理SQL解析,中介表示生成,多节点共识, IR的执行以及(持久)存储。 要简要了解每个组件的用途,请查看。现有技术灵感来自...

    java办公用品管理系统源码-awesome-mysql-cn:MySQL资源大全中文版,分析工具、备份、性能测试、配置、部署、GUI等

    java办公用品管理系统源码 MySQL 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。...资源列表,内容包括:分析工具、备份、...格式文件的解析器,用于 Ruby 语言。 - 一个具备多种

    csharpcc:CSharpCC-从JavaCC派生的Compliler编译器,用于为.NET(C#语法)生成LL(k)ParserLexer [未维护]

    注意:该项目最初是作为的辅助软件而,但是由于切换到Irony来生成PL / SQL解析器,因此CSharpCC成为了一个未维护的项目。 CSharpCC 该项目的范围是移植JavaCC为.NET项目生成解析器和词法分析器(词法分析器)提供的...

    SparkSql技术

    1.2:sparkSQL的性能 5 1.2.1:内存列存储(In-Memory Columnar Storage) 6 1.2.2:字节码生成技术(bytecode generation,即CG) 6 1.2.3:scala代码优化 7 二:sparkSQL运行架构 8 2.1:Tree和Rule 9 2.1.1:Tree...

    支持多数据库的ORM框架ef-orm.zip

    EF-ORM中采用了独特的SQL解析和改写技术,能够主动检查并确保SQL语句或者SQL片段在各个数据库上的兼容性。 EF中除了Criteria API以外,可以直接使用“SQL语句”或者“SQL片段”。但是这些SQL语句并不是直接传送给...

    网站架构技术

    网站的性能测试 不同的视角 用户的视角 开发人员的视角 运维人员的视角 性能测试指标 响应时间 并发数 吞吐量 性能测试方法 性能测试 负载测试 压力测试 稳定性测试 web 前端...

    AppFramework_V1.0_New

    代码生成器,ORMap,支持Oracle/SqlServer/MSAccess,性能大大优于iBatisNet,终身免费,随意使用。 =========== 软件说明: 1.1 引言 约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    内含代码生成器,支持Oracle/SqlServer/MSAccess,ORMap性能大大优于iBatisNet,终身免费无限制使用,绝无任何版权问题。 =========== 软件说明: 1.1 引言 约有90%的企业信息化管理系统基于数据库...

    AppFramework_V1.0

    &lt;br&gt; &lt;br&gt;下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: &lt;br&gt; &lt;br&gt;表I –10并发20循环(数据库和测试机分开) &lt;br&gt;对比项目 iBatis2.0...

    OCA认证考试指南(1Z0-052)

    13.1 使用和管理优化器统计信息 13.2 使用和管理自动工作负荷仓库 13.3 使用顾问程序体系结构 13.4 管理警报和阈值 13.5 小结 13.6 本章自测题 第14章 性能管理 14.1 使用自动内存管理 14.2 使用...

    java开源包1

    JOpt Simple 是一个简单的、测试驱动的命令行解析器,支持 POSIX getopt() 和 GNU getopt_long() Java的HTTP代理服务器 Smart Cache Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的...

    java开源包11

    JOpt Simple 是一个简单的、测试驱动的命令行解析器,支持 POSIX getopt() 和 GNU getopt_long() Java的HTTP代理服务器 Smart Cache Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的...

Global site tag (gtag.js) - Google Analytics