SQLエンジンがSQLリクエストを受け取ってから実行するまでの典型的なプロセスは、以下の図に示されています。

説明
この実行プロセスは、DMLおよびSELECT文に適用されます。他の文(例えばDCLなど)には、オプティマイザーなどのステップはありません。
次の表は、SQLリクエストの実行プロセスの手順を説明しています。
| ステップ | 説明 |
|---|---|
| Fast-parserモジュール | Fast-parserモジュールは、SQL内の定数をパラメータに変換し、その後パラメータ化されたSQLテキストをキーとしてPlan Cacheから実行計画を取得します。これにより、パラメータが異なるだけのSQLであれば同じ計画を共有できるようになります。つまり、単に構文解析を用いてテキスト文字列を直接パラメータ化し、パラメータ化後のテキストと定数パラメータを取得します。 |
| Plan Cacheモジュール | Plan Cacheモジュールは、そのSQLが初めて生成した実行計画をメモリにキャッシュします。以降の実行ではこの計画を繰り返し実行できるため、重複するクエリの最適化処理を回避できます。 |
| Parserモジュール | ユーザーから送信されたSQLリクエスト文字列を受信すると、Parserモジュールは文字列を一つずつ「単語」に分割し、事前に設定された文法ルールに基づいてリクエスト全体を解析し、SQLリクエスト文字列を構文情報を含むメモリデータ構造に変換します。これを構文木(Syntax Tree)と呼びます。 |
| Resolverモジュール | Resolverは、生成された構文木をデータベースのセマンティクス情報を持つ内部データ構造に変換します。この過程で、Resolverはデータベースのメタ情報に基づいてSQLリクエスト内のトークンを対応するオブジェクト(例えば、データベース、テーブル、列、インデックスなど)に翻訳し、生成されたデータ構造をStatement Treeと呼びます。 |
| クエリリライト(Query Rewrite) | クエリリライトとは、あるSQLをより最適化しやすい別のSQLに書き換えることを指します。ユーザーのSQLのセマンティクスを分析し、内部のルールやコストモデルに基づいて、ユーザーのSQLを同等の他の形式に書き換え、その後のオプティマイザーに提供してさらなる最適化を行います。クエリリライトの作業方式は、元の構文木に対して等価変換を行い、変換結果も依然として構文木です。 |
| オプティマイザー(Optimizer) | オプティマイザーは、SQLリクエスト全体の最適化の中核であり、SQLリクエストに対して最適な実行計画を生成する役割を担います。最適化プロセスにおいて、オプティマイザーはSQLリクエストのセマンティクス、オブジェクトデータの特徴、オブジェクトの物理的配置など、多くの要素を総合的に考慮し、アクセスパスの選択、結合順序の選択、結合アルゴリズムの選択、分散計画の生成など、複数の重要な問題を解決し、最終的にそのSQLに対する最適な実行計画を選択します。 |
| コードジェネレータ(Code Generator) | 実行計画を実行可能なコードに変換しますが、最適化の選択は一切行いません。 |
| Executorモジュール | SQLの実行プロセスを開始します。
|