標籤:sql 編譯 解析 分布式 大資料
基於簡單sql語句的sql解析原理及在大資料中的應用
李萬鴻
通常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
基於簡單sql語句的sql解析原理及在大資料中的應用