Pregunta

Vamos a examinar estas dos afirmaciones:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Si es CONDITION 1 TRUE, se CONDITION 2 comprobarse?
Si es CONDITION 3 FALSE, se CONDITION 4 ser comprobada?

¿Qué pasa con las condiciones en WHERE: hace que el motor de SQL Server a optimizar todas las condiciones en una cláusula WHERE? En caso de que los programadores poner condiciones en el derecho para estar seguros de que el optimizador de SQL Server resuelve en el derecho manera?

AÑADIDO:

Gracias a Jack para el enlace, la sorpresa de código T-SQL:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

No es levantar un Dividir por cero excepción en este caso.

Conclusiones:

Si C ++ / C # / VB tiene un cortocircuito por qué no puede SQL Server tenerlo?

Para responder a esta verdad que vamos a echar un vistazo a cómo tanto el trabajo con condiciones. C ++ / C # / VB todos han cortocircuito se define en el especificaciones del lenguaje para acelerar la ejecución de código. Por qué molestarse la evaluación de N OR condiciones cuando el primero es ya verdadera o M Y las condiciones cuando el primero ya es falso.

ya que los desarrolladores tienen que ser conscientes de que SQL Server funciona de forma diferente. Es un sistema basado en el costo. Para obtener el plan de ejecución óptimo para nuestra consulta el procesador de consultas tiene que evaluar en todo lugar y condición asignarle un costo. Estos costos se evalúan como un todo para formar una umbral que debe ser inferior al umbral definido de SQL Server tiene para un buen plan. Si el coste es menor que el umbral definido Se utiliza el plan, si no todo el proceso se repite de nuevo con una mezcla de diferentes costos de condición. El costo aquí es o bien una exploración o una buscan o una combinación de mezcla o una combinación hash, etc ... Debido a esto la cortocircuitando que está disponible en C ++ / C # / VB simplemente no es posible. Se podría pensar que el uso forzado de índice en una columna como recuentos corta cortocircuitando pero no es así. Sólo se obliga al uso de ese índice y con que acorta la lista de posibles planes de ejecución. El sistema es Todavía coste basados.

Como desarrollador debe tener en cuenta que SQL Server no hace cortocircuitando como se hace en otros lenguajes de programación y no hay nada que puede hacer para obligarlo a.

¿Fue útil?

Solución

No hay ninguna garantía en SQL Server si o en qué orden las declaraciones serán procesados ??en una cláusula WHERE. La única expresión que permite la declaración de cortocircuitos es CASE-WHEN. Lo siguiente es de una respuesta he publicado en Stackoverflow:

Cómo SQL Server cortocircuitos DONDE evaluación del estado del

Lo hace cuando se siente como ella, pero no en la forma en que piensa inmediatamente.

Como desarrollador debe tener en cuenta que SQL Server no hacer cortocircuitos como se hace en otros lenguajes de programación y no hay nada que puede hacer para obligarlo a .

Para más detalles, consultar el primer eslabón de la entrada de blog anterior, que está dando lugar a otro blog:

¿El SQL Server de cortocircuito?

El veredicto final? Bueno, yo realmente no tiene uno todavía, pero es probablemente seguro decir que la única vez que puede asegurarse un corto-circuito específico es cuando expresas múltiple cuando las condiciones en una expresión CASE. Con expresiones booleanas estándar, el optimizador mover las cosas como lo considere oportuno en función de las tablas, índices y datos que está consultando.

Otros consejos

En T-SQL, el IF instrucción puede causar un cortocircuito, pero no se puede confiar en él evaluación de las expresiones con el fin

SQL es un declarativa lenguaje de programación. A diferencia de, por ejemplo, C ++, que es un imperativo lenguaje de programación.

es decir. se puede decir que lo que desea en el resultado final, pero no se puede dictar ¿Cómo el resultado está siendo ejecutado, es todo hasta el motor.

La única verdadera manera de garantizar "cortocircuitando" (o cualquier otra flujo de control ) en el interior WHERE es utilizar vistas indizadas, tablas temporales y mecanismos similares.

PS. También puede utilizar las indicaciones de planes de ejecución (a "pista" el motor de cómo ejecutar una consulta, que los índices de usar y cómo usarlos), sólo pensé que debería mencionar que, ya que estamos en este tema ...

1) - o (cualquiera o ambas condiciones serán TRUE)

si la condición 1 es TRUE condición, entonces 2 también comprueba que puede ser TRUE o FALSE

- Y (ambas condiciones deben ser TRUE)

si la condición 1 es FALSO condición, entonces 2 no se comprobará

La única manera de controlar cómo las condiciones dentro de la cláusula WHERE es el uso de soportes a agruparlos.

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

es muy diferente de

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top