Параметры загрузки: версия строки против даты и времени
Много раз мне нужно было перенести данные большой таблицы (назовем ее исходной) в ее клон (назовем ее целевой). Из-за большого размера, вместо того, чтобы просто удалять / вставлять все, я предпочитаю upsert.
Для простоты давайте предположим, что int PK col называется "id".
До сих пор для этого я использовал поле datetime dbupddate, существующее в обеих таблицах, которое содержит самое последнее время, когда строка была вставлена / обновлена. Это делается с помощью триггера, который для любой вставки / обновления устанавливает dbupddate в getdate().
Таким образом, мой заурядный код upsert до сих пор выглядит примерно так:
update t set (col1=s.col1,col2=s.col2 etc)
from source s
inner join target t on s.id=t.id and s.dbupddate>t.dbupddate
insert target
select * from source s
where not exists (select 1 from target t where t.id=s.id)
Недавно наткнулся на rowversion
, Я в некоторой степени прочитал и понял его функцию, но я хотел бы знать, на практике, какие есть преимущества / недостатки в случае, если я изменю dbupddate на rowversion вместо datetime.
1 ответ
Хотя datetime несет информацию, которая может быть полезна в некоторых случаях, инверсия строк более надежна, поскольку системное datetime всегда рискует измениться и потерять точность. В вашем случае я лично предпочитаю rowversion за его надежность.