`

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-使用Python开发的SQL解析器和转换器.zip

    本资源"SQL-使用Python开发的SQL解析器和转换器"旨在帮助开发者理解如何利用Python来解析和转换SQL语句,从而深入学习SQL的工作原理和数据库操作的底层机制。以下将详细探讨这个主题。 1. SQL基础知识: SQL是一种...

    sql解析器

    SQL解析器是数据库管理系统中的一个重要组成部分,它负责将用户输入的SQL语句转换为可执行的内部表示,以便系统能够理解和执行查询。本篇文章将深入探讨SQL解析器的工作原理、重要性以及开源工具`jsqlparser`的相关...

    基于antlr4 解析器,支持spark sql, tidb sql, flink sql, Sparkflink运行命令解析器

    此外,可能还包含了一些测试用例和示例,帮助用户理解和使用这个解析器。 总的来说,这个项目涉及了多个领域的技术,包括解析器理论、SQL处理、大数据处理框架Spark和Flink,以及可能的多引擎任务调度。对于想要...

    基于 Antlr4 的 Hive SQL 解析.zip

    5. **测试和优化**:编写测试用例,确保解析器能够正确处理各种复杂的Hive SQL查询,同时优化性能,降低资源消耗。 6. **实现元数据追踪**:如果题目涉及到“线系”(lineage),可能还需要追踪查询中的数据来源和...

    sql-parser:Java 7 上的 SQL 解析器

    3. 执行计划生成:高级的SQL解析器还能生成执行计划,帮助数据库优化器选择最佳的查询策略,提高查询性能。 二、Java 7环境下的SQL解析器实现 在Java 7环境下,开发者可以利用开源库,如JSqlParser或ANTLR来实现...

    基于gudusoft的sql解析项目

    Gudusoft是一家专注于数据库技术的公司,他们的SQL解析器是一款高效且灵活的组件,主要应用于SQL语句的分析、验证和转换。该解析项目的核心功能是将SQL语句分解成可理解的结构,这在许多场景下都非常有用,例如SQL...

    sql解析代码

    文章链接中提到的博客详细介绍了SQL解析的过程,它可能涉及使用如ANTLR或JavaCC等解析器生成器来创建自定义的SQL解析器。这些工具可以生成符合特定SQL语法规则的解析代码,使得开发人员能够根据需求定制解析逻辑。 ...

    delphi编写的SQL语句生成器(不是sql语法解析器)

    本文将深入探讨由Delphi编程语言编写的SQL语句生成器,它并非SQL语法解析器,而是专注于帮助用户构建和分析SQL查询。 标题中的"Delphi编写的SQL语句生成器"是指一个利用Delphi开发的软件工具,该工具能够辅助程序员...

    计算机-mysql-内在数据库xMMDB的SQL解析器分析与实现.pdf

    5. 对实现的SQL解析器进行测试和优化,确保其在实际应用中的性能和准确性。这包括对各种复杂SQL语句的测试,以及针对性能瓶颈的优化。 通过以上工作,xMMDB不仅扩展了其功能,增强了对SQL的支持,还提升了系统的...

    SQL引擎和兼容各种SQL语法协议的解析器源代码.zip

    SQL(Structured Query ...通过研究这些源代码,开发者可以深入理解SQL引擎的工作原理,学习如何实现一个高性能、高兼容性的SQL解析器,这对于数据库系统开发、数据库性能优化以及SQL相关软件的开发都有着重要的价值。

    HW_SQL_TOOL.rar_SQL 解析_python sql_sql解析_sql语句 python_tool

    这个过程通常由数据库管理系统(DBMS)内部的解析器完成,但它也可以通过编程方式实现,比如使用Python。Python有许多库支持SQL解析,例如`sqlparse`,它是一个非执行性的SQL解析库,可以解析SQL语句并返回一个解析...

    yasqlp:另一个用于JavascriptSQL解析器

    Yasqlp是一个专门为JavaScript开发的SQL解析器,它旨在帮助开发者处理和解析SQL查询语句。在Web应用程序中,尤其是在那些需要与数据库交互的应用中,理解并操作SQL语句是至关重要的。Yasqlp提供了这样的能力,允许...

    Mycat路由新解析器选型分析与结果2

    Druid是一个多功能的数据库连接池组件,其内置的SQL解析器性能优异。尽管SQL解析是其附属功能,但其在解析速度方面的表现非常出色。 三、解析器实现方式 1. fdb parser和jsqlparser都基于javacc,通过JavaCC的语法...

    c++解析sql,存储过程

    `test.cpp`文件很可能是用来测试解析功能的,它会包含一些示例SQL语句或存储过程,以便验证解析器是否正确地提取了元数据。 `sql_struct.h`可能定义了表示SQL语句和元数据结构的C++类或结构体,比如`SQLStatement`,...

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    在实际操作中,SQL优化与调优是一个不断迭代的过程,需要数据库管理员结合具体的业务场景和性能指标,综合运用上述知识点,通过测试和实践不断调整和优化。由于是关于Oracle高性能SQL引擎的深入剖析,这本资料是...

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

    尽管Druid主要以数据库连接池闻名,但其SQL解析器性能优秀。Druid SQL Parser采用不同的实现方式,相比fdb parser和jsqlparser,它可能提供更好的性能和更丰富的功能。 为了比较这些解析器的性能,可以通过执行相同...

    Oracle 高性能SQL优化

    Oracle数据库的高性能SQL优化是数据库管理员和开发人员关注的关键领域,因为它直接影响到系统的响应时间和整体性能。Oracle性能管理是一个持续的过程,包括主动和被动两个方面。主动性能管理强调在系统设计和开发...

    SQLServer 2012性能学习笔记

    - **LoadRunner 监控 SQL Server**:虽然 LoadRunner 主要是用于负载测试的应用程序,但它也可以用来监控 SQL Server 的性能。 - 其他专用工具如 **SQL Monitor**、**Idera**、**SQL Check**、**SQL Diagnostic ...

    sql-parser-master.zip_Parser_SQL parser

    SQL解析器是数据库管理系统中的核心组件,用于理解并解释用户输入的SQL(Structured Query Language)语句。在"sql-parser-master.zip"这个压缩包中,我们很可能是得到了一个名为"Parser_SQL parser"的项目源码,它...

    深入解析sqlserver 2008 Microsoft SQL Server 2008 Internals

    2. **查询优化器**:查询优化器是SQL Server解析和转换SQL语句的关键组件。它通过分析不同的执行路径来确定最佳执行计划,涉及统计信息、代价模型和并行性策略。 3. **事务与并发控制**:书中深入剖析了SQL Server ...

Global site tag (gtag.js) - Google Analytics