ユーザーが要件をデータベースに適用すると、オプティマイザーは要求文字列を中間表現 (IR) に変換し、さまざまな変換を適用して最適な実行ビューを検索します。
Apache Calcite は関係演算子を中間表現として使用します。 このブログ投稿では、Apache Calcite における現代の関係演算子の発見について説明します。構文ツリー[0, 1]最適化の照会は、要求文字列が構文ツリーに変換されるときに構文解析から始まります。構文ツリーは、要求の構文構造を定義します。すべてのデータベースにはパーサーがあるため、構文ツリーは、凡例の中間表現の正当な候補のように見える可能性があります。 要求の IR としての構文ツリーには、次の 2 つの主要な懸念事項があります: ASTは非常にハードな構造です、ありがとう関連するANSI SQL構文に。 例として、「SELECT」ノードは、「FROM」、「WHERE」、「ORDER BY」、「GROUP BY」、およびその他のロード用に、おそらくさらに 1 つの専用の専用ノードになります。AST は構文構造をモデル化しますが、もはやリレーショナル セマンティクスではありません。 構文ツリーへの義務的なリレーショナル変換を計画することは、おそらく問題になるでしょう。 例として、ANSI SQL 構文では、半ベの部分を苦労して表現することはできなくなりました。混合、これにより、構文ツリーに対する要求の最適化が面倒になり、柔軟性がなくなります.関係ツリー別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
構文ツリー[0, 1]最適化の照会は、要求文字列が構文ツリーに変換されるときに構文解析から始まります。構文ツリーは、要求の構文構造を定義します。すべてのデータベースにはパーサーがあるため、構文ツリーは、凡例の中間表現の正当な候補のように見える可能性があります。 要求の IR としての構文ツリーには、次の 2 つの主要な懸念事項があります: ASTは非常にハードな構造です、ありがとう関連するANSI SQL構文に。 例として、「SELECT」ノードは、「FROM」、「WHERE」、「ORDER BY」、「GROUP BY」、およびその他のロード用に、おそらくさらに 1 つの専用の専用ノードになります。AST は構文構造をモデル化しますが、もはやリレーショナル セマンティクスではありません。 構文ツリーへの義務的なリレーショナル変換を計画することは、おそらく問題になるでしょう。 例として、ANSI SQL 構文では、半ベの部分を苦労して表現することはできなくなりました。混合、これにより、構文ツリーに対する要求の最適化が面倒になり、柔軟性がなくなります.関係ツリー別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
最適化の照会は、要求文字列が構文ツリーに変換されるときに構文解析から始まります。構文ツリーは、要求の構文構造を定義します。すべてのデータベースにはパーサーがあるため、構文ツリーは、凡例の中間表現の正当な候補のように見える可能性があります。 要求の IR としての構文ツリーには、次の 2 つの主要な懸念事項があります: ASTは非常にハードな構造です、ありがとう関連するANSI SQL構文に。 例として、「SELECT」ノードは、「FROM」、「WHERE」、「ORDER BY」、「GROUP BY」、およびその他のロード用に、おそらくさらに 1 つの専用の専用ノードになります。AST は構文構造をモデル化しますが、もはやリレーショナル セマンティクスではありません。 構文ツリーへの義務的なリレーショナル変換を計画することは、おそらく問題になるでしょう。 例として、ANSI SQL 構文では、半ベの部分を苦労して表現することはできなくなりました。混合、これにより、構文ツリーに対する要求の最適化が面倒になり、柔軟性がなくなります.関係ツリー別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
すべてのデータベースにはパーサーがあるため、構文ツリーは、凡例の中間表現の正当な候補のように見える可能性があります。 要求の IR としての構文ツリーには、次の 2 つの主要な懸念事項があります: ASTは非常にハードな構造です、ありがとう関連するANSI SQL構文に。 例として、「SELECT」ノードは、「FROM」、「WHERE」、「ORDER BY」、「GROUP BY」、およびその他のロード用に、おそらくさらに 1 つの専用の専用ノードになります。AST は構文構造をモデル化しますが、もはやリレーショナル セマンティクスではありません。 構文ツリーへの義務的なリレーショナル変換を計画することは、おそらく問題になるでしょう。 例として、ANSI SQL 構文では、半ベの部分を苦労して表現することはできなくなりました。混合、これにより、構文ツリーに対する要求の最適化が面倒になり、柔軟性がなくなります.関係ツリー別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
関係ツリー別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
別のIRは関係演算子木。 「Mission」、「Filter」、「Join」、「Combination」など、現代の関係演算子の概要を追加することもできます。 式の種類で表される需要は、関係演算子の凡例、スマートに概説されたスコープ、および個人的に最も注目を集める 1 つの入力全体 (結合演算子と住居演算子に加えて) を最適化するのにそれほど複雑ではありません。 これにより、演算子の転置によく似た、現代のリレーショナル最適化が劇的に簡素化されます。 また、実装者は、データベース構文のヒントとは無関係にオペレーターをモデル化する柔軟性を得ることができます.
主な欠点は、構文ツリーをリレーショナル ツリーに変換する必要があることです。特に、サブクエリや現代的なテーブル式などの高度な構文構造では、自明です。 それにもかかわらず、全体としての関係演算子の単純さと柔軟性は、翻訳に関する追加の労力を大幅に上回ります.Apache Calcite需要を構文木に解析します。 次に、SqlValidatorImpl を使用して、構文ツリーのセマンティック検証を実行します。 クラス、数式に沿って関連するデータ スタイルを解決します。 廃棄物では、検証済みの構文木がツリーまたは関係演算子 SqlToRelConverter[0, 1] の使用法に変換されます。 クラス。 次の最適化が関係ツリーで実行されます。この割り当てについて、Apache Calcite 関係演算子の検索について説明します。用語
いくつかの単純化された定義から始めましたが、それらはもはや正しくありませんが、このブログ投稿には十分です。
アン attribute は、タイトルと情報フォームのペアです。 属性支払い は、属性フォーム ドメインから属性タイトルと支払いによって概説されます。 タプル
は、属性値の順序付けられていない住居です。 タプル内の 2 つの属性値が、同じ属性タイトルをさらに個人化することはありません。 関係
はタプルの住居です。 リレーション内のすべてのタプルには、同じ属性の住居があります。 関係演算子
0 個、1 個、またはそれ以上の入力相対を見つけて、出力リレーションを見つけます。
演算子[0]関係演算子のツリーを作成するには、演算子の入力を概説する可能性が必要です。 多くのオペレーターは、入力親族の属性へのエントリーを見つけたいと思っています。 したがって、入力属性を参照する可能性も必要です。 これらは、関係演算子インターフェースの 2 つの重要な要件です。Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
- Mission
`Mission` 演算子は、検索する入力タプルに使用する行式を定義します新鮮なタプル。 オペレーターは、入力タプルごとに 1 つの出力タプルを生成します。 式はチェックリストにまとめられています。 Apache Calcite の凡例では、ネイティブ インデックスを使用して入力属性、`Mission` 演算子を参照します。属性のつぶやきを交換する必要がある場合はいつでも注入される可能性があります。 例として、属性を持つテーブルがある場合 `そのつぶやきの中で、「SELECT b, a FROM t」をストックします。必要に応じて属性を並べ替えるために、「TableScan」の上位に「Mission」演算子を追加する必要があります。 これは、オプティマイザが変換のヒントを採用するのに時間を費やすため、需要計画を複雑にします。 `Mission` オペレーターの物理的な実装では、入力 traits。 たとえば、`TableScan` が `[b]` で順序付けされたタプルを生成するが、`Mission` 演算子がその列に挑戦しなくなった場合、つぶやきは失われます
要求 `SELECT a, a+b FROM t` の関係ツリーは、おそらく次のようになります:

Filter`Filter` 演算子は、次のタプルを返します。述語を満たす。 述語は行式です。 `Filter` 出力の行形式は、入力の行形式に似ています。 全体の `Filter` 演算子の物理的な実装は、もはや入力特性を交換しません。 `SELECT a, a+b FROM t WHERE a+b>5` という要求は、次のように表現される可能性があります。 :電卓
`Calc` は、`Mission` と `Filter` 演算子のパフォーマンスを混合し、現代的な部分式の除去を実行する偶数演算子です。 内部的には、すべての複合行式を由緒ある式に分割します。 式はチェックリストにまとめられています。 特別な `RexLocalRef` ノードは兄弟をリンクするためにフェードされます。 「Mission」は、オペレーターから公開されることを望む式インデックスのチェックリストに変わります。 Filter は、入力タプルをフィルタリングする非強制式インデックスになります。
Apache Calcite はモードを提供します`Mission` および `Filter` オペレータの最適化のヒント。 これらの同じ最適化は、ほとんどの場合、実際にはヒント ロジックの複製が必要になるという凡例の Calc 演算子には実装されていません。 別の方法として、支払いベースのほぼ完全な最適化を解除することもできます。これは、最も注目を集める「Mission」および「Filter」操作による最適化であり、その後で「Mission」および「Filter」演算子を「Calc」に変換します。別のヒューリスティック フェーズ。 Apache Calcite は 専用のヒント [0:b, 1:SUM(a)] を提供します そのために。 多段階最適化については以前 で触れました。ブログ投稿.Combination
`Combination` 演算子は、集約関数の入力への適用をモデル化します。 演算子には、近傍キーと集計関数の 2 つの部分が含まれます。 近傍キーは、グループを作成するために使用する入力属性の概要を示します。 観測 `GROUP BY a, b` は、`a` と `b` がそれぞれ入力位置 0 と 1 に配置されている場合、グループ化キー `[0, 1]` を生成します。 常に `GROUP BY` 句が存在しなくなった場合、近傍キーは空になります。 ROLLUP や CUBE 句がある場合は、いくつかの近傍キーが存在する必要があります。 例として、`GROUP BY ROLLUP a, b` は、グループ化キー `[0,1]、[0]、[]` を生成します。 ` のグループを出力する `、`[a]` のグループ、およびグループ化されていない世界の集計。 `GROUP BY` オブザベーション内に式がある場合、それは下の別の `Mission` 演算子に移動されます「組み合わせ」。 これが、行式の定義とは別のものとして、近傍キーの入力属性インデックスを概説するだけで十分な理由です。 予測と集計の分離は、opt の複雑さを維持するために最も重要です。 管理下のimizationのヒント。 それ以外の場合は、「Combination」最適化のヒント内で「Mission」最適化のヒントからのロジックを繰り返します。集約関数は、グループに対して計算する必要がある集約のチェックリストです。 リフトアウトされた集約関数は、単一のタプルに使用される行式ではなく、タプルのペアに機能するという凡例の `RexNode` インターフェイスを使用しなくなりました。 近傍キーと同等の集計関数は、インデックスによって入力列を参照します。 例として、入力属性「a」がアドバイス 0 で見つかった場合、機能「SUM(a)」は「SUM(0)」に変換されます。同様に、高度な式は「組み合わせ」の下の「ミッション」演算子に移動されます。 `。 組み合わせ関数は、’DISTINCT’ フラグや非強制フィルターと同様に、個人的に開発されたプロパティを追加する可能性があります。 これらの関数については、今後のブログ投稿で説明します。 `Combination` 演算子は、近傍キーとそれに続く集約関数を出力します。 要求 `SELECT SUM(a), b GROUP BY b` の場合、関連付けられた `Combination` 演算子は `[0:b, 1:SUM(a)]`. を出力します。 以下の要求 `SELECT SUM(a+b), c FROM t GROUP BY c` のビューを凡例に取ります。 2 つの `Mission` 演算子を参照してください。1 つは `a+b` を計算し、もう 1 つは属性 `c` よりも早く `SUM` を出力します。Join `Join` 演算子は 2 つの入力。 演算子は、フォームの一部 (内側、左/事実/肉質の外側、セミ、その他をロード) と非必須の述語を定義します。 `Join` 演算子は、左の入力からすべての列を出力し、続いて実際の入力からすべての列を出力します。 「L」属性を持つ左の入力と「R」属性を持つ事実の入力が与えられた場合:参照の場合列インデックス `I` は 0 と `L` の間で一意であり、アドバイス `I` で左入力の属性を使用する可能性があります それ以外の場合は、`I – L` で実際の入力の属性を使用する可能性があります。 先に ウェブログ投稿、その支払いについて話しましたオプティマイザは、MEMO データ構造内でさまざまなプランを効果的にエンコードするために、演算子の等価プロパティに依存しています。 Apache Calcite では、`Join(AxB)` と `Join(BxA)` は意味的に同等ではなくなりました。Apache Calcite の凡例は、`RexInputRef` クラス内の属性インデックスに依存しています。 `Join(AxB)` および `Join(BxA)` のガーディアン オペレータは、属性の同じ部分に関連する場合、多様なインデックスを使用する必要があります。 述語の内部は、さまざまなインデックスで属性を参照する可能性さえあります.入力のつぶやき。 このルールを採用するには、(a) within 述語を書き直し、(b) 新しい `Join` の上に `Mission` を追加して、実際の属性のつぶやきを復元する必要があります。
この余分な「ミッション」は、他のヒントの実行を防ぎます。 例として、「JoinAssociate」ルールは、「(A は B の一部である) は C の一部である」を「A は (B は C の一部である)」の一部に並べ替えようとします。 ガイドラインは、例の「Join of the Join」のように見えます。 とはいえ、追加の「ミッション」で、個人的に最も注目を集めたのは「ミッションの頂点に立つ」です。 これを軽減するために、「Join」と「Mission」を転置する「JoinProjectTransposeRule」を追加で使用する可能性がありますが、これによりプランナーのパフォーマンスが劇的に低下し、Apache Calcite が完全な支払いベースのほとんどすべてを完全に取り除くことができなくなります。妥当な時間内に 5 ~ 6 よりも優れたテーブルを計画することの一部です。別の解決策は、見慣れない列名を取り上げることです。インデックス。 Spark Catalyst と CockroachDB は、この方法論を実践しています。 とはいえ、これにはなじみのない識別子をすべての同値近傍に導入する必要があり、それ自体がベンチャーになる可能性があります.Apache Calciteデマンド文字列を解析して構文ツリーにします。 次に、構文ツリーは関係演算子のツリーに変換されます。これにより、構造内の複雑さが軽減され、その後の最適化のためにより美しくなります。 Apache Calcite のいくつかの現代的な関係演算子について話しました。 「ミッション」は、入力からのすべてのタプルを別のタプルに変換します。 「Filter」演算子は、述語を泡立てる入力タプルを返します。 `Calc` は `Mission` と `Filter` のパフォーマンスを組み合わせて、現代的な部分式を排除します。 「組み合わせ」演算子はグループ化を実行し、集計関数を適用します。 `Join` 演算子はタプル 2 つの入力を結合し、述語を適用します。 関係演算子の設計は面倒です。 すべての献身は、新しい最適化の代替案をさらに開始する可能性がありますが、他のものをブロックします。 Apache Calcite のインデックスベースのほぼ完全な入力属性参照は、多くの最適化のヒントを必要とする単純化が、本質的に最も重要なオプティマイザ プロジェクトの 1 つに極度の懸念をもたらす場合の一種の交換オフの合法的な例です – be part of mumble 今後のブログ投稿では、Apache Calcite が特定の特定のオペレーターに適用される具体的な最適化について掘り下げることができます。 需要オプティマイザーで見つけられるようにする準備が常に整っています。 アップライト お知らせください.
Apache Calcite需要を構文木に解析します。 次に、SqlValidatorImpl を使用して、構文ツリーのセマンティック検証を実行します。 クラス、数式に沿って関連するデータ スタイルを解決します。 廃棄物では、検証済みの構文木がツリーまたは関係演算子 SqlToRelConverter[0, 1] の使用法に変換されます。 クラス。 次の最適化が関係ツリーで実行されます。この割り当てについて、Apache Calcite 関係演算子の検索について説明します。用語
いくつかの単純化された定義から始めましたが、それらはもはや正しくありませんが、このブログ投稿には十分です。
アン attribute は、タイトルと情報フォームのペアです。 属性支払い は、属性フォーム ドメインから属性タイトルと支払いによって概説されます。 タプル
は、属性値の順序付けられていない住居です。 タプル内の 2 つの属性値が、同じ属性タイトルをさらに個人化することはありません。 関係
はタプルの住居です。 リレーション内のすべてのタプルには、同じ属性の住居があります。 関係演算子
0 個、1 個、またはそれ以上の入力相対を見つけて、出力リレーションを見つけます。
演算子[0]関係演算子のツリーを作成するには、演算子の入力を概説する可能性が必要です。 多くのオペレーターは、入力親族の属性へのエントリーを見つけたいと思っています。 したがって、入力属性を参照する可能性も必要です。 これらは、関係演算子インターフェースの 2 つの重要な要件です。Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
- Mission
`Mission` 演算子は、検索する入力タプルに使用する行式を定義します新鮮なタプル。 オペレーターは、入力タプルごとに 1 つの出力タプルを生成します。 式はチェックリストにまとめられています。 Apache Calcite の凡例では、ネイティブ インデックスを使用して入力属性、`Mission` 演算子を参照します。属性のつぶやきを交換する必要がある場合はいつでも注入される可能性があります。 例として、属性を持つテーブルがある場合 `そのつぶやきの中で、「SELECT b, a FROM t」をストックします。必要に応じて属性を並べ替えるために、「TableScan」の上位に「Mission」演算子を追加する必要があります。 これは、オプティマイザが変換のヒントを採用するのに時間を費やすため、需要計画を複雑にします。 `Mission` オペレーターの物理的な実装では、入力 traits。 たとえば、`TableScan` が `[b]` で順序付けされたタプルを生成するが、`Mission` 演算子がその列に挑戦しなくなった場合、つぶやきは失われます
要求 `SELECT a, a+b FROM t` の関係ツリーは、おそらく次のようになります:

Filter`Filter` 演算子は、次のタプルを返します。述語を満たす。 述語は行式です。 `Filter` 出力の行形式は、入力の行形式に似ています。 全体の `Filter` 演算子の物理的な実装は、もはや入力特性を交換しません。 `SELECT a, a+b FROM t WHERE a+b>5` という要求は、次のように表現される可能性があります。 :電卓
`Calc` は、`Mission` と `Filter` 演算子のパフォーマンスを混合し、現代的な部分式の除去を実行する偶数演算子です。 内部的には、すべての複合行式を由緒ある式に分割します。 式はチェックリストにまとめられています。 特別な `RexLocalRef` ノードは兄弟をリンクするためにフェードされます。 「Mission」は、オペレーターから公開されることを望む式インデックスのチェックリストに変わります。 Filter は、入力タプルをフィルタリングする非強制式インデックスになります。
Apache Calcite はモードを提供します`Mission` および `Filter` オペレータの最適化のヒント。 これらの同じ最適化は、ほとんどの場合、実際にはヒント ロジックの複製が必要になるという凡例の Calc 演算子には実装されていません。 別の方法として、支払いベースのほぼ完全な最適化を解除することもできます。これは、最も注目を集める「Mission」および「Filter」操作による最適化であり、その後で「Mission」および「Filter」演算子を「Calc」に変換します。別のヒューリスティック フェーズ。 Apache Calcite は 専用のヒント [0:b, 1:SUM(a)] を提供します そのために。 多段階最適化については以前 で触れました。ブログ投稿.Combination
`Combination` 演算子は、集約関数の入力への適用をモデル化します。 演算子には、近傍キーと集計関数の 2 つの部分が含まれます。 近傍キーは、グループを作成するために使用する入力属性の概要を示します。 観測 `GROUP BY a, b` は、`a` と `b` がそれぞれ入力位置 0 と 1 に配置されている場合、グループ化キー `[0, 1]` を生成します。 常に `GROUP BY` 句が存在しなくなった場合、近傍キーは空になります。 ROLLUP や CUBE 句がある場合は、いくつかの近傍キーが存在する必要があります。 例として、`GROUP BY ROLLUP a, b` は、グループ化キー `[0,1]、[0]、[]` を生成します。 ` のグループを出力する `、`[a]` のグループ、およびグループ化されていない世界の集計。 `GROUP BY` オブザベーション内に式がある場合、それは下の別の `Mission` 演算子に移動されます「組み合わせ」。 これが、行式の定義とは別のものとして、近傍キーの入力属性インデックスを概説するだけで十分な理由です。 予測と集計の分離は、opt の複雑さを維持するために最も重要です。 管理下のimizationのヒント。 それ以外の場合は、「Combination」最適化のヒント内で「Mission」最適化のヒントからのロジックを繰り返します。集約関数は、グループに対して計算する必要がある集約のチェックリストです。 リフトアウトされた集約関数は、単一のタプルに使用される行式ではなく、タプルのペアに機能するという凡例の `RexNode` インターフェイスを使用しなくなりました。 近傍キーと同等の集計関数は、インデックスによって入力列を参照します。 例として、入力属性「a」がアドバイス 0 で見つかった場合、機能「SUM(a)」は「SUM(0)」に変換されます。同様に、高度な式は「組み合わせ」の下の「ミッション」演算子に移動されます。 `。 組み合わせ関数は、’DISTINCT’ フラグや非強制フィルターと同様に、個人的に開発されたプロパティを追加する可能性があります。 これらの関数については、今後のブログ投稿で説明します。 `Combination` 演算子は、近傍キーとそれに続く集約関数を出力します。 要求 `SELECT SUM(a), b GROUP BY b` の場合、関連付けられた `Combination` 演算子は `[0:b, 1:SUM(a)]`. を出力します。 以下の要求 `SELECT SUM(a+b), c FROM t GROUP BY c` のビューを凡例に取ります。 2 つの `Mission` 演算子を参照してください。1 つは `a+b` を計算し、もう 1 つは属性 `c` よりも早く `SUM` を出力します。Join `Join` 演算子は 2 つの入力。 演算子は、フォームの一部 (内側、左/事実/肉質の外側、セミ、その他をロード) と非必須の述語を定義します。 `Join` 演算子は、左の入力からすべての列を出力し、続いて実際の入力からすべての列を出力します。 「L」属性を持つ左の入力と「R」属性を持つ事実の入力が与えられた場合:参照の場合列インデックス `I` は 0 と `L` の間で一意であり、アドバイス `I` で左入力の属性を使用する可能性があります それ以外の場合は、`I – L` で実際の入力の属性を使用する可能性があります。 先に ウェブログ投稿、その支払いについて話しましたオプティマイザは、MEMO データ構造内でさまざまなプランを効果的にエンコードするために、演算子の等価プロパティに依存しています。 Apache Calcite では、`Join(AxB)` と `Join(BxA)` は意味的に同等ではなくなりました。Apache Calcite の凡例は、`RexInputRef` クラス内の属性インデックスに依存しています。 `Join(AxB)` および `Join(BxA)` のガーディアン オペレータは、属性の同じ部分に関連する場合、多様なインデックスを使用する必要があります。 述語の内部は、さまざまなインデックスで属性を参照する可能性さえあります.入力のつぶやき。 このルールを採用するには、(a) within 述語を書き直し、(b) 新しい `Join` の上に `Mission` を追加して、実際の属性のつぶやきを復元する必要があります。
この余分な「ミッション」は、他のヒントの実行を防ぎます。 例として、「JoinAssociate」ルールは、「(A は B の一部である) は C の一部である」を「A は (B は C の一部である)」の一部に並べ替えようとします。 ガイドラインは、例の「Join of the Join」のように見えます。 とはいえ、追加の「ミッション」で、個人的に最も注目を集めたのは「ミッションの頂点に立つ」です。 これを軽減するために、「Join」と「Mission」を転置する「JoinProjectTransposeRule」を追加で使用する可能性がありますが、これによりプランナーのパフォーマンスが劇的に低下し、Apache Calcite が完全な支払いベースのほとんどすべてを完全に取り除くことができなくなります。妥当な時間内に 5 ~ 6 よりも優れたテーブルを計画することの一部です。別の解決策は、見慣れない列名を取り上げることです。インデックス。 Spark Catalyst と CockroachDB は、この方法論を実践しています。 とはいえ、これにはなじみのない識別子をすべての同値近傍に導入する必要があり、それ自体がベンチャーになる可能性があります.Apache Calciteデマンド文字列を解析して構文ツリーにします。 次に、構文ツリーは関係演算子のツリーに変換されます。これにより、構造内の複雑さが軽減され、その後の最適化のためにより美しくなります。 Apache Calcite のいくつかの現代的な関係演算子について話しました。 「ミッション」は、入力からのすべてのタプルを別のタプルに変換します。 「Filter」演算子は、述語を泡立てる入力タプルを返します。 `Calc` は `Mission` と `Filter` のパフォーマンスを組み合わせて、現代的な部分式を排除します。 「組み合わせ」演算子はグループ化を実行し、集計関数を適用します。 `Join` 演算子はタプル 2 つの入力を結合し、述語を適用します。 関係演算子の設計は面倒です。 すべての献身は、新しい最適化の代替案をさらに開始する可能性がありますが、他のものをブロックします。 Apache Calcite のインデックスベースのほぼ完全な入力属性参照は、多くの最適化のヒントを必要とする単純化が、本質的に最も重要なオプティマイザ プロジェクトの 1 つに極度の懸念をもたらす場合の一種の交換オフの合法的な例です – be part of mumble 今後のブログ投稿では、Apache Calcite が特定の特定のオペレーターに適用される具体的な最適化について掘り下げることができます。 需要オプティマイザーで見つけられるようにする準備が常に整っています。 アップライト お知らせください.
を使用して、構文ツリーのセマンティック検証を実行します。 クラス、数式に沿って関連するデータ スタイルを解決します。 廃棄物では、検証済みの構文木がツリーまたは関係演算子 SqlToRelConverter[0, 1] の使用法に変換されます。 クラス。 次の最適化が関係ツリーで実行されます。この割り当てについて、Apache Calcite 関係演算子の検索について説明します。用語
いくつかの単純化された定義から始めましたが、それらはもはや正しくありませんが、このブログ投稿には十分です。
アン attribute は、タイトルと情報フォームのペアです。 属性支払い は、属性フォーム ドメインから属性タイトルと支払いによって概説されます。 タプル
は、属性値の順序付けられていない住居です。 タプル内の 2 つの属性値が、同じ属性タイトルをさらに個人化することはありません。 関係
はタプルの住居です。 リレーション内のすべてのタプルには、同じ属性の住居があります。 関係演算子
0 個、1 個、またはそれ以上の入力相対を見つけて、出力リレーションを見つけます。
演算子[0]関係演算子のツリーを作成するには、演算子の入力を概説する可能性が必要です。 多くのオペレーターは、入力親族の属性へのエントリーを見つけたいと思っています。 したがって、入力属性を参照する可能性も必要です。 これらは、関係演算子インターフェースの 2 つの重要な要件です。Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
- Mission
`Mission` 演算子は、検索する入力タプルに使用する行式を定義します新鮮なタプル。 オペレーターは、入力タプルごとに 1 つの出力タプルを生成します。 式はチェックリストにまとめられています。 Apache Calcite の凡例では、ネイティブ インデックスを使用して入力属性、`Mission` 演算子を参照します。属性のつぶやきを交換する必要がある場合はいつでも注入される可能性があります。 例として、属性を持つテーブルがある場合 `そのつぶやきの中で、「SELECT b, a FROM t」をストックします。必要に応じて属性を並べ替えるために、「TableScan」の上位に「Mission」演算子を追加する必要があります。 これは、オプティマイザが変換のヒントを採用するのに時間を費やすため、需要計画を複雑にします。 `Mission` オペレーターの物理的な実装では、入力 traits。 たとえば、`TableScan` が `[b]` で順序付けされたタプルを生成するが、`Mission` 演算子がその列に挑戦しなくなった場合、つぶやきは失われます
要求 `SELECT a, a+b FROM t` の関係ツリーは、おそらく次のようになります:

Filter`Filter` 演算子は、次のタプルを返します。述語を満たす。 述語は行式です。 `Filter` 出力の行形式は、入力の行形式に似ています。 全体の `Filter` 演算子の物理的な実装は、もはや入力特性を交換しません。 `SELECT a, a+b FROM t WHERE a+b>5` という要求は、次のように表現される可能性があります。 :電卓
`Calc` は、`Mission` と `Filter` 演算子のパフォーマンスを混合し、現代的な部分式の除去を実行する偶数演算子です。 内部的には、すべての複合行式を由緒ある式に分割します。 式はチェックリストにまとめられています。 特別な `RexLocalRef` ノードは兄弟をリンクするためにフェードされます。 「Mission」は、オペレーターから公開されることを望む式インデックスのチェックリストに変わります。 Filter は、入力タプルをフィルタリングする非強制式インデックスになります。
Apache Calcite はモードを提供します`Mission` および `Filter` オペレータの最適化のヒント。 これらの同じ最適化は、ほとんどの場合、実際にはヒント ロジックの複製が必要になるという凡例の Calc 演算子には実装されていません。 別の方法として、支払いベースのほぼ完全な最適化を解除することもできます。これは、最も注目を集める「Mission」および「Filter」操作による最適化であり、その後で「Mission」および「Filter」演算子を「Calc」に変換します。別のヒューリスティック フェーズ。 Apache Calcite は 専用のヒント [0:b, 1:SUM(a)] を提供します そのために。 多段階最適化については以前 で触れました。ブログ投稿.Combination
`Combination` 演算子は、集約関数の入力への適用をモデル化します。 演算子には、近傍キーと集計関数の 2 つの部分が含まれます。 近傍キーは、グループを作成するために使用する入力属性の概要を示します。 観測 `GROUP BY a, b` は、`a` と `b` がそれぞれ入力位置 0 と 1 に配置されている場合、グループ化キー `[0, 1]` を生成します。 常に `GROUP BY` 句が存在しなくなった場合、近傍キーは空になります。 ROLLUP や CUBE 句がある場合は、いくつかの近傍キーが存在する必要があります。 例として、`GROUP BY ROLLUP a, b` は、グループ化キー `[0,1]、[0]、[]` を生成します。 ` のグループを出力する `、`[a]` のグループ、およびグループ化されていない世界の集計。 `GROUP BY` オブザベーション内に式がある場合、それは下の別の `Mission` 演算子に移動されます「組み合わせ」。 これが、行式の定義とは別のものとして、近傍キーの入力属性インデックスを概説するだけで十分な理由です。 予測と集計の分離は、opt の複雑さを維持するために最も重要です。 管理下のimizationのヒント。 それ以外の場合は、「Combination」最適化のヒント内で「Mission」最適化のヒントからのロジックを繰り返します。集約関数は、グループに対して計算する必要がある集約のチェックリストです。 リフトアウトされた集約関数は、単一のタプルに使用される行式ではなく、タプルのペアに機能するという凡例の `RexNode` インターフェイスを使用しなくなりました。 近傍キーと同等の集計関数は、インデックスによって入力列を参照します。 例として、入力属性「a」がアドバイス 0 で見つかった場合、機能「SUM(a)」は「SUM(0)」に変換されます。同様に、高度な式は「組み合わせ」の下の「ミッション」演算子に移動されます。 `。 組み合わせ関数は、’DISTINCT’ フラグや非強制フィルターと同様に、個人的に開発されたプロパティを追加する可能性があります。 これらの関数については、今後のブログ投稿で説明します。 `Combination` 演算子は、近傍キーとそれに続く集約関数を出力します。 要求 `SELECT SUM(a), b GROUP BY b` の場合、関連付けられた `Combination` 演算子は `[0:b, 1:SUM(a)]`. を出力します。 以下の要求 `SELECT SUM(a+b), c FROM t GROUP BY c` のビューを凡例に取ります。 2 つの `Mission` 演算子を参照してください。1 つは `a+b` を計算し、もう 1 つは属性 `c` よりも早く `SUM` を出力します。Join `Join` 演算子は 2 つの入力。 演算子は、フォームの一部 (内側、左/事実/肉質の外側、セミ、その他をロード) と非必須の述語を定義します。 `Join` 演算子は、左の入力からすべての列を出力し、続いて実際の入力からすべての列を出力します。 「L」属性を持つ左の入力と「R」属性を持つ事実の入力が与えられた場合:参照の場合列インデックス `I` は 0 と `L` の間で一意であり、アドバイス `I` で左入力の属性を使用する可能性があります それ以外の場合は、`I – L` で実際の入力の属性を使用する可能性があります。 先に ウェブログ投稿、その支払いについて話しましたオプティマイザは、MEMO データ構造内でさまざまなプランを効果的にエンコードするために、演算子の等価プロパティに依存しています。 Apache Calcite では、`Join(AxB)` と `Join(BxA)` は意味的に同等ではなくなりました。Apache Calcite の凡例は、`RexInputRef` クラス内の属性インデックスに依存しています。 `Join(AxB)` および `Join(BxA)` のガーディアン オペレータは、属性の同じ部分に関連する場合、多様なインデックスを使用する必要があります。 述語の内部は、さまざまなインデックスで属性を参照する可能性さえあります.入力のつぶやき。 このルールを採用するには、(a) within 述語を書き直し、(b) 新しい `Join` の上に `Mission` を追加して、実際の属性のつぶやきを復元する必要があります。
この余分な「ミッション」は、他のヒントの実行を防ぎます。 例として、「JoinAssociate」ルールは、「(A は B の一部である) は C の一部である」を「A は (B は C の一部である)」の一部に並べ替えようとします。 ガイドラインは、例の「Join of the Join」のように見えます。 とはいえ、追加の「ミッション」で、個人的に最も注目を集めたのは「ミッションの頂点に立つ」です。 これを軽減するために、「Join」と「Mission」を転置する「JoinProjectTransposeRule」を追加で使用する可能性がありますが、これによりプランナーのパフォーマンスが劇的に低下し、Apache Calcite が完全な支払いベースのほとんどすべてを完全に取り除くことができなくなります。妥当な時間内に 5 ~ 6 よりも優れたテーブルを計画することの一部です。別の解決策は、見慣れない列名を取り上げることです。インデックス。 Spark Catalyst と CockroachDB は、この方法論を実践しています。 とはいえ、これにはなじみのない識別子をすべての同値近傍に導入する必要があり、それ自体がベンチャーになる可能性があります.Apache Calciteデマンド文字列を解析して構文ツリーにします。 次に、構文ツリーは関係演算子のツリーに変換されます。これにより、構造内の複雑さが軽減され、その後の最適化のためにより美しくなります。 Apache Calcite のいくつかの現代的な関係演算子について話しました。 「ミッション」は、入力からのすべてのタプルを別のタプルに変換します。 「Filter」演算子は、述語を泡立てる入力タプルを返します。 `Calc` は `Mission` と `Filter` のパフォーマンスを組み合わせて、現代的な部分式を排除します。 「組み合わせ」演算子はグループ化を実行し、集計関数を適用します。 `Join` 演算子はタプル 2 つの入力を結合し、述語を適用します。 関係演算子の設計は面倒です。 すべての献身は、新しい最適化の代替案をさらに開始する可能性がありますが、他のものをブロックします。 Apache Calcite のインデックスベースのほぼ完全な入力属性参照は、多くの最適化のヒントを必要とする単純化が、本質的に最も重要なオプティマイザ プロジェクトの 1 つに極度の懸念をもたらす場合の一種の交換オフの合法的な例です – be part of mumble 今後のブログ投稿では、Apache Calcite が特定の特定のオペレーターに適用される具体的な最適化について掘り下げることができます。 需要オプティマイザーで見つけられるようにする準備が常に整っています。 アップライト お知らせください.
この割り当てについて、Apache Calcite 関係演算子の検索について説明します。用語
アン attribute は、タイトルと情報フォームのペアです。 属性支払い は、属性フォーム ドメインから属性タイトルと支払いによって概説されます。 タプル
は、属性値の順序付けられていない住居です。 タプル内の 2 つの属性値が、同じ属性タイトルをさらに個人化することはありません。 関係
はタプルの住居です。 リレーション内のすべてのタプルには、同じ属性の住居があります。 関係演算子
0 個、1 個、またはそれ以上の入力相対を見つけて、出力リレーションを見つけます。
演算子[0]関係演算子のツリーを作成するには、演算子の入力を概説する可能性が必要です。 多くのオペレーターは、入力親族の属性へのエントリーを見つけたいと思っています。 したがって、入力属性を参照する可能性も必要です。 これらは、関係演算子インターフェースの 2 つの重要な要件です。Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
- Mission
`Mission` 演算子は、検索する入力タプルに使用する行式を定義します新鮮なタプル。 オペレーターは、入力タプルごとに 1 つの出力タプルを生成します。 式はチェックリストにまとめられています。 Apache Calcite の凡例では、ネイティブ インデックスを使用して入力属性、`Mission` 演算子を参照します。属性のつぶやきを交換する必要がある場合はいつでも注入される可能性があります。 例として、属性を持つテーブルがある場合 `そのつぶやきの中で、「SELECT b, a FROM t」をストックします。必要に応じて属性を並べ替えるために、「TableScan」の上位に「Mission」演算子を追加する必要があります。 これは、オプティマイザが変換のヒントを採用するのに時間を費やすため、需要計画を複雑にします。 `Mission` オペレーターの物理的な実装では、入力 traits。 たとえば、`TableScan` が `[b]` で順序付けされたタプルを生成するが、`Mission` 演算子がその列に挑戦しなくなった場合、つぶやきは失われます
要求 `SELECT a, a+b FROM t` の関係ツリーは、おそらく次のようになります:

Filter`Filter` 演算子は、次のタプルを返します。述語を満たす。 述語は行式です。 `Filter` 出力の行形式は、入力の行形式に似ています。 全体の `Filter` 演算子の物理的な実装は、もはや入力特性を交換しません。 `SELECT a, a+b FROM t WHERE a+b>5` という要求は、次のように表現される可能性があります。 :電卓
`Calc` は、`Mission` と `Filter` 演算子のパフォーマンスを混合し、現代的な部分式の除去を実行する偶数演算子です。 内部的には、すべての複合行式を由緒ある式に分割します。 式はチェックリストにまとめられています。 特別な `RexLocalRef` ノードは兄弟をリンクするためにフェードされます。 「Mission」は、オペレーターから公開されることを望む式インデックスのチェックリストに変わります。 Filter は、入力タプルをフィルタリングする非強制式インデックスになります。
Apache Calcite はモードを提供します`Mission` および `Filter` オペレータの最適化のヒント。 これらの同じ最適化は、ほとんどの場合、実際にはヒント ロジックの複製が必要になるという凡例の Calc 演算子には実装されていません。 別の方法として、支払いベースのほぼ完全な最適化を解除することもできます。これは、最も注目を集める「Mission」および「Filter」操作による最適化であり、その後で「Mission」および「Filter」演算子を「Calc」に変換します。別のヒューリスティック フェーズ。 Apache Calcite は 専用のヒント [0:b, 1:SUM(a)] を提供します そのために。 多段階最適化については以前 で触れました。ブログ投稿.Combination
`Combination` 演算子は、集約関数の入力への適用をモデル化します。 演算子には、近傍キーと集計関数の 2 つの部分が含まれます。 近傍キーは、グループを作成するために使用する入力属性の概要を示します。 観測 `GROUP BY a, b` は、`a` と `b` がそれぞれ入力位置 0 と 1 に配置されている場合、グループ化キー `[0, 1]` を生成します。 常に `GROUP BY` 句が存在しなくなった場合、近傍キーは空になります。 ROLLUP や CUBE 句がある場合は、いくつかの近傍キーが存在する必要があります。 例として、`GROUP BY ROLLUP a, b` は、グループ化キー `[0,1]、[0]、[]` を生成します。 ` のグループを出力する `、`[a]` のグループ、およびグループ化されていない世界の集計。 `GROUP BY` オブザベーション内に式がある場合、それは下の別の `Mission` 演算子に移動されます「組み合わせ」。 これが、行式の定義とは別のものとして、近傍キーの入力属性インデックスを概説するだけで十分な理由です。 予測と集計の分離は、opt の複雑さを維持するために最も重要です。 管理下のimizationのヒント。 それ以外の場合は、「Combination」最適化のヒント内で「Mission」最適化のヒントからのロジックを繰り返します。集約関数は、グループに対して計算する必要がある集約のチェックリストです。 リフトアウトされた集約関数は、単一のタプルに使用される行式ではなく、タプルのペアに機能するという凡例の `RexNode` インターフェイスを使用しなくなりました。 近傍キーと同等の集計関数は、インデックスによって入力列を参照します。 例として、入力属性「a」がアドバイス 0 で見つかった場合、機能「SUM(a)」は「SUM(0)」に変換されます。同様に、高度な式は「組み合わせ」の下の「ミッション」演算子に移動されます。 `。 組み合わせ関数は、’DISTINCT’ フラグや非強制フィルターと同様に、個人的に開発されたプロパティを追加する可能性があります。 これらの関数については、今後のブログ投稿で説明します。 `Combination` 演算子は、近傍キーとそれに続く集約関数を出力します。 要求 `SELECT SUM(a), b GROUP BY b` の場合、関連付けられた `Combination` 演算子は `[0:b, 1:SUM(a)]`. を出力します。 以下の要求 `SELECT SUM(a+b), c FROM t GROUP BY c` のビューを凡例に取ります。 2 つの `Mission` 演算子を参照してください。1 つは `a+b` を計算し、もう 1 つは属性 `c` よりも早く `SUM` を出力します。Join `Join` 演算子は 2 つの入力。 演算子は、フォームの一部 (内側、左/事実/肉質の外側、セミ、その他をロード) と非必須の述語を定義します。 `Join` 演算子は、左の入力からすべての列を出力し、続いて実際の入力からすべての列を出力します。 「L」属性を持つ左の入力と「R」属性を持つ事実の入力が与えられた場合:参照の場合列インデックス `I` は 0 と `L` の間で一意であり、アドバイス `I` で左入力の属性を使用する可能性があります それ以外の場合は、`I – L` で実際の入力の属性を使用する可能性があります。 先に ウェブログ投稿、その支払いについて話しましたオプティマイザは、MEMO データ構造内でさまざまなプランを効果的にエンコードするために、演算子の等価プロパティに依存しています。 Apache Calcite では、`Join(AxB)` と `Join(BxA)` は意味的に同等ではなくなりました。Apache Calcite の凡例は、`RexInputRef` クラス内の属性インデックスに依存しています。 `Join(AxB)` および `Join(BxA)` のガーディアン オペレータは、属性の同じ部分に関連する場合、多様なインデックスを使用する必要があります。 述語の内部は、さまざまなインデックスで属性を参照する可能性さえあります.入力のつぶやき。 このルールを採用するには、(a) within 述語を書き直し、(b) 新しい `Join` の上に `Mission` を追加して、実際の属性のつぶやきを復元する必要があります。
この余分な「ミッション」は、他のヒントの実行を防ぎます。 例として、「JoinAssociate」ルールは、「(A は B の一部である) は C の一部である」を「A は (B は C の一部である)」の一部に並べ替えようとします。 ガイドラインは、例の「Join of the Join」のように見えます。 とはいえ、追加の「ミッション」で、個人的に最も注目を集めたのは「ミッションの頂点に立つ」です。 これを軽減するために、「Join」と「Mission」を転置する「JoinProjectTransposeRule」を追加で使用する可能性がありますが、これによりプランナーのパフォーマンスが劇的に低下し、Apache Calcite が完全な支払いベースのほとんどすべてを完全に取り除くことができなくなります。妥当な時間内に 5 ~ 6 よりも優れたテーブルを計画することの一部です。別の解決策は、見慣れない列名を取り上げることです。インデックス。 Spark Catalyst と CockroachDB は、この方法論を実践しています。 とはいえ、これにはなじみのない識別子をすべての同値近傍に導入する必要があり、それ自体がベンチャーになる可能性があります.Apache Calciteデマンド文字列を解析して構文ツリーにします。 次に、構文ツリーは関係演算子のツリーに変換されます。これにより、構造内の複雑さが軽減され、その後の最適化のためにより美しくなります。 Apache Calcite のいくつかの現代的な関係演算子について話しました。 「ミッション」は、入力からのすべてのタプルを別のタプルに変換します。 「Filter」演算子は、述語を泡立てる入力タプルを返します。 `Calc` は `Mission` と `Filter` のパフォーマンスを組み合わせて、現代的な部分式を排除します。 「組み合わせ」演算子はグループ化を実行し、集計関数を適用します。 `Join` 演算子はタプル 2 つの入力を結合し、述語を適用します。 関係演算子の設計は面倒です。 すべての献身は、新しい最適化の代替案をさらに開始する可能性がありますが、他のものをブロックします。 Apache Calcite のインデックスベースのほぼ完全な入力属性参照は、多くの最適化のヒントを必要とする単純化が、本質的に最も重要なオプティマイザ プロジェクトの 1 つに極度の懸念をもたらす場合の一種の交換オフの合法的な例です – be part of mumble 今後のブログ投稿では、Apache Calcite が特定の特定のオペレーターに適用される具体的な最適化について掘り下げることができます。 需要オプティマイザーで見つけられるようにする準備が常に整っています。 アップライト お知らせください.
- Mission
`Mission` 演算子は、検索する入力タプルに使用する行式を定義します新鮮なタプル。 オペレーターは、入力タプルごとに 1 つの出力タプルを生成します。 式はチェックリストにまとめられています。
Apache Calcite の凡例では、ネイティブ インデックスを使用して入力属性、`Mission` 演算子を参照します。属性のつぶやきを交換する必要がある場合はいつでも注入される可能性があります。 例として、属性を持つテーブルがある場合 `そのつぶやきの中で、「SELECT b, a FROM t」をストックします。必要に応じて属性を並べ替えるために、「TableScan」の上位に「Mission」演算子を追加する必要があります。 これは、オプティマイザが変換のヒントを採用するのに時間を費やすため、需要計画を複雑にします。 `Mission` オペレーターの物理的な実装では、入力 traits。 たとえば、`TableScan` が `[b]` で順序付けされたタプルを生成するが、`Mission` 演算子がその列に挑戦しなくなった場合、つぶやきは失われます
要求 `SELECT a, a+b FROM t` の関係ツリーは、おそらく次のようになります:
Filter
`Filter` 演算子は、次のタプルを返します。述語を満たす。 述語は行式です。 `Filter` 出力の行形式は、入力の行形式に似ています。 全体の `Filter` 演算子の物理的な実装は、もはや入力特性を交換しません。
`SELECT a, a+b FROM t WHERE a+b>5` という要求は、次のように表現される可能性があります。 :
電卓
`Calc` は、`Mission` と `Filter` 演算子のパフォーマンスを混合し、現代的な部分式の除去を実行する偶数演算子です。 内部的には、すべての複合行式を由緒ある式に分割します。 式はチェックリストにまとめられています。 特別な `RexLocalRef` ノードは兄弟をリンクするためにフェードされます。 「Mission」は、オペレーターから公開されることを望む式インデックスのチェックリストに変わります。 Filter は、入力タプルをフィルタリングする非強制式インデックスになります。
Apache Calcite はモードを提供します`Mission` および `Filter` オペレータの最適化のヒント。 これらの同じ最適化は、ほとんどの場合、実際にはヒント ロジックの複製が必要になるという凡例の Calc 演算子には実装されていません。 別の方法として、支払いベースのほぼ完全な最適化を解除することもできます。これは、最も注目を集める「Mission」および「Filter」操作による最適化であり、その後で「Mission」および「Filter」演算子を「Calc」に変換します。別のヒューリスティック フェーズ。 Apache Calcite は 専用のヒント [0:b, 1:SUM(a)] を提供します そのために。 多段階最適化については以前 で触れました。ブログ投稿.
Combination
`Combination` 演算子は、集約関数の入力への適用をモデル化します。 演算子には、近傍キーと集計関数の 2 つの部分が含まれます。
近傍キーは、グループを作成するために使用する入力属性の概要を示します。 観測 `GROUP BY a, b` は、`a` と `b` がそれぞれ入力位置 0 と 1 に配置されている場合、グループ化キー `[0, 1]` を生成します。 常に `GROUP BY` 句が存在しなくなった場合、近傍キーは空になります。
ROLLUP や CUBE 句がある場合は、いくつかの近傍キーが存在する必要があります。 例として、`GROUP BY ROLLUP a, b` は、グループ化キー `[0,1]、[0]、[]` を生成します。 ` のグループを出力する `、`[a]` のグループ、およびグループ化されていない世界の集計。`GROUP BY` オブザベーション内に式がある場合、それは下の別の `Mission` 演算子に移動されます「組み合わせ」。 これが、行式の定義とは別のものとして、近傍キーの入力属性インデックスを概説するだけで十分な理由です。 予測と集計の分離は、opt の複雑さを維持するために最も重要です。 管理下のimizationのヒント。 それ以外の場合は、「Combination」最適化のヒント内で「Mission」最適化のヒントからのロジックを繰り返します。集約関数は、グループに対して計算する必要がある集約のチェックリストです。 リフトアウトされた集約関数は、単一のタプルに使用される行式ではなく、タプルのペアに機能するという凡例の `RexNode` インターフェイスを使用しなくなりました。 近傍キーと同等の集計関数は、インデックスによって入力列を参照します。 例として、入力属性「a」がアドバイス 0 で見つかった場合、機能「SUM(a)」は「SUM(0)」に変換されます。同様に、高度な式は「組み合わせ」の下の「ミッション」演算子に移動されます。 `。 組み合わせ関数は、’DISTINCT’ フラグや非強制フィルターと同様に、個人的に開発されたプロパティを追加する可能性があります。 これらの関数については、今後のブログ投稿で説明します。
`Combination` 演算子は、近傍キーとそれに続く集約関数を出力します。 要求 `SELECT SUM(a), b GROUP BY b` の場合、関連付けられた `Combination` 演算子は `[0:b, 1:SUM(a)]`.
を出力します。
以下の要求 `SELECT SUM(a+b), c FROM t GROUP BY c` のビューを凡例に取ります。 2 つの `Mission` 演算子を参照してください。1 つは `a+b` を計算し、もう 1 つは属性 `c` よりも早く `SUM` を出力します。Join
`Join` 演算子は 2 つの入力。 演算子は、フォームの一部 (内側、左/事実/肉質の外側、セミ、その他をロード) と非必須の述語を定義します。
`Join` 演算子は、左の入力からすべての列を出力し、続いて実際の入力からすべての列を出力します。 「L」属性を持つ左の入力と「R」属性を持つ事実の入力が与えられた場合:参照の場合列インデックス `I` は 0 と `L` の間で一意であり、アドバイス `I` で左入力の属性を使用する可能性があります それ以外の場合は、`I – L` で実際の入力の属性を使用する可能性があります。
先に ウェブログ投稿、その支払いについて話しましたオプティマイザは、MEMO データ構造内でさまざまなプランを効果的にエンコードするために、演算子の等価プロパティに依存しています。 Apache Calcite では、`Join(AxB)` と `Join(BxA)` は意味的に同等ではなくなりました。Apache Calcite の凡例は、`RexInputRef` クラス内の属性インデックスに依存しています。 `Join(AxB)` および `Join(BxA)` のガーディアン オペレータは、属性の同じ部分に関連する場合、多様なインデックスを使用する必要があります。 述語の内部は、さまざまなインデックスで属性を参照する可能性さえあります.
入力のつぶやき。 このルールを採用するには、(a) within 述語を書き直し、(b) 新しい `Join` の上に `Mission` を追加して、実際の属性のつぶやきを復元する必要があります。
この余分な「ミッション」は、他のヒントの実行を防ぎます。 例として、「JoinAssociate」ルールは、「(A は B の一部である) は C の一部である」を「A は (B は C の一部である)」の一部に並べ替えようとします。 ガイドラインは、例の「Join of the Join」のように見えます。 とはいえ、追加の「ミッション」で、個人的に最も注目を集めたのは「ミッションの頂点に立つ」です。 これを軽減するために、「Join」と「Mission」を転置する「JoinProjectTransposeRule」を追加で使用する可能性がありますが、これによりプランナーのパフォーマンスが劇的に低下し、Apache Calcite が完全な支払いベースのほとんどすべてを完全に取り除くことができなくなります。妥当な時間内に 5 ~ 6 よりも優れたテーブルを計画することの一部です。別の解決策は、見慣れない列名を取り上げることです。インデックス。 Spark Catalyst と CockroachDB は、この方法論を実践しています。 とはいえ、これにはなじみのない識別子をすべての同値近傍に導入する必要があり、それ自体がベンチャーになる可能性があります.
Apache Calciteデマンド文字列を解析して構文ツリーにします。 次に、構文ツリーは関係演算子のツリーに変換されます。これにより、構造内の複雑さが軽減され、その後の最適化のためにより美しくなります。
Apache Calcite のいくつかの現代的な関係演算子について話しました。 「ミッション」は、入力からのすべてのタプルを別のタプルに変換します。 「Filter」演算子は、述語を泡立てる入力タプルを返します。 `Calc` は `Mission` と `Filter` のパフォーマンスを組み合わせて、現代的な部分式を排除します。 「組み合わせ」演算子はグループ化を実行し、集計関数を適用します。 `Join` 演算子はタプル 2 つの入力を結合し、述語を適用します。
関係演算子の設計は面倒です。 すべての献身は、新しい最適化の代替案をさらに開始する可能性がありますが、他のものをブロックします。 Apache Calcite のインデックスベースのほぼ完全な入力属性参照は、多くの最適化のヒントを必要とする単純化が、本質的に最も重要なオプティマイザ プロジェクトの 1 つに極度の懸念をもたらす場合の一種の交換オフの合法的な例です – be part of mumble
今後のブログ投稿では、Apache Calcite が特定の特定のオペレーターに適用される具体的な最適化について掘り下げることができます。
需要オプティマイザーで見つけられるようにする準備が常に整っています。 アップライト お知らせください.
演算子[0]関係演算子のツリーを作成するには、演算子の入力を概説する可能性が必要です。 多くのオペレーターは、入力親族の属性へのエントリーを見つけたいと思っています。 したがって、入力属性を参照する可能性も必要です。 これらは、関係演算子インターフェースの 2 つの重要な要件です。Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
Apache Calcite では、関係演算子は RelNode ) インターフェース。 オペレーターは、0 個、1 個、または複数の入力オペレーターを個人的に追加する可能性があります。 例として、「TableScan」は 0 項演算子、「Filter」は単項演算子、「Union」は N 項演算子です。 すべてのオペレーターは、オペレーター属性の順序付きチェックリストである `RelDataType` を公開します。 ここでは、任意の高度なリレーショナル ツリーを作成するのに十分です。
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.

行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
行式 )オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
オペレーターは、タプルへの多様な変換をチェックリストに入れます。 A RexNode インターフェイスは、タプルの属性値について適用され、もう 1 つの支払いを生成する操作を定義します。 通常の `RexNode` スタイル:`RexLiteral` – 定数`RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
- `RexInputRef` – オペレーターの入力属性への参照
`RexCall` – 機能名.
例として、`title=”John”` という表現は次のように表されます。 `RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.
今基本を理解しているので、基本的に最も伝統的な Apache Calcite 演算子について説明しましょう: `TableScan`、`Mission`、`Filter`、`Calc`、`Combination`、および `Join`.さまざまな重要な演算子は `Window` と `Union` です。 以前に話した演算子と同じ検索原則を実践しているという伝説について、このブログ投稿で詳しく説明しています。TableScan
`TableScan` は、データ ソースのスキャンを定義する葉の 0-ary 演算子です。オペレーターには、タプルを生成する情報ソースを記述する `org.apache.calcite.schema.Desk` インスタンスが含まれています。 それは、リレーショナル テーブル、インデックス、参照、CSV ファイル、コミュニティ接続、またはその他のものを追加的に描写する可能性が最も高いでしょう。 実装者として、いくつかの `Desk` ケースを含むデータベースのスキーマを提供します。 Apache Calcite は、参照された「Desk」を使用して「TableScan」オペレーターを作成し、要求内でそのテーブルを参照する個人的なものになる可能性があります。 `Desk` は、親オペレータが `TableScan` から手元にある属性を知ることができるように、行フォームを明らかにする必要があります.
`RexInputRef` がインデックスによって入力の属性を参照していることを確認してください。この式は、Apache Calcite では最も重要な属性です。 知的面では、属性名と実行可能な名前の競合を気にする必要がなくなるため、検索が簡素化されます (同じタイトルの属性を個人的に持つ 2 つのテーブルの一部である)。 反対に、以下で要求するように、計画の一部に有害なリフトアウトがあります.