¿Por qué IsNull es dos veces más lento que la fusión (misma consulta)?
Encontramos una situación extraña en SQL Server 2008 (SP1) - 10.0.2531.0 (X64) - Win2008 SP2 (X64).
Aquí hay una consulta pesada:
select t1.id, t2.id
from t1, t2
where
t1.id = t2.ext_id
and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
.... and about 10 more comparisons with Isnull
UPD: Todas las columnas en comparación (excepto ID) sonvarchar
(~ 30 ... 200)
T1 es ~ 130mln filas, T2 es ~ 300k filas.
Esta consulta en un servidor Dev bastante grande se ejecuta ~ 5 horas - esto es lento, pero ¿qué podemos hacer?
Y mientras investigamos posibles formas de optimización, descubrimos que cambiar"es nulo" a"juntarse" en la consulta anterior proporciona una ganancia de rendimiento doble, y la consulta ahora se ejecuta para ~ 2 horas
UPD: Cuando eliminamos todoISNULL
comprueba y usa solot1.vchCol1 = t2.vchCol1
la consulta finaliza después de 40mins.
La pregunta e: ¿Es este comportamiento conocido y deberíamosevita utilizandoEs nul ¿en todos lados