効率的な物理計画の構築: 論理クエリから演算子の実装まで

I.はじめに

この記事では、クエリ ステートメントが論理プランから物理プランを生成する方法を主に紹介します。クエリ ステートメントによって実行される操作とそれに関連するテーブル情報は、 論理プランのPlanNode に格納されます。物理プランの構築は、 論理プランのPlanNodeを分析することによって、対応する PlanNode を対応する演算子 (Processor )に変換することです。次に、 Stream 経由で接続します

この記事の内容を理解しやすくするために、まず次の 3 つの概念を簡単に紹介します。

  • 物理プラン: 物理プラン。アルゴリズムを実装する論理クエリ プランの各演算子を選択し、これらの演算子の実行順序を選択することによって得られるプラン。
  • プロセッサ: 物理プランによって取得された結果。ステートメントによって実行される演算子、実行する必要がある演算子、分散システムでの実行のために演算子をどのノードに送信する必要があるかなどの情報が格納されます。
  • Stream : Processor に保存されている情報 。Processor 内のオペレーターの実行順序と実行ノードの情報をマークし ます 

2. 物理計画の構築

次のSQL ステートメントによる物理計画の生成を紹介します 

select max(height),class from heights join students on heights.id=students.id group by class having class in(1,2) order by max(height) desc limit 2;

クエリ ステートメントの PlanNode を 次の図に示します。

前述の PlanNode を 例にとると、最下位層は 2 つの scanNodeで、 それぞれ身長 と 生徒 の完全な テーブル スキャン であり、結果は上位層 のjoinNodeに返さ れます仮想テーブルを生成します。両方のテーブルにすべての列があります。

上位層の renderNode は この仮想テーブルにクエリを実行してheight 列と class 列をフィルタリングし groupNode は class 列 を グループ化し 、  class に対して最大 集計を実行します 。次に、  sortNode は groupNode によって 処理された 最大 集計結果を並べ替え、 limitNode は その結果に対して対応する操作を実行します。最後に、最上位の renderNode は 結果をクエリし、  max(height) 列と class 列をフィルターで除外します。以上がPlanNode の詳細情報です 

次に、  PlanNode が 解析され、 createPlanForNode 関数 を通じて物理プランが生成されます。この関数は再帰関数であり、  PlanNode のタイプを通じて対応する物理プランを構築します。

上記のクエリ ステートメントを例にとると、  PlanNode は 最初にscanNode 構築関数 createTableReaders を再帰的に実行 し 、次にinitTableReaderSpec を通じて テーブルリーダー 仕様を作成し 、次に論理 plan から渡された plannode を通じて演算子の フィルター と 制限を取得します次に、  MakeExpression() を通じて物理プランのフィルター を構築し 、 そのフィルター と 制限を post に渡します 

最後に、 planCtx の isLocal で 分散読み取りプランかどうかを判断します。

  • その場合は、  SpanPartition 配列を構築し、 各ノードからテーブル の値を読み取ります

  • そうでない場合は、ローカル データを読み取るだけです。

具体的なプロセスを次の図に示します

leftscanNode と right scanNode のプランを 構築すると rightPlan と leftPlanが得られ、 LeftPlan と rightPlan は MergePlans() を実行して 左右のプランをマージし、左右のプランの プロセッサー と ストリーム 情報をマージします。 

分散実行かどうかの判断手順は上記の判断方法と同様です。最後に、  leftMergeOrd.Columns が nilに等しいかどうかを 判断します

  • その場合は、 hashjoinspecをビルドします 

  • そうでない場合は、  mergejoinspec をビルドします

AddjoinStage() を実行して 、指定したノードにjoinProcessor を 追加 し、左右の 出力を これらのProcessors に接続しjoinNode の処理を​​行う基本的な流れは下図のとおりです。renderNode 、  groupNode 、  sortNode などを順番に処理し 、対応するオペレーター情報を物理プランに追加します。 

Microsoft の公式発表: Visual Studio for Mac が廃止 中国の開発者チームによって作成されたプログラミング言語: MoonBit (月のウサギ) C++ の父、Bjarne Stroustrup が人生のアドバイスを共有 Linus も乱雑な略語を嫌い、TM は「GenPD」と呼ばれるもの Rust 1.72 .0 リリース、将来的にサポートされる最小バージョンは Windows 10 ウェンシン・イーヤン、 WordPress を 全社会に開放し「100 年計画」を開始 : Crumb green language V1.0 正式リリース
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5148943/blog/10092169