10.4. フェデレーション最適化
アクセスパターン
アクセスパターンは、物理テーブルとビューの両方で使用され、一連の列に対して基準の必要性を指定します。条件を指定できないと、run-away ソースクエリーではなく、プランニングエラーが発生します。アクセスパターンは、アクセスパターンの 1 つだけが満たされるようにセットに適用できます。
現在、影響を受ける列を参照する条件の形式が、アクセスパターンを満たしている場合があります。
pushdown
フェデレーションされたデータベースシステムのプッシュダウンとは、ユーザーレベルのクエリーを各ソースシステムでできるだけ多くの作業を実行するソースクエリーに分割することを指します。プッシュダウン分析には、コネクター API の Data Virtualization で提供されるソースシステム機能に関する知識が必要です。ソースで実行されていない作業は、Federate のリレーショナルデータベースエンジンで処理されます。
機能に基づいて、Data Virtualization はクエリー計画を操作して、各ソースが可能な限り多くの参加、フィルタリング、グループ化などを実行するようにします。多くの場合、結合順序など、プランニングは 標準のリレーショナルデータベース技術 と費用情報、プッシュダウン最適化のためのヒューリスティックを組み合わせたものです。
通常、基準および結合プッシュダウンは、パフォーマンスが懸念される場合にプッシュするクエリーの最も重要な要素です。できるだけ効率的なソースクエリーを確保するためのプランの読み取り方法は、「 プランのクエリー」を参照し てください。
依存する参加
依存結合と呼ばれる特別な最適化は、マルチソース参加に関連する 2 つの関係のいずれかから返される行を減らすために使用されます。依存する結合では、クエリーは並列ではなく、各ソースに順番に発行されます。また、1 つ目のソースから取得された結果で、2 番目から返されたレコードを制限します。2 つ目のソースから取得されるデータ量と、実行する必要がある結合比較数を大幅に減らすことで、依存する結合結合をより速く実行できます。
依存する結合が使用される条件は、アクセスパターン、ヒント、および費用情報に基づいてクエリープランナーによって決定されます。以下のタイプの依存結合を Data Virtualization で使用できます。
- 等価性または非等価性をもとに結合
- エンジンは、トランスレーター機能に基づいて大規模なクエリーを分割する方法を決定します。
- キーのプッシュダウン
- トランスレーターはキー値の完全なセットにアクセスし、送信するクエリーを決定します。
- 完全なプッシュダウン
- トランスレーターは、独立した側からすべてのデータをトランスレーターに提供します。コストにより自動的に使用することも、ヒントのオプションとして指定できます。
Data Virtualization で以下のタイプのヒントを使用して、依存する結合動作を制御できます。
- MAKEIND
- 句が依存する結合の独立側である必要があることを示します。
- MAKEDEP
句が参加に依存することを示します。非ヒントとして、任意の
MAX
引数およびJOIN
引数を指定してMAKEDEP
を使用できます。- MAKEDEP(JOIN)
- つまり、結合全体をプッシュする必要があります。
- MAKEDEP(MAX:5000)
- つまり、独立した結合は、独立した側からの値の最大数より少ない場合にのみ実行する必要があります。
- MAKENOTDEP
- 句が参加に依存することを防ぎます。
これらは OPTION 句 または FROM 句に直接配置できます。すべてのアクセスパターンが 満たされ ている限り、MAKEIND、MAKEDEP、および MAKENOTDEP のヒントは、コスト情報の使用を上書きします。MAKENOTDEP は、他のヒントの代わりに使用します。
MAKEDEP または MAKEIND のヒントは、適切なクエリー計画がデフォルトで選択されていない場合にのみ使用してください。コスト情報が実際のソースカーディナリティーを表すことを確認する必要があります。
不適切な MAKEDEP または MAKEIND ヒントにより、非効率的な結合構造を強制し、多くのソースクエリーが発生する可能性があります。
これらのヒントをビューに適用することはできますが、オプティマイザーは可能な場合にデフォルトでビューを削除します。これにより、ヒント配置が元の意図と大きく異なる場合があります。オプティマイザーがこれらのケースでビューを削除しないようにするには、NO_UNNEST ヒントの使用を検討してください。
最も単純なシナリオでは、エンジンは IN 句(または等価述語)を使用して、依存する側からの値をフィルタリングします。独立した値の数が、Translators MaxInCriteriaSize
を超える場合、値は MaxDependentPredicates
までの複数の IN 述語に分割されます。独立した値の数が MaxInCriteriaSize*MaxDependentPredicates
を超える場合、複数の依存クエリーが並行して発行されます。
トランスレーターが support DependentJoins に対して true を返す場合、エンジンは
独立したキーの値のセット全体を提供できます。これは、独立した値の数が MaxInCriteriaSize*MaxDependentPredicates
を超える場合に生じ、トランスレーターは単純なシナリオで発生するように特定のロジックを使用して複数のクエリーを実行しないようにします。
トランスレーターがDependentJoins を サポートし、
する場合、最適化機能によって完全なプッシュダウンを選択できます。これは、Data-ship のプッシュダウンとも呼ばれることもあります。ここでは、結合の独立した側からの全データが依存側に送信されます。これにより、結合の上にプランもプッシュダウンできるという利点があります。このため、オプティマイザーは、独立した値の数が FullDependentJoins
をサポートMaxInCriteriaSize*MaxDependentPredicates
を超えていない場合でも完全なプッシュダウンの実行を選択できます。MAKEDEP(JOIN)
ヒントを使用して完全なプッシュダウンを強制的に実行することもできます。トランスレーターは通常、独立側を表す一時的なテーブルを作成し、設定し、削除します。依存関係、キー、および完全なプッシュダウンでカスタム変換を使用する方法の詳細は、「 Translator Development の Dependent join pushdown 」を参照してください。注記: デフォルトでは、Key/Full Pushdown は JDBC 翻訳者のサブセットとのみ互換性があります。これを使用するには、translator のオーバーライドプロパティー enableDependentJoins
を true
に設定します。JDBC ソースは、通常 Hibernate 方言を必要とする一時テーブルの作成を許可する必要があります。以下の変換は、DB2、Derby、H2、Hana、HSQL、MySQL、Oracle、PostgreSQL、SQL Server、SAP IQ、Sybase、Teiid、および Teradata と互換性があります。
条件のコピー
コピー基準は、結合基準と where 句の条件を組み合わせて、追加の述語を作成する最適化です。たとえば、equi-join 述語 (source1.table.column = source2.table.column)
は、source2.table.column に source1.table.column
の置き換えによって新規述語を作成するために使用されます。ソース間のシナリオでは、結合の単一部分に適用される基準を両方のソースクエリーに適用することができます。
Projection minimizeation
Data Virtualization は、各プッシュダウンクエリーがユーザークエリーの処理に必要なシンボルのみを提供するようにします。これは、大規模な中間ビュー層でクエリーを行う場合に役立ちます。
部分的な集約プッシュダウン
部分的な集約プッシュダウンにより、複数のソース結合および意図上のグループ化操作が可能になり、グループ化および集約関数の一部をソースにプッシュできます。
任意の参加
任意または冗長な結合は、オプティマイザーによって削除できるものです。オプティマイザーは外部キーに基づいて内部参加を自動的に削除し、外部の結果が一意であれば、出発元の結合を自動的に削除します。
オプションの結合ヒントは自動ケース以外で、ユーザークエリーの出力で列がない場合に結合されたテーブルを省略するか、ユーザークエリーの結果を構築する意味のある方法で省略する必要があることを示します。このヒントは通常、マルチソース参加が含まれるビュー層で使用されます。
オプションの結合ヒントは join 句のコメントとして適用されます。これは、ANSI と非ANSI の結合の両方で適用できます。非ANSI が結合したテーブル全体に参加する場合には、オプションとしてマークされます。
例: オプションの結合ヒント
select a.column1, b.column2 from a, /*+ optional */ b WHERE a.key = b.key
select a.column1, b.column2 from a, /*+ optional */ b WHERE a.key = b.key
この例では、ビューレイヤー X
を定義しています。X
が b.column2
を必要としないようにクエリーされる場合、オプションの結合ヒントはクエリー計画から b
が省略されます。X
が以下のように定義された場合と同じ結果になります。
例: オプションの結合ヒント
select a.column1 from a
select a.column1 from a
例: ANSI オプションの結合ヒント
select a.column1, b.column2, c.column3 from /*+ optional */ (a inner join b ON a.key = b.key) INNER JOIN c ON a.key = c.key
select a.column1, b.column2, c.column3 from /*+ optional */ (a inner join b ON a.key = b.key) INNER JOIN c ON a.key = c.key
この例では、ANSI join 構文により、ab と b の結合はオプションとしてマークされます。この例では、ビューレイヤー X を定義しています。列 a.column1
と b.column2
の両方が必要ない場合のみです(例: SELECT column3 FROM X
は結合を削除します)。
オプションの結合ヒントは、必要なブリッジテーブルを削除しません。
例: ブランディングテーブル
select a.column1, b.column2, c.column3 from /*+ optional */ a, b, c WHERE ON a.key = b.key AND a.key = c.key
select a.column1, b.column2, c.column3 from /*+ optional */ a, b, c WHERE ON a.key = b.key AND a.key = c.key
この例では、ビューレイヤー X
を定義しています。b.column2
または c.column3
が X
へのクエリーによってのみ必要とされる場合、結合は削除されます。ただし、a.column1
または b.column2
と c.column3
の両方が必要な場合は、オプションの join ヒントは反映されません。
任意の結合ヒントを使用して join 句を省略すると、関連する基準は適用されません。そのため、クエリー結果に結合が完全に適用されたときと同じカーディナリティーや、同じ行の値を使用できないことがあります。
内部サイドの値が使用されておらず、別の操作を行う行が自動的に任意の結合として扱われ、ヒントは必要ありません。
例: 不要なオプションの結合ヒント
select distinct a.column1 from a LEFT OUTER JOIN /*+optional*/ b ON a.key = b.key
select distinct a.column1 from a LEFT OUTER JOIN /*+optional*/ b ON a.key = b.key
すべての結合テーブルがオプションとしてマークされているビューに対する単純な "SELECT COUNT(*)FROM VIEW" は意味のある結果を返しません。
ソースヒント
Data Virtualization ユーザーと変換クエリーには、ソースクエリーに追加情報を提供できるメタソースのヒントを含めることができます。ソースヒントの形式は以下のとおりです。
/*+ sh[[ KEEP ALIASES]:'arg'] source-name[ KEEP ALIASES]:'arg1' ... */
/*+ sh[[ KEEP ALIASES]:'arg'] source-name[ KEEP ALIASES]:'arg1' ... */
- ソースヒントは、クエリー(SELECT、INSERT、UPDATE、DELETE)のキーワードの後に表示されることが想定されます。
- ソースヒントは、サブクエリーまたはビューに表示できます。指定のソースクエリーに該当するヒントはすべて収集され、一覧としてプッシュされます。ヒントの順序は保証されません。
-
sh arg はオプションで、
ExecutionContext.getGeneralHints
メソッドを使用してすべてのソースクエリーに渡されます。追加の引数には、VDB のトランスレーターに割り当てられたソース名と一致する source-name がなければなりません。source-name が一致すると、ヒントの値はExecutionContext.getSourceHints
メソッド経由で指定されます。ExecutionContext の使用方法は、「 Translator Development 」を参照してください。 -
引数の値はそれぞれ文字列リテラルの形式を持ちます。これは一重引用符で囲む必要があり、一重引用符は別の一重引用符でエスケープできます。Oracle トランスレーターのみがソースヒントを使用します。Oracle translator は、ソースヒントと一般的なヒント(この順番で)Oracle ヒントを
/*+ … */
で囲まれた Oracle ヒントを形成するのに使用できます。 - KEEP ALIASES オプションが一般的なヒントまたは適用可能なソース固有のヒントのいずれかに使用される場合、ユーザークエリーの表/ビューのエイリアスとネストされたビューはプッシュダウンクエリーで保持されます。これは、ソースヒントがエイリアスを参照する必要があり、ユーザーが生成されたエイリアスに依存したくない場合に便利です(上記のソースクエリーでクエリー計画で確認可能)。ただし、場合によっては、保持されたエイリアス名がソースに対して有効ではない場合や、名前が競合してしまうと、無効なソースクエリーが発生する可能性があります。KEEP ALIASES の使用でエラーが発生した場合には、NO_UNNEST ヒント、エイリアスの変更、または KEEP ALIASES オプションを使用したビューの削除を防ぎ、生成されたエイリアス名を決定するために使用するクエリー計画によってクエリーを変更することができます。
ソースヒントのサンプル
SELECT /*+ sh:'general hint' */ ... SELECT /*+ sh KEEP ALIASES:'general hint' my-oracle:'oracle hint' */ ...
SELECT /*+ sh:'general hint' */ ...
SELECT /*+ sh KEEP ALIASES:'general hint' my-oracle:'oracle hint' */ ...
パーティション設定解除
変換/インラインビューからは、ユニオンパーティションが推測されます。UNION 列の 1 つ(または複数)が定数によって定義され、または各ブランチを相互に排他的にする定数のみを含む WHERE 句 IN 述語がある場合、UNION はパーティション化されたものとみなされます。UNION ALL を使用し、UNION には LIMIT、WITH、または ORDER BY 句を含めることはできません(個別のブランチは LIMIT、WITH、または ORDER BY を使用できます)。パーティショニング値は null にしないでください。
例: パーティション設定解除
create view part as select 1 as x, y from foo union all select z, a from foo1 where z in (2, 3)
create view part as select 1 as x, y from foo union all select z, a from foo1 where z in (2, 3)
このビューは列 x でパーティション分割されます。1 番目のブランチは値 1 のみで、2 番目のブランチは 2 または 3 の値のみになります。
今後のリリースでは、より高度なパーティションまたは明示的なパーティション設定が考慮されます。
パーティションが分割解除の概念は、パーティション単位で参加、アップデータブルビュー、および Partial Aggregate Pushdown に使用されます。これらの最適化は、マルチソース機能を使用する場合も適用され、明示的なパーティション設定列が導入されました。
パーティション単位で結合すると、計画が結合し、一致するパーティションのみが相互に結合する状態になるように、プランを結合します。パーティション単位で分割された列の明示的な結合を必要とせずに暗黙の結合を行うには、モデル/スキーマプロパティー implicit_partition.columnName
を、モデル/スキーマの各パーティション設定されたビューで使用するパーティション列の名前に設定します。
CREATE VIRTUAL SCHEMA all_customers SERVER server OPTIONS ("implicit_partition.columnName" 'theColumn');
CREATE VIRTUAL SCHEMA all_customers SERVER server OPTIONS ("implicit_partition.columnName" 'theColumn');
標準のリレーショナルデータベース技術
また、データ仮想化には、効率的なクエリー計画を確保するために、多くの標準的なリレーショナルデータベース技術が組み込まれています。
- 関数の簡素化および評価のための書き換え分析。
- 基本的な基準の簡素化のためのブール値の最適化。
- 不要なビュー層の削除。
- 不要なソート操作の削除。
- 結合ツリーの左線空間を使用した高度な検索手法。
- 実行時のソースアクセスの反復。
- サブクエリーの最適化。
join compensation
ソースシステムによっては、「relationship」クエリーは論理的に除外された結合の結果のみを許可します。内部の参加でクエリーした場合でも、Data Virtualization は適切なオ外側参加の形成を試みます。これらのソースは、キー参加での使用に制限されます。状況によっては、同じソースの外部キー関係を、結合の外側上または参照されたテーブルでトラバートしないようにしてください。拡張プロパティー teiid_rel:allow-join
を外部キーで使用することで、プッシュダウンの動作をさらに制限することができます。値が「false」の場合には、結合のプッシュダウンは許可されません。値が「inner」の場合には、参照テーブルは参加の内部側にある必要があります。結合のプッシュダウンが阻止されると、結合はフェデレーションされた結合として処理されます。