He visto a mucha gente usar la función COALESCE en lugar de ISNULL. De las búsquedas en Internet, descubrí que COALESCE es el estándar ANSI, por lo que hay una ventaja de que sabemos qué esperar al usarlo. Sin embargo, ISNULL parece más fácil de leer ya que parece más claro lo que está haciendo.
También me doy cuenta de que ISNULL es un poco complicado ya que actúa de manera diferente en diferentes servidores de bases de datos y en diferentes idiomas.
Todo eso, en mi opinión, se reduce a estilo y estándares. Dado que el estilo es subjetivo, ¿hay alguna razón para usar COALESCE sobre ISNULL (o viceversa)? Específicamente, ¿hay una ventaja de rendimiento de uno sobre el otro?
sql-server
syntax
Ricardo
fuente
fuente
COALESCE
se evalúe dos veces.COALESCE
es intuitivo;)Respuestas:
COALESCE
se traduce internamente a unaCASE
expresión,ISNULL
es una función interna del motor.COALESCE
es una función estándar ANSI,ISNULL
es T-SQL.Las diferencias de rendimiento pueden surgir cuando la elección influye en el plan de ejecución, pero la diferencia en la velocidad de la función sin procesar es minúscula .
fuente
Entonces
Finalmente, y la parte divertida. El resultado tipo de datos y longitud / precisión / escala
Este último bit es por qué ISNULL se usa generalmente porque es más predecible (?) Y COALESCE puede agregar conversiones de tipo de datos no intencionadas: de ahí proviene el bit "es más lento"
Todos los tipos de datos son iguales, no verá ninguna diferencia práctica ...
fuente
Como Mark señaló, será difícil encontrar diferencias de rendimiento; Creo que otros factores serán más importantes. Para mí, siempre uso COALESCE, y la mayoría de esto ya ha sido mencionado por usted o Mark:
También debe asegurarse de saber cómo se maneja la precedencia de tipo de datos utilizando las dos funciones si lo está utilizando con diferentes tipos de datos / precisiones, etc.
Nota
Hay una excepción Estos se manejan de manera diferente en las versiones actuales de SQL Server:
La
COALESCE
variante se ejecutarásome_aggregate_query
dos veces (una para verificar el valor y otra para devolverlo cuando no sea cero), mientrasISNULL
que solo ejecutará la subconsulta una vez. Hablo de algunas otras diferencias aquí:fuente