Dipende. . In generale, Oracle non garantisce che un'istruzione SQL utilizzi la valutazione di cortocircuito (sebbene sia garantito che PL/SQL esegua la valutazione di cortocircuito). L'ottimizzatore Oracle è libero di valutare i predicati in qualsiasi ordine si aspetti che sia più efficiente. Ciò potrebbe significare che il primo predicato viene valutato per primo e solo le righe corrispondenti hanno valutato il secondo predicato ma è del tutto possibile che avvenga il contrario o che Oracle trasformi la query in una sorta di UNION
e valuti 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 a TRUE
o FALSE
, l'ottimizzatore dovrebbe considerarlo come una costante. Quindi, se, ad esempio, esiste un vincolo sulla tabella che impedisce a X
di avere un valore di 'true', l'ottimizzatore non dovrebbe valutare il secondo predicato (sebbene versioni diverse dell'ottimizzatore abbiano abilità diverse da rilevare che qualcosa è una costante al momento della compilazione).
Per quanto riguarda la seconda parte della domanda, senza visualizzare i piani di query, è molto difficile dirlo. L'ottimizzatore di Oracle tende ad essere abbastanza bravo a trasformare query da una forma all'altra se esistono modi più efficienti di valutarla. In generale, tuttavia, se subQ
restituirà un numero relativamente elevato di righe rispetto a table
, potrebbe essere più efficiente strutturare la query come EXISTS
anziché come IN
.
fonte
2012-01-17 19:47:58
Grazie, questo aiuta molto. – aoi222
"anche se PL/SQL è garantito per eseguire la valutazione di cortocircuito" da dove lo si prende? Ho provato questo e ho ricevuto un errore: 'declare var varchar2 (30); selezionare 'cortocircuito' in var da duale dove 1 = 0 e 1/0 = 0; fine; ' –
@IsaacKleinman - Questo è ancora SQL. Se metti le condizioni in PL/SQL, vedrai un cortocircuito. 'begin if (1 <2 or 1/0 = 1) then dbms_output.put_line ('Cortocircuito'); fine se; fine; ' –