エクゼキュータ

エクゼキュータはプランナ/オプティマイザによって 戻されたプランを取得し、最上ノードの処理を開始します。ここにあげた例 (例 \ref{simple_select} で与えられた問合せ)の場合、最上ノードは MergeJoin ノードです。

マージ処理をする前に(それぞれのサブプランから)対のタプルがフェッチされなければ なりません。従い、エグゼキュータはそれ自身を再帰的に(lefttree に付 いているサブプランから始めて)サブプランの処理のため呼び出します。 新しい最上ノード(左の サブプランの最上ノード)は SeqScan ノードで、ノード自身が処理 される前、同様にタプルがフェッチされていなければなりません。 SeqScan ノードの lefttree に付くサブプランに 対してエグゼキュータは再帰的に別途自分自身を呼び出します。

ここに至って、新規の最上ノードは Sort です。ソートは全体の リレーションに亘って行われなければならないため、エグゼキュータは Sort ノードの サブプランからタプルのフェッチを開始して、Sort ノードが始めて巡回 された時には(メモリまたはファイルとして)暫定リレーションにソート結果を出力します。 (以降の Sort ノードの検証ではソートされた暫定リレーション から、たった一つのタプルが常に戻されます。)

Sort ノードの処理にはいつでも、エクゼキュータが再帰的に呼び出される サブプランとして付けられた SeqScan ノードに対する新規タプルが必要です。 リレーション(内部的には scanrelid フィールドによって参照されます) は次のタプルに対しスキャンされます。qpqual に付いたツリーによって 与えられた条件をタプルが満たしていれば、そのタプルは返され、そうでなければ条件 が満足されるまで次のタプルがフェッチされます。リレーションの最後のタプルが処理 されると NULL ポインタが返されます。

MergeJoinlefttree によってタプルが 返された後、同様にして righttree が処理されます。 もし二つのタプルが実存すれば、エグゼキュータは MergeJoin ノード の処理を行います。サブプランのどれかからの新規タプルが必要とされた場合、 それを取得するためエクゼキュータに対して再帰的に呼び出しが行われます。 join したタプルが生成された場合、そのタプルは戻されて、一つのプランツリーの処理が 完結します。

MergeJoin ノードの処理に対して、処理の完了を意味する NULL ポインタが返されるまで上に記述したステップがそれ ぞれのタプルに対して一度づつ行われます。