EXISTSSubqueries は通常、 に書き換えられ、 式の不要な評価を防ぎます;SELECT 1 FROM ...SELECTSOMEIN例えば、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のヒント:SELECTcol1FROMschm.tblWHEREcol2IN/*+ MJ*/ (SELECTcol1FROMschm2.tbl2)2. Dependent Joinのヒント:
SELECTcol1FROMschm.tblWHEREcol2IN/*+ DJ */ (SELECTcol1FROMschm2.tbl2)2.
NO_UNNESTヒントSELECTcol1FROMschm.tblWHEREcol2IN/*+ NO_UNNEST */ (SELECTcol1FROMschm2.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またはINSubquery述語は、従来のMerge Join、または、antijoinまたはsemijoinの変形に変換することができます; WHERE句 と システムプロパティ が に設定されている場合、またはサブクエリが ヒントを持っている場合、半結合のセマンティクスを持つ従来の結合に書き換えることができる述語は保持することができます;EXISTINorg.teiid.subqueryUnnestDefaultTRUEMJ- コスト計算が有利な場合、プランナーは常にアンチジョインまたはセミジョインバリアントに変換します。必要であれば、ヒントを使用してこの動作を上書きしてください;
EXISTおよびプッシュダウンされず、Merge Joinに変換されないスカラー副問い合わせは、それぞれ暗黙的に1行と2行の結果行に制限されます;- Nestedループ結合へのSubquery述語の変換はまだ使用できません。
本記事の一部は機械翻訳で提供されています。 英語版のヘルプについてはこちらをご確認ください。