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が満たされている限り、MAKEIND
、MAKEDEP
、MAKENOTDEP
のヒントは原価計算情報の使用を上書きします。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 inappropriateMAKEDEP
/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.column
をsource2.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結合構文では、a
とb
の結合をオプションとしてマークすることができます。a.column1
とb.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.column2
とc.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つ(またはそれ以上)が定数によって定義されている、および/またはWHERE
句IN
各ブランチを相互に排他的にする定数のみを含む述語を持つ場合、UNION
は PARTITION とみなされます。UNION ALL
を使用しなければならず、UNION
はLIMIT
, 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.