一般に、OracleはSQL文が短絡評価を使用することを保証しません(ただし、PL / SQLは短絡評価を実行することが保証されています)。 Oracleオプティマイザは、最も効率的であると予想される順序で述語を自由に評価できます。これは、最初の述語が最初に評価され、一致する行のみが2番目の述語を評価することを意味する場合がありますが、逆のことが発生するか、Oracleがクエリを一種のUNION
に変換する可能性があります。 結果を組み合わせる前に、両方の述語を完全に評価します。
そうは言っても、オプティマイザがコンパイル時に述語が常にTRUE
に評価されることを決定できる場合 またはFALSE
、オプティマイザはそれを定数として扱う必要があります。したがって、たとえば、X
を妨げる制約がテーブルにある場合 'true'の値を持つことから、オプティマイザは2番目の述語をまったく評価しないでください(ただし、オプティマイザのバージョンが異なれば、コンパイル時に何かが定数であることを検出する機能も異なります)。
質問の2番目の部分については、クエリプランを確認しないと、わかりにくいです。 Oracleオプティマイザは、クエリをより効率的に評価する方法がある場合、クエリをある形式から別の形式に変換するのに非常に優れている傾向があります。ただし、一般的に、subQ
table
と比較して比較的多数の行を返します 、クエリをEXISTS
として構造化する方が効率的な場合があります IN
としてではなく 。