SQL Server Merge (своего рода) и отслеживание обновлений - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть процесс ETL, который для цели этого вопроса полностью выполняется в T-SQL.

На этапе извлечения текущий процесс выглядит следующим образом:

  1. «исходная» таблица
  2. Вставка всех данных из таблицы ODS в нашу «исходную» таблицу

Однако я хочу реализовать возможность «инкрементной» загрузки, которая бы состояла изтолько вставка новых данных и обновление измененных данных.Таким образом, этот процесс будет выглядеть примерно так:

  1. Установить бит "archive" в таблице "source" (все данные теперь заархивированы, т.е. не изменены)
  2. Обновить существующие данные из ODS на "source "(установите обновленный бит архива строк в 0)
  3. Вставьте новые данные из ODS в" source "(с битом архива 0)

Мне известно об операторе MERGEв SQL Server 2008+.Тем не менее, меня беспокоит то, как я могу правильно регистрировать, какие строки действительно изменились.Если я просто сделаю MERGE, я считаю, что каждая найденная строка будет помечена как измененная, даже если сами данные не изменились.

Существуют ли какие-либо приемы, позволяющие это сделать, помимо указания каждого столбца вобновить предикат?Или есть лучший способ добиться того, что я пытаюсь сделать?Я хотел бы избежать решения, которое включает SSIS, если это вообще возможно по независящим от меня причинам.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

В прошлом я применял флаг «операция» в таблице ODS и использовал MERGE, чтобы определить, изменилось ли что-нибудь между источником и ODS.Для этого требуется уникальный ключ и временная метка из источника.Если у вас нет метки времени, вы можете использовать контрольную сумму или что-то подобное, но они полны собственных проблем.Я отмечаю соответствующие записи, которые имеют более новую временную метку из источника, как «U», записи из источника, которых нет в ODS, как «I», и записи, которые находятся в ODS, которых нет в источнике, как «D».Затем я запускаю отдельные процедуры, которые выполняют слияния между ODS и целевой таблицей.Этот метод работал очень хорошо, когда приходилось обрабатывать только 3-4 тыс. Изменений в сутки из набора записей 30-40 млн.

1 голос
/ 15 сентября 2011

Вы можете проверить условия столбцов, которые могут быть изменены:

MERGE TableA
USING TableB
ON TableA.Id = TableB.Id
WHEN MATCHED AND (TableA.Column1 != TableB.Column1 OR TableA.Column2 != TableB.Column2 OR ....)
   UPDATE SET TableA.Column1 = TableB.Column1,
              TableA.Column2 = TableB.Column2
WHEN NOT MATCHED BY TARGET THEN
  INSERT VALUES (TableB.Id, TableB.Column1, TableB.Column2, ....);

В любом случае вы должны быть более осторожны с обнуляемыми столбцами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...