SQL解析器的效能測試

來源:互聯網
上載者:User

標籤:

對同一個sql語句,使用3種解析器解析出ast文法樹(這是編譯原理上的說法,在sql解析式可能就是解析器自訂的statement類型),執行1100萬次的時間對比。

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 micmiuparser.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 blocke.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 blocke.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解析器的效能測試

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.