Pushdown

連携データベースシステムでは、PushdownはUserレベルのクエリをソースクエリに分解し、それぞれのソースシステムで可能な限りの作業を実行します。Pushdown 分析にはソースシステムの機能に関する知識が必要ですが、これはConnector API を通じてCData Virtuality Server に提供されます。Sourcesで実行されなかった作業は、Federateのリレーショナルエンジンで処理されます。

能力に基づき、CData Virtuality Server はクエリプランを操作し、各ソースが可能な限り結合、フィルタリング、グループ化などを実行するようにします。Join Pushdownは、Standard Relational Techniquesとコストベースのヒューリスティックを組み合わせ、結合順序などの多くのケースでPushdown最適化を行います。

CRITERIAとJOINのプッシュダウンは、パフォーマンスが懸念される場合、プッシュダウンするクエリの最も重要な側面です。ソースクエリを可能な限り効率的にするためのプランの読み方についてはQuery Plansを参照してください。

Dependent Joins

Dependent Joinと呼ばれる特別なOptimizationは、Multi-Source Joinに関係する2つのリレーションのどちらかから返される行を減らします。Dependent Joinでは、クエリは並列ではなく、各ソースに対して順次発行され、1つ目のソースから得られた結果は2つ目のソースから返されるレコードを制限するために使用されます。Dependent Joinは、2つ目のソースから取得するデータ量と、実行しなければならない結合比較の数を大幅に削減することで、一部の結合をより高速に実行することができます。

Queryプランナは、Dependent Joinが使用される時の条件をヒントと原価情報に基づいて決定します。

CData Virtuality Server は、Dependent Join の動作を制御するためのヒントをサポートしています:

  • MAKEIND - はこのClauseがDependent Joinの独立側であることを示します;
  • MAKEDEP - はそのClauseがJoinのDependent側であることを示します;
  • MAKENOTDEP - 句がJoinの従属側になることを防ぎます。これらは、OPTION Clause、または直接FROM Clause。すべてのAccess Patternが満たされている限り、MAKEINDMAKEDEPMAKENOTDEPのヒントは原価計算情報の使用を上書きします。MAKENOTDEPは他のヒントに優先します。

    The MAKEDEP/MAKEIND hint should only be used if the proper query plan is not chosen by default. You should ensure that your costing information represents the source cardinality. An inappropriate MAKEDEP/MAKEIND hint can force an inefficient join structure and may result in many source queries.

    エンジンはIN句で、従属側からの値をフィルタリングします。独立側からの値の数がトランスレータのMaxInCriteriaSizeを超える場合、値はMaxDependentPredicatesまでの複数のIN述語に分割されます。独立した値の数が MaxInCriteriaSize*MaxDependentPredicates を超えると、複数の従属クエリが並行して発行されます。

Copy Criteria

コピー基準は、結合とWHERE句基準の組み合わせに基づいて追加の述語を作成する最適化です。例えば、equijoin述語(source1.table.column = source2.table.column)は、source1.table.columnsource2.table.columnに、またその逆を に代入することによって、新しい述語を作成するために使用されます。クロスソースシナリオでは、これは結合の片側に適用されたWHERE基準が両方のソースクエリに適用されることを可能にします。

Projection Minimization

CData Virtuality Server は、各Pushdown クエリがユーザークエリの処理に必要なシンボルのみを投影するようにします。これは、大きな中間ビューレイヤーを通してクエリを実行する場合に特に便利です。

Partial Aggregate Pushdown

部分的 Aggregate Pushdown を使用すると、複数ソースの JOIN や UNION の上のグループ化操作を分解して、一部のグ ループ化関数や集約関数をソースにプッシュダウンすることができます。

Optional Join

オプションの結合ヒントは、結合されたテーブルのどの列もユーザクエリの出力で使用されない場合、または、ユーザクエリの結果を構築するのに意味のある方法で使用されない場合、結合されたテーブルを省略することをオプティマイザに示します。こ の ヒ ン ト は通常、 マルチ ソ ース結合を含むビ ュ ー レ イ ヤーでのみ使用 さ れます。

OPTION結合ヒントは、結合句のコメントとして適用されます。ANSIと非ANSIの両方の結合に適用できます。非ANSI Joinsでは、結合されたテーブル全体がOptionalとしてマークされることがあります。以下はその例です:

SELECT a.column1, b.column2 FROM sa.a, /*+ optional */ sb.b WHERE a.key = b.key

この例では、ビュー層Xを定義しているとします。X がb.column2を必要としないようにクエリされる場合、オプションのjoinヒントはbをクエリプランから省略させます。X

SELECT a.column1 from s.a

別の例を挙げましょう:

SELECT a.column1, b.column2, c.column3 FROM /*+ optional */ (sa.a INNER JOIN sb.b ON a.key = b.key) INNER JOIN sc.c ON a.key = c.key

この例では、ANSI結合構文では、abの結合をオプションとしてマークすることができます。a.column1b.column2の両方が不要な場合(例えばSELECT column3 FROM X)のみ、結合が削除されます。

Optional Joinsヒントは、まだ必要なブリッジング・テーブルを削除しません:

SELECT a.column1, b.column2, c.column3 FROM /*+ optional */ sa.a, sb.b, sc.c WHERE ON a.key = b.key AND a.key = c.key

この例では、ビュー層Xを定義しているとします。b.column2またはc.column3が、Xへのクエリによってのみ必要とされる場合、aへの結合は削除されます。しかし、a.column1、またはb.column2c.column3の両方が必要な場合、Optional Joinsヒントは有効になりません。

The relevant criteria are not applied when a join clause is omitted via the optional join hint. Thus it is possible that the query results may not have the same cardinality or even the same row values as when the join is fully applied.

Left/right outer joins where the inner side values are not used and whose rows undergo a distinct operation will automatically be treated as an optional join and do not require a hint. Here is an example:

SELECT a.column1, b.column2 FROM sa.a LEFT OUTER JOIN /*+optional*/ sb.b ON a.key = b.key
  • Be sure that there is no whitespace between /* and + when using e.g.  /*+ optional */;
  • Configure your SQL client not to remove multi-line comments.
    Here is how to do this in Squirrel: Session -> Session Properties -> SQL- > Remove multi-line comment ( /* ... */ )

A simple SELECT COUNT(*) FROM VIEW against a view where all join tables are marked as optional will not return a meaningful result.

Partitioned Union (Partition Pruning)

UNION PARTITIONは変換/インラインビューから推測されます。UNION列の1つ(またはそれ以上)が定数によって定義されている、および/またはWHEREIN各ブランチを相互に排他的にする定数のみを含む述語を持つ場合、UNIONは PARTITION とみなされます。UNION ALLを使用しなければならず、UNIONLIMIT , WITH , またはORDER BY句を持つことはできません(ただし、個々のブランチはLIMIT , WITH , またはORDER BYを使用することができます)。PARTITIONの値はNULLであってはなりません。例えば、ビュー定義SELECT 1 AS x, y FROM foo UNION ALL SELECT z, a FROM foo1 WHERE z IN (2, 3)は、最初のブランチが値1にのみなり、2 番目のブランチが値2または3にのみなるため、列 x 上で PARTITION されたとみなされます。将来的には、より高度なパーティションや明示的なパーティションも考えられることに注意してください。パーティション結合とPartial Aggregate Pushdownには、パーティション結合の概念が使用されます。

Standard Relational Techniques

CData Virtuality Server はまた、多くの標準的なリレーショナル技術を取り入れ、効率的なクエリプランを実現しています。

  • 関数の簡略化と評価のための書き換え解析;
  • 基本条件簡素化のためのブール最適化;
  • 不要なViewレイヤーの削除;
  • 不要なソート操作の削除;
  • 結合木の左線形空間を通る高度な検索テクニック;
  • 実行中のソースアクセスの並列化;
  • Subquery Optimization.