Вы можете рассмотреть возможность добавления вычисляемого столбца к каждой таблице, которая содержит значение контрольной суммы.Затем создайте индекс для столбца ID и значение контрольной суммы и, наконец, используйте значение контрольной суммы в соединении.Примерно так:
Alter Table T1 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)
Alter Table T2 Add CheckSumId As CHECKSUM(vchCol1, vchCol2, vchCol3)
Create NonClustered index idx_T1_Checksum On T1(id, CheckSumId)
Create NonClustered index idx_T2_Checksum On T2(ext_id, CheckSumId)
Тогда ваш запрос станет ...
select t1.id, t2.id
from t1 Inner Join t2
On t1.id = t2.ext_id
And T1.CheckSumId = T2.CheckSumId
where isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
Это, конечно, будет использовать дополнительное индексное пространство, но это просто 2 целых числа, которые должны быть оченьэффективный.Там также будет снижение производительности для каждой вставки, обновления и удаления, потому что необходимо поддерживать другой индекс.Однако я подозреваю, что это сильно повлияет на производительность.