2011-08-05 13 views
5

Muchos lenguajes de programación modernos tienen de cortocircuito Evaluación booleana como las siguientes:¿El DBMS moderno incluye la evaluación booleana de cortocircuito?

if (x() OR y()) 

If x() vuelve verdadera, y() no se evalúa.

¿SQL en DBMS moderno (SQL Server, Sybase, Oracle, DB2, etc.) tiene esta propiedad?

En particular, si el lado izquierdo de la declaración booleana es una constante booleana, ¿se cortocircuitará?


relacionadas: Do all programming languages have boolean short-circuit evaluation?

Respuesta

1

Sí y no.

(a continuación se refiere a SQL Server exclusivamente)

Algunos operadores cortocircuito y algunos no lo hacen. ORCAN cortocircuito, pero puede no depender del orden de operaciones seleccionado por el motor de consulta.

CASE es (creo) 100% garantizado para cortocircuitar.

También puede tratar de forzar orden de evaluación con paréntesis anidados, como:

IF ((X) OR Y)

pero no soy positivo que esto siempre es coherente bien.

El problema con SQL en este sentido es que es declarativo, y la lógica real es realizada por el motor. De hecho, es posible que sea más eficaz comprobar Y primero en su ejemplo y luego verificar X - si, por ejemplo, Y está indexado y X requiere una exploración de tabla.

Para Referencia:

De la documentación ANSI-SQL from this answer:

Cuando la prioridad no está determinada por los formatos o por paréntesis, la evaluación eficaz de las expresiones es generalmente realizan de izquierda a derecha. Sin embargo, es dependiente de la implementación si las expresiones realidad se evalúan de izquierda a derecha, sobre todo cuando operandos u operadores podrían causar condiciones para ser elevadas o si los resultados de las expresiones se pueden determinar sin completamente la evaluación de todas las partes del expresión.

+0

caso, no es en SQL, así que no estoy seguro de cómo se aplica eso. (ESTÁ en t-sql) –

+0

@Billy - buen punto, añadí una advertencia al principio de la respuesta. – JNK

+0

1 para referencia documentación –

1

Hablando específicamente para SQL Server - más o menos.

El orden en el que especifica sus declaraciones OR no puede garantizar un cortocircuito porque el optimizador puede reordenarlas a voluntad si se siente mejor al obtener ganancias de rendimiento al hacerlo.

Sin embargo, el propio motor subyacente puede y lo hará cortocircuito. Es solo algo que el usuario no puede controlar.

El siguiente artículo (que enlaza con otros excelentes discusiones/recursos) tiene más información sobre este tema: http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx

+1

Esto también es cierto de PostgreSQL [http://www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL] por las mismas razones. – SingleNegationElimination

Cuestiones relacionadas