zoukankan      html  css  js  c++  java
  • 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万次: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

  • 相关阅读:
    Andrew Ng机器学习week4(Neural Networks: Representation)编程习题
    linux系统下crontab 配置启动定时任务
    在python中配置tornado服务
    在python中Flask配置服务
    ltp的使用
    查看文件内容- 删除某个运行程序的所有进程-nohup后台执行程序
    机器学习和深度学习资料整理
    配置linux服务器和pycharm的连接
    计算 24 点是一种扑克牌益智游戏,随机抽出 4 张扑克牌,通过加 (+) ,减 (-) ,乘 ( * ), 除 (/) 四种运算法则计算得到整数 24 ,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写 joker 表示小王,大写 JOKER 表示大王:
    机器人的运动范围 剑指offer66题
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6951153.html
Copyright © 2011-2022 走看看