10.5. サブクエリーの最適化
- EXISTS サブクラシングは通常、SELECT 式の不要な評価を防ぐために「SELECT 1 FROM …」に書き換えられます。
- 定量化された比較 SOME サブクナップは常に同等の IN 述語または集約値と比較になります。たとえば、col > SOME(テーブルから col1 を選択)は照合されます(表から min(col1)を選択します)。
- ソースにプッシュされていない Uncorrelated EXISTs および scalar サブクエリーは、ソースコマンドの形式よりも前に事前評価できます。
- 対応する DELETE/UPDATE の一部としてプッシュされていない DETELE または UPDATE で使用される相関サブキューにより、Data Virtualization が行ごとに補正処理を実行します。
- マージ結合(MJ)のヒントは、可能な限り従来の半結合またはアンチフォール結合結合を使用するようにオプティマイザーに指示します。依存結合(DJ)は MJ ヒントと同じですが、さらにオプティマイザーに対して、依存する結合の独立側としてサブクエリーを使用するようにオプティマイザーに指示します。これは、影響を受けるテーブルにプライマリーキーがある場合にのみ発生します。そうでない場合は、例外が発生します。
- WHERE または HAVING 句 IN、Qantified Comparison、Scalar Subquery Compare、および EXIST の述語は、サブクエリーの直前に表示される MJ、DJ、または NO_UNNEST(nest なし)のヒントを取ることができます。NO_UNNEST ヒントは他のヒントに優先して、サブクエリーを残すようにオプティマイザーに指示します。
- SELECT スカラーサブキューは、サブクエリーの直前に表示される MJ または NO_UNNEST のヒントを取ることができます。MJ ヒントでは、可能な場合は従来の結合または半結合結合を使用するようにオプティマイザーに指示します。NO_UNNEST ヒントは他のヒントに優先して、サブクエリーを残すようにオプティマイザーに指示します。
結合のヒントの使用をマージ
SELECT col1 from tbl where col2 IN /*+ MJ*/ (SELECT col1 FROM tbl2)
SELECT col1 from tbl where col2 IN /*+ MJ*/ (SELECT col1 FROM tbl2)
依存する結合ヒントの使用
SELECT col1 from tbl where col2 IN /*+ DJ */ (SELECT col1 FROM tbl2)
SELECT col1 from tbl where col2 IN /*+ DJ */ (SELECT col1 FROM tbl2)
最も簡単なヒントはありません。
SELECT col1 from tbl where col2 IN /*+ NO_UNNEST */ (SELECT col1 FROM tbl2)
SELECT col1 from tbl where col2 IN /*+ NO_UNNEST */ (SELECT col1 FROM tbl2)
-
システムプロパティー
org.teiid.subqueryUnnestDefault
は、書き換え中にオプティマイザーがデフォルトでフォレスト外のサブクィジーを設定するかどうかを制御します。true
の場合、多くの否定されていない WHERE または HAVING 句 EXISTS または IN サブクエリー述語を従来の結合に変換できます。 - プランナーは、費用が優先される場合、常にアンチ参加または半結合のバリアントに変換されます。ヒント を使用して、必要な動作を上書きします。
- プッシュされず、マージ結合に変換されないスケーラーサブクリーピングが存在すると、暗黙的に 1 と 2 の行にはそれぞれ制限で制限されます。
- ネストされたループ参加へのサブクエリー述語の変換はまだ利用できません。