Por que o IsNull é duas vezes mais lento que a coalescência (mesma consulta
Conhecemos uma situação estranha no SQL Server 2008 (SP1) - 10.0.2531.0 (X64) - Win2008 SP2 (X64).
Aqui está uma 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 as colunas em comparação (exceto IDs) sãovarchar
(~ 30 ... 200)
T1 é ~ 130mln linhas, T2 é ~ 300k linha
Esta consulta no grande servidor Dev é executada ~ 5 horas - isso é lento, mas o que podemos fazer?
E enquanto investigamos possíveis formas de otimização - descobrimos que mudar"é nulo" para "coalescer" na consulta acima fornece duplo ganho de desempenho - e a consulta agora é executada para ~ 2 horas
UPD: Quando removemos todos osISNULL
verifica e use apenast1.vchCol1 = t2.vchCol1
a consulta termina depois de 40mins.
Questão : Esse comportamento é conhecido e deveríamosevita usandoÉ nul em toda parte