Dipende... In generale, Oracle non garantisce che un'istruzione SQL utilizzerà la valutazione del cortocircuito (sebbene PL/SQL sia garantito per eseguire la valutazione del cortocircuito). L'ottimizzatore Oracle è libero di valutare i predicati nell'ordine che ritiene più efficiente. Ciò potrebbe significare che il primo predicato viene valutato per primo e solo le righe corrispondenti hanno il secondo predicato valutato, ma è del tutto possibile che accada il contrario o che Oracle trasformi la query in una sorta di UNION
e valuta completamente entrambi i predicati prima di combinare i risultati.
Detto questo, se l'ottimizzatore può determinare in fase di compilazione che un predicato valuterà sempre TRUE
o FALSE
, l'ottimizzatore dovrebbe trattarlo come una costante. Quindi se, ad esempio, c'è un vincolo sulla tabella che impedisce X
dall'avere mai un valore di "true", l'ottimizzatore non dovrebbe valutare affatto il secondo predicato (sebbene versioni diverse dell'ottimizzatore avranno capacità diverse di rilevare che qualcosa è una costante in fase di compilazione).
Per quanto riguarda la seconda parte della tua domanda, senza vedere i piani di query, è molto difficile dirlo. L'ottimizzatore Oracle tende ad essere abbastanza efficace nel trasformare le query da un modulo all'altro se esistono metodi più efficienti per valutarlo. In generale, tuttavia, se subQ
restituirà un numero relativamente elevato di righe rispetto a table
, potrebbe essere più efficiente strutturare la query come EXISTS
piuttosto che come un IN
.