2.6. エクゼキュータ

エクゼキュータは、プランナ/オプティマイザから返された計画を受け取り、頂点のノードの処理を始めます。ここでの例の場合(\xref linkend={simple-select} の問い合わせの例)、頂点のノードは MergeJoin ノードです。

いかなるマージも実行される前に 2 つのタプル(それぞれのサブプランから 1 つづつ)を取って来なくてはいけません。ですからエクゼキュータはサブプランを処理するために自分自身を再帰的に呼び出します(lefttreeに付随するサブプランから開始します)。新しい頂点のノード(左のサブプランの頂点のノード)は SeqScan ノードで、ここでもノード自体が処理される前にタプルを取って来なくてはいけません。エクゼキュータは SeqScan ノードの lefttree に付随したサブプランのために自分自身を別途再帰的に呼び出します。

ここで新規の頂点のノードは Sort ノードです。ソートはリレーション全体わたって行わなければならないため、エクゼキュータは Sort ノードのサブプランからタプルを取り始め、Sort ノードが始めて読み込まれた段階で暫定的リレーション(メモリもしくはファイル上)の中にソートします。(Sort ノードをさらに検査しようとすると、必ずソート済みの暫定的リレーションからタプルが 1 つだけ返ります。)

Sort ノードの処理において新しいタプルを必要とするたびに、サブプランとして付随された SeqScan ノードのためにエクゼキュータが再帰的に呼び出されます。(内部的には scanrelid フィールドで与えられた値で参照される)そのリレーションは次のタプルのためにスキャンされます。もしそのタプルが qpqual に付随したツリーによる制約を満たせばはそのタプは返されますが、制約にかなわなかった時は制約が満たされるまで次のタプルが読み込まれます。リレーション上の最後のタプルが処理されれば NULL ポインタが返されます。

MergeJoinlefttree からタプルが返されると、righttree が同じように処理されます。両方のタプルが存在する場合、エクゼキュータは MergeJoin ノードを処理します。サブプランの 1 つからタプルが必要とされる時はいつでも、タプルを取得するためエクゼキュータへの再帰呼び出しが行われます。結合されたタプルが作られればそのタプルは返されて一連の計画ツリーの処理が完了します。

ここで解説した手順は MergeJoin ノード処理において NULL ポインタが返され処理が完了したことを知らせるまでタプルごとに 1 回だけ実行されます。