エクゼキュータは、プランナ/オプティマイザで作成された計画を受け取り、必要な行の集合を抽出するために再帰的に処理します。 これは本質的に要求引き寄せ型(demand-pull)パイプライン機能です。 計画ノードが呼ばれる度にもう1つの行を引き渡すか、行を引き渡したことの報告を行わなければなりません。
具体的な例を提供する目的で頂点のノードがMergeJoin
ノードである場合を想定しましょう。
いかなるマージも実行される前に(それぞれの副計画から1つずつ)2つの行を取ってこなくてはいけません。
ですからエクゼキュータは副計画を処理するために自分自身を再帰的に呼び出します(lefttree
に付随する副計画から開始します)。
新しい頂点のノード(左の副計画の頂点のノード)はSort
ノードであるとしましょう。ここでもノード自体が処理される前に入力行を取ってこなくてはいけません。
Sort
の子ノードは実際のテーブルの読み取りを表現しているSeqScan
ノードのこともあり得ます。
このノードの処理はエクゼキュータにテーブルから行を抽出させ、呼び出しているノードに渡し戻させます。
Sort
ノードはソート対象の全てのノードを取得するために子ノードを繰り返し呼び出します。
入力がなくなった時(子ノードが行ではなくNULLを返してきた時)Sort
コードがソートを実行して最終的に最初の出力行を返すことができるようになります。
つまりソート順における最初の結果です。
後での要求に答えるためソート順に引き渡すことができるように残っている行は保存されます。
MergeJoin
ノードは同じようにしてその右副計画から最初の行を要求します。
そこで2つの行が結合できるかどうか比較されます。もし結合できる場合には呼び出し側に結合された行が返されます。
次の呼び出しの時に、もしくは入力された現在の組み合わせが結合できない場合はすぐに、あるテーブルあるいはそれ以外のテーブル(比較の結果に依存して)の次の行に進んで、さらに一致があるかどうか検証されます。
最終的にはある副計画もしくは他の計画が使いきられ、MergeJoin
ノードがこれ以上の結合行を生成できないという意味のNULLを返すことになります。
複雑な問い合わせは多くの階層となった計画ノードに関わるかもしれませんが、概略的な取り扱い方は同じです。 それぞれのノードは呼び出される度に次の出力行を計算して返します。 それぞれのノードは同時にプランナによって割り当てられたいかなる選択式や射影式でも適用する責任があります。
エクゼキュータ機構は4つの基本的なSQL問い合わせの種類すべてを検証するために用いられます。
4つのSQL問い合わせの種類とはSELECT
、INSERT
、UPDATE
、そしてDELETE
です。
SELECT
では、最上位階層のエクゼキュータコードは問い合わせ計画ツリーによって返されるそれぞれの行をクライアントへ送り返すだけでよいことになっています。
INSERT ... SELECT
、UPDATE
、DELETE
は、実質的にはModifyTable
と呼ばれる特別な最上位階層の計画ノードの下のSELECT
です。
INSERT ... SELECT
は挿入のためにModifyTable
に行を入力します。
UPDATE
では、プランナはすべての更新された列の値を含んだ行の演算結果と元の対象業のTID(タプルID、または行ID)を準備します。
このデータはModifyTable
ノードに入力され、ノードでは新しく更新された行の作成と古い行に削除の印を付けるためこの情報を利用します。
DELETE
では、計画から実際に返されるただ1つの列はTIDで、ModifyTable
ノードは単に各対象行を尋ね当てて削除の印を付けるためにこのTIDを使用します。
単純なINSERT ... VALUES
コマンドは、1つのResult
ノードからなる単純な計画ツリーを生成し、そのノードは結果としての行を1つだけ計算し、挿入を実行するためにその行がModifyTable
に入力されます。