Параметры загрузки: версия строки против даты и времени

Много раз мне нужно было перенести данные большой таблицы (назовем ее исходной) в ее клон (назовем ее целевой). Из-за большого размера, вместо того, чтобы просто удалять / вставлять все, я предпочитаю 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 за его надежность.

Другие вопросы по тегам