SQLエンジンは、SQLリクエストを受信してから実行するまで、典型的なプロセスに従います。
プロセスは以下の図のようになります:
説明
この実行プロセスはDMLおよびSELECT文に適用されます。その他の文(例:DCL)にはオプティマイザーなどのステップがありません。
次の表は、SQLリクエストの実行プロセスの各ステップを説明したものです。
ステップ |
説明 |
|---|---|
| Fast-parser | 法文的解析のみを使用してテキスト文字列を直接パラメータ化し、パラメータ化後のテキストと定数パラメータを取得します。 |
| Parser(法文的・構文的解析モジュール) | ユーザーから送信されたSQLリクエスト文字列を受信すると、Parserは文字列を一つ一つの「単語」に分割し、事前に設定された構文ルールに基づいてリクエスト全体を解析します。これにより、SQLリクエスト文字列は構文構造情報を持つメモリデータ構造、すなわち構文木(Syntax Tree)に変換されます。 |
| Plan Cache(実行計画キャッシュモジュール) | 実行計画キャッシュモジュールは、そのSQLが初めて生成した実行計画をメモリ内にキャッシュします。以降の実行ではこの計画を繰り返し実行できるため、重複するクエリの最適化処理を回避できます。 |
| Resolver(意味解析モジュール) | Resolverは生成された構文木を、データベースの意味情報を持つ内部データ構造に変換します。このプロセスでは、Resolverはデータベースのメタ情報に基づいてSQLリクエスト内のトークンを対応するオブジェクト(例:データベース、テーブル、列、インデックスなど)に翻訳し、生成されたデータ構造をStatement Treeと呼びます。 |
| Transformer(論理変換モジュール) | ユーザーのSQLの意味を解析し、内部のルールやコストモデルに基づいて、ユーザーのSQLをそれと等価な他の形式に変換し、後続のオプティマイザーへ提供してさらなる最適化を行います。Transformerの動作方法は、元のStatement Treeに等価変換を施し、変換後の結果もまたStatement Treeであることです。 |
| Optimizer(オプティマイザー) | オプティマイザーはSQLリクエスト全体の最適化の核心であり、SQLリクエストに対して最適な実行計画を生成する役割を担います。最適化プロセスにおいて、オプティマイザーはSQLリクエストの意味、オブジェクトデータの特性、オブジェクトの物理的配置など、多方面の要因を総合的に考慮し、アクセスパスの選択、結合順序の選択、結合アルゴリズムの選択、分散計画の生成など、複数の核心的な問題を解決し、最終的にそのSQLに対応する最適な実行計画を選択します。 |
| Code Generator(コードジェネレータ) | 実行計画を実行可能なコードに変換しますが、最適化の選択は行いません。 |
| Executor(エグゼキュータ) | SQLの実行プロセスを開始します。
|