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

questionAnswers(4)

yourAnswerToTheQuestion