2011-07-20 14 views
5

cuenta la situación siguiente:la eficiencia de la utilización CASO CUANDO ... no es nulo vs ISNULL/COALESCE

  • Hay tres tipos de entidades, dicen Foo, Bar y Baz.
  • Cada Foo debe asociarse con Bar o Baz, pero no ambos al mismo tiempo.

El escenario ya está implementado de la siguiente manera:

  • Hay tres tablas: Foo, Bar y Baz.
  • Foo tiene dos campos de clave foránea: Bar_ID y Baz_ID.
  • Exactamente uno de esos campos de clave foránea debe ser NULL.

Ahora me gustaría construir una consulta que muestra la lista de Foo s, incluyendo la descripción de la Bar o Baz cada Foo se asocia a. En realidad, la descripción de un Bar es una fórmula bastante complicada de los campos de la fila correspondiente en la tabla Bar. Lo mismo se aplica al Baz.

Mi consulta actual tiene el siguiente aspecto:

SELECT Foo.*, 
      CASE 
      WHEN Foo.Bar_ID IS NOT NULL THEN 
       -- a formula, say... 
       ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber 
      WHEN Foo.Baz_ID IS NOT NULL THEN 
       -- another formula, say... 
       ISNULL(Baz.Color + ' ', '') + Baz.Type 
      END AS 'Ba?Description' 
FROM  Foo 
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID 
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID 

es la consulta anterior es más, menos o igual de eficiente que ...

SELECT Foo.*, 
      ISNULL(-- or COALESCE 
      ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber, 
      ISNULL(Baz.Color  + ' ', '') + Baz.Type 
     ) AS 'Ba?Description' 
FROM  Foo 
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID 
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID 

...?

Respuesta

5

En teoría, el CASO debería ser porque solo se evalúa una expresión. Varios ISNULL encadenados requerirán procesamiento.

Sin embargo, usted necesita tener un gran tamaño (10000s de filas) de datos a notar ninguna diferencia: la mayoría de procesamiento entra en el acceso a la tabla real, se une etc.

¿Lo has probado? Puede usar el generador de perfiles SQL para ver CPU, etc. para cada consulta.

+0

Casi no tengo datos para trabajar, pero sé que esto se usará en un entorno donde la cantidad de datos hace que la eficiencia sea relevante. – pyon

+0

Es un buen punto. No consideré la cantidad de expresiones anidadas en el bloque ISNULL. –

+0

+1 - También el procesamiento 'NULL' es bastante rápido en general, por lo que definitivamente se necesita un gran conjunto de datos para ser notorio – JNK

1

Creo que ISNULL es más eficiente. Las declaraciones CASE siempre se evalúan primero y creo que restringen las opciones disponibles para el optimizador de consultas.

¿Qué dice el plan de ejecución? ¿Esa es tu pregunta real?

1

COALESCE es una función ANSI mientras que ISNULL es una función de propiedad SQL Server.

Se diferencian en el manejo del tipo y algunas otras cosas, y COALESCE puede aceptar más de dos argumentos.

Para su tarea (dos argumentos, ambos VARCHAR) son equivalentes.

Cuestiones relacionadas