MS SQL Isnull vs COALESCE
T-SQL incorposa la sentencia COALESCE es similar a ISNULL, pero con algunas ventajas, tal vez la mas importante es que se le puede dar mas de un argumento:
Si intenta evaluar más de dos entradas, se necesita anidar llamadas ISNULL, mientras que COALESCE puede manejar cualquier número.
El límite superior no está documentado explícitamente, pero el punto es que, para todos los efectos, COALESCE manejará mejor sus necesidades en este caso. Ejemplo:
*SELECT COALESCE(a, b, c, d, e, f, g) FROM dbo.table;*
para hacer esto con ISNULL, se necesita:
*SELECT ISNULL(a, ISNULL(b, ISNULL(c, ISNULL(d, ISNULL(e, ISNULL(f, g)))))) FROM dbo.table;*
Las dos consultas producen planes absolutamente idénticos; de hecho, el resultado se extrapola exactamente a la misma expresión para ambas consultas:
CASE WHEN [tempdb].[dbo].[table].[a] IS NOT NULL THEN [tempdb].[dbo].[table].[a]
ELSE CASE WHEN [tempdb].[dbo].[table].[b] IS NOT NULL THEN [tempdb].[dbo].[table].[b]
ELSE CASE WHEN [tempdb].[dbo].[table].[c] IS NOT NULL THEN [tempdb].[dbo].[table].[c]
ELSE CASE WHEN [tempdb].[dbo].[table].[d] IS NOT NULL THEN [tempdb].[dbo].[table].[d]
ELSE CASE WHEN [tempdb].[dbo].[table].[e] IS NOT NULL THEN [tempdb].[dbo].[table].[e]
ELSE CASE WHEN [tempdb].[dbo].[table].[f] IS NOT NULL THEN [tempdb].[dbo].[table].[f]
ELSE [tempdb].[dbo].[table].[g] END END END END END END
Entonces, el punto principal aquí es que el rendimiento será idéntico en este caso y que el T-SQL en sí es el problema, se vuelve innecesariamente complicado. Y estos son nombres de columnas muy simples, de una sola letra, así que imagine cuánto más larga se vería esa segunda consulta si estuviera tratando con nombres de columnas mas reales.
Referencias
Comentarios