SQLは他のプログラミング言語に比べて比較的単純です。しかし、SQLはまだ確立されたプログラミング言語であるため、SQLの構文を解析することは他のプログラミング言語を解析することと根本的に異なるわけではありません。
抽象構文ツリー
構文解析プロセスは字句解析と構文解析に分けられます。字句解析はSQLをトークンと呼ばれる不可分の原子記号に分解し、異なるデータベース方言が提供する辞書に基づいてキーワード、式、リテラル、演算子に分類するために使用されます。構文解析器はSQLを抽象構文ツリーに変換します。
例えば、次のようなSQLです:
SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18
パース後の抽象構文木を以下に示します。
理解しやすいように、抽象構文ツリーのキーワードのトークンは緑色、変数のトークンは赤色で表示され、灰色はさらなる分割が必要であることを示しています。
最後に、抽象構文ツリーを走査して、スライスに必要なコンテキストを絞り込み、書き換えが必要な場所をマークします。スライシングのための構文解析コンテキストは、クエリの選択、テーブル情報、スライシング条件、自己インクリメントの主キー情報、ソート情報、グループ化情報、ページング情報から構成されます。SQLの1回限りの構文解析プロセスは不可逆であり、1つのトークンはSQLの本来の順序で順次構文解析され、高いパフォーマンスを発揮します。様々なデータベースのSQL方言の類似点と相違点を考慮し、構文解析モジュールは様々なデータベースのSQL方言の辞書を提供します。
SQL構文解析エンジン
SQLパーシングは、スプリットライブラリとスプリットテーブル製品の中核として、パフォーマンスと互換性のための最も重要なメトリクスです。ShardingSphereのSQLパーサーは、3世代の製品アップデートを経てきました。
第一世代のSQLパーサーは、パフォーマンスと高速実装を追求するため、バージョン1.4.xでSQLパーサーとしてDruidを使用しました。これはテスト済みで、その性能は他のパーサよりもはるかに優れています。
第二世代の SQL パーサー バージョン 1.5.x 以降、ShardingSphere は完全に独自に開発した SQL パーシング・エンジンを使用しています。その目的が異なるため、ShardingSphereはSQLを完全に抽象化された構文ツリーにする必要はありません。SQLを半端に理解し、データスライシングが注目する必要があるコンテキストだけを洗練させるので、SQL解析のパフォーマンスと互換性がさらに向上します。
DDL -> TCL -> DAL > DCL -> DML >DQLバージョン 3.0.x 以降の第 3 世代の SQL パーサーでは、ShardingSphere は SQL パーシング・エンジンとして ANTLR を使用することを試み、まだ既存のパーシング・エンジンを置き換える過程にある , の順序に従って元のパーシング・エンジンを置き換えることを計画しています。ANTLR を使用する理由は、ShardingSphere の構文解析エンジンをより SQL と互換性のあるものにするためです。ShardingSphereのシャーディングコアは複雑な式、再帰、サブクエリなどには関係ありませんが、SQLの理解には影響します。テストした結果、ANTLR の SQL 解析性能は、自社開発の SQL 解析エンジンの約 3~10 倍遅くなりました。このギャップを埋めるために、ShardingSphereはPreparedStatementを使用して解析されたSQLの構文木をキャッシュします。したがって、パフォーマンスを向上させるために SQL をプリコンパイルする方法として PreparedStatement を使用することをお勧めします。
第三世代SQL解析エンジンの全体構造は以下のように分かれています。





