Учитывая ситуативную реальность, могу ли я каким-то образом улучшить производительность MERGE?
Вы должны протестировать, но сохраняете ха sh для каждой строки, вычисляя га sh для новых строк, и сравнение на основе (ключ, га sh) должно быть дешевле, чем сравнение каждого столбца.
Стоит ли использовать контрольную сумму или хеш-байты и почему?
HASHBYTES имеет гораздо более низкую вероятность пропустить изменение. Грубо говоря, с CHECKSUM вы, вероятно, в конечном итоге пропустите одно или два изменения, а с HASHBYTES вы, вероятно, никогда не пропустите изменение. См. Примечания здесь: BINARY_CHECKSUM .
Я что-то упустил с функциями, которые могли бы сделать это сравнение быстрее или проще в прочитанном мной чтении?
Нет. Не существует специального способа сравнения нескольких столбцов.
Есть ли что-то лучше, чем то, что я написал ниже?
Вам определенно следует заменить нули, иначе строка (1,null,'A')
и (1,'A',null)
получит тот же ха sh. И вы должны заменить нули и разделитель чем-то, что не будет отображаться в качестве значения в любом столбце. И если у вас есть текст Unicode, преобразование в varchar может стереть некоторые изменения, поэтому безопаснее использовать nvarchar. Например:
HASHBYTES('SHA2_256',
CONCAT(ISNULL(CAST(C1 as nvarchar(max)),N'~'),N'|',
ISNULL(CAST(C2 as nvarchar(max)),N'~'),N'|',
ISNULL(CAST(C3 as nvarchar(max)),N'~'))) AS HashbytesValueWithCastWithNullCheck
JSON в SQL Сервер работает очень быстро. Таким образом, вы можете попробовать шаблон как:
select t.Id, z.RowJSON, hashbytes('SHA2_256', RowJSON) RowHash
from SomeTable t
cross apply (select t.* for json path) z(RowJSON)