2.6. エグゼキュータ

エグゼキュータはプランナ/オプティマイザから返 された 計画を受け取り頂点のノードの実行を始めます。ここでの例の場合 (例\ref{simple_select} で与えられる問い合わせ)、頂点のノードはMergeJoin ノードです。

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

ここで頂点のノードはSortノードになります。ソートは リレーション全体に かけられなければならないため、エグゼキュータはSort ノードのサブプラン からタプルをとりはじめ、Sortノードが始めて読みこま れたときは一時 リレーション(メモリーもしくはファイル上)にそれらをソートします。 (Sort ノードのさらなる検査は、常にソートされた一時リレーションからタプルを 一つだけ返します。)

Sortの実行に新しいタプルが必要になると、サブプラン として付随された SeqScanノードのためにエグゼキュータが再帰的に呼び出 されます。そのリレーション (scanrelidフィールドで与えられた値に内部的に参照 される)は次のタプル のためにスキャンされます。もしそのタプルがqpqualに 付随するツリーで与えられる 制約を満たす場合、それは返されます。そうでない場合、制約が満たされるまで 次のタプルが とられます。もしリレーション上の最後のタプルがプロセスされた場合は、 NULL ポインタが返されます。

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

ここで説明された処置は、MergeJoinノード実行の NULLポインタ が返され処理が終ったことを知らせるまで、タプルごとに一回ずつ実行されます。