李万鸿
通常sql语法解析都是以lex、yacc进行分析为基础的,是逐个字符进行分析,性能不高,如果基于没有子查询的sql语句进行解析,则速度会提高许多,在此对其原理加以说明。
一般sql语句十分复杂,包含多层嵌套,但其中有规律可循,其特点是所有的语句基本模式是一样的,即:都是SELECT FROM WHERE类型的简单语句,因此,可以把嵌套的语句逐条解析为这种简单语句。由于sql语句的语法是一样的,所以可以用递归的方法对语句加以解析,从而把sql语句解析为多条简单的子SQL语句。然后通过一个方法分别解析这些子sql语句。这样处理,算法简单有效,极大地提高性能,对于SQL语法解析来说是一个革命性的新思路。
大数据通常使用HBASE等NOSQL,对于sql开发来说极为不便,为此,采用分布式的关系数据库来保存大数据极具实用价值,比如用ORACLE、MYSQL把一张表分库保存到多个数据库,这样既可以处理海量数据又适用于传统的编程,支持MYBATIS、SPRING、HIBERNATE,开发极为方便。相应的难点是各个分库的表的ID的唯一性和SQL语句的处理。
对于ID的唯一性解决不难,关键在于分布式SQL的处理。随着SPARK等大数据软件应运而生,对于分布式数据的处理来说正当其时。可以用SPARK来处理分布的数据,那么如何得到这些数据呢?为此,可以通过本文提出的SQL解析原理对SQL语句进行解析,把一条复杂的SQL语句解析为多简单的SQL语句,如
SELECT A.*FORM USER A WHERE A.ID>222,然后通过数据字典找到USER表对应的分库,在各个分库上执行查询,然后把各个查询结果用SPARK处理,对于其他的子SQL语句如法炮制,然后根据主SQL语句的条件如JOIN、GROUP
BY、ORDER BY等对所有的查询数据进行运算汇总处理,最后返回结果。
总之,通过获取各个简单的子SQL语句进行语法解析或语句分解,是一个行之有效的好办法,简单巧妙地解决了一个公共的难题,尤其对于采用高效数据库处理大数据有特殊的意义,为其奠定了基石。这是一个极为有效的解决办法,值得应用。
2014-10-17