SQL解析器的性能测试

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

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

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  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

猜你喜欢

转载自ximeng1234.iteye.com/blog/2209319
今日推荐