Por lo que vale Tienes un caso de uso muy específico, así que utilicé una muestra de tu pregunta real sobre el primero en valor en una tabla que se me ocurrió y controlé la secuencia de comandos para otras variables. Supuse que algúnval era un int como lo usaste 0. Mi sugerencia es que elijas tu caso específico someval/sometable y hagas el test tú mismo.
declare @val int = 0;
declare @time1 Datetime2 = getdate();
declare @time2 Datetime2 = getdate();
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
Select @val = ISNULL((SELECT TOP 1 LocationID FROM location), 0)
Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Select @MyCounter = 0;
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
Select @val = COALESCE((SELECT TOP 1 LocationID FROM Location), 0)
Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Los resultados fueron bastante espectaculares, 11270 para isnull y 18930 para fusionarse. Invertir el orden de los bucles como segunda prueba produjo 18260 para unir y 10810 para isnull. Para su caso específico , diría que isnull es claramente más rápido.
Esto no quiere decir que sea mejor en cualquier otra situación. Usar valores ascendentes, o nvarchars o bits en lugar de int, o una columna que no sea una clave principal, o Anidar isnull versus agregar parámetros para unirlos podría cambiar las cosas.
Esto solo responde a la pregunta tal como se solicitó.
El primer enlace dice que prefiere ISNULL, y el segundo enlace sugiere que COALESCE debería ser el preferido. – AdaTheDev
por favor revise el enlace Rendimiento: ISNULL vs. COALESCE http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx – amexn