# SQL文の解析とコンパイル

![`smart`](SQLParseandCompile_aa_003_20220512.png)

-----------------------------------------------------------
TiDBサーバーのプロトコル層がクライアントプログラムから送信されたSQL文を受け取ると、SQL文のテキストの処理を開始します。最初に行うことは、非同期的にPDからSQL文の開始時のTSOであるstart_tsを取得することです。その後、ParseおよびCompileモジュールをそれぞれ経由し、最終的に実行計画をExecutorモジュールに渡します。

1. TSOを非同期に読み込むことで、現在のSQL文の実行が開始される時、つまりstart_ts情報を取得することが可能となります。これはPD Clientモジュールによって実現されます。

2. Parseモジュールは、SQL文を抽象構文木（AST）に変換するためにlexerとyacc parserを使用しています。そして、それはCompileモジュールに渡されます。

3. ASTがCompileモジュールに受け取られた後、最初にPreprocessプロセスに入ります。これは主に前処理、文の正当性チェック、名前バインディングを行います。また、Preprocessプロセスの後、決定が行われます。
- SQL文が1行のデータ（PointGet）を読み取る場合、ユニークインデックスやプライマリキーインデックスを検索条件としたSQL操作など、その文は次の最適化プロセスに渡されず、データを取得するために直接実行され、最適化プロセスのコストを節約することができます。この最適化はPointGetと呼ばれています。
- SQL文がPointGetで最適化されていない場合、最適化プロセスに入ります。これは2つの部分に分かれています。
  - 1) ロジック最適化は、主に関係代数の等価交換規則に基づいて、いくつかの論理変換を行うことによって行われます。
  - 2) 論理最適化の結果を基に、統計と組み合わせて物理的な最適化を行い、物理的なオペレーターと最適な実行パスを選択します。最適化プロセスについて、論理最適化と物理的最適化については、TiDBパフォーマンス最適化コースで詳しく説明します。

最適化プロセスの後、物理的な実行計画が最終的に生成されます。物理的な実行計画を使用すると、TiDBサーバーはそれを実行してストレージエンジン内のデータにアクセスできます。

