Depende. . En general, Oracle no garantiza que una declaración SQL use la evaluación de cortocircuito (aunque PL/SQL está garantizado para realizar una evaluación de cortocircuito). El optimizador de Oracle es libre de evaluar los predicados en el orden que se espera que sea más eficiente. Eso podría significar que el primer predicado se evalúa primero y solo las filas coincidentes tienen el segundo predicado evaluado, pero es completamente posible que ocurra lo contrario o que Oracle transforme la consulta en un tipo de UNION
y evalúe ambos predicados antes de combinar los resultados .
Dicho esto, si el optimizador puede determinar en tiempo de compilación que un predicado siempre evaluará a TRUE
o FALSE
, el optimizador debería tratar eso como una constante. Entonces, si, por ejemplo, hay una restricción en la tabla que impide que X
tenga un valor de 'verdadero', el optimizador no debería evaluar el segundo predicado (aunque las diferentes versiones del optimizador tendrán diferentes capacidades para detectar que algo es una constante en el tiempo de compilación).
En cuanto a la segunda parte de su pregunta, sin ver los planes de consulta, es muy difícil de decir. El optimizador de Oracle tiende a ser bastante bueno en la transformación de consultas de una forma a otra si hay formas más eficientes de evaluarlo. Sin embargo, en general, si subQ
va a devolver un número relativamente grande de filas en comparación con table
, puede ser más eficiente estructurar la consulta como EXISTS
que como IN
.
Gracias, eso ayuda mucho. – aoi222
"aunque se garantiza que PL/SQL realiza la evaluación de cortocircuito" ¿de dónde toma eso? Intenté esto y consigo un error: 'declare var varchar2 (30); comenzar seleccionar 'cortocircuito' en var desde dual donde 1 = 0 y 1/0 = 0; final; ' –
@IsaacKleinman - Eso sigue siendo SQL. Si pone las condiciones en PL/SQL, verá un cortocircuito. 'begin if (1 <2 o 1/0 = 1) then dbms_output.put_line ('Cortocircuito'); final si; final; ' –