EXISTS
Subqueries は通常、 に書き換えられ、 式の不要な評価を防ぎます;SELECT 1 FROM ...
SELECT
SOME
IN
例えば、col > SOME (SELECT col1 FROM table)
はcol > (SELECT min(col1) FROM table)
になります;- ソースにプッシュされない無相関の
EXIST
クエリおよびスカラー・サブクエリは、ソース・コマンドの形成前に事前評価できます; DELETE
またはUPDATE
クエリで使用される CORRESPONDING サブクエリで、対応するDELETE
/UPDATE
の一部としてプッシュされない場合、CData Virtuality Server は行ごとの補正処理を実行します。これは、影響を受けるテーブルに主キーがある場合にのみ発生します。そうでない場合は例外がスローされます;WHERE
またはHAVING
句IN
、数量化比較、スカラーサブクエリ比較、EXIST
述語は、サブクエリの前にMJ
(merge join)、DJ
(dependent join)、NO_UNNEST
(no unnest)ヒントを取ることができます。可能であれば、MJ
ヒントはトラディショナル、セミジョイン、アンチセミジョインマージジョインを使用するようにオプティマイザに指示します。DJ
はMJ
ヒントと同じですが、可能であれば従属結合の独立側としてSubqueryを使用するようにOptimizationに指示します。NO_UNNEST
ヒントは他のヒントに優先し、SubqueryをそのままにするようOptimizationに指示します。
以下にそれぞれの例を示します:
1.MERGE Joinのヒント:SELECT
col1
FROM
schm.tbl
WHERE
col2
IN
/*+ MJ*/ (
SELECT
col1
FROM
schm2.tbl2)
2. Dependent Joinのヒント:
SELECT
col1
FROM
schm.tbl
WHERE
col2
IN
/*+ DJ */ (
SELECT
col1
FROM
schm2.tbl2)
2.
NO_UNNEST
ヒントSELECT
col1
FROM
schm.tbl
WHERE
col2
IN
/*+ NO_UNNEST */ (
SELECT
col1
FROM
schm2.tbl2)
Be sure that there is no whitespace between
/*
and+
> when using e.g./*+ MJ */.
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 (/* ... */
).- system property
org.teiid.subqueryUnnestDefault
は、Optimizations がデフォルトで Subqueries をアンネストするかどうかを制御します。デフォルトはFALSEです。TRUE
の場合、ほとんどの非負WHERE
またはHAVING
句の非負EXISTS
またはIN
Subquery述語は、従来のMerge Join、または、antijoinまたはsemijoinの変形に変換することができます; WHERE
句 と システムプロパティ が に設定されている場合、またはサブクエリが ヒントを持っている場合、半結合のセマンティクスを持つ従来の結合に書き換えることができる述語は保持することができます;EXIST
IN
org.teiid.subqueryUnnestDefault
TRUE
MJ
- コスト計算が有利な場合、プランナーは常にアンチジョインまたはセミジョインバリアントに変換します。必要であれば、ヒントを使用してこの動作を上書きしてください;
EXIST
およびプッシュダウンされず、Merge Joinに変換されないスカラー副問い合わせは、それぞれ暗黙的に1行と2行の結果行に制限されます;- Nestedループ結合へのSubquery述語の変換はまだ使用できません。
本記事の一部は機械翻訳で提供されています。 英語版のヘルプについてはこちらをご確認ください。