Я обобщаю свой вариант использования в базовой форме, как показано ниже.Будем очень благодарны за любые предложения.
ETL:
|-> FINAL DB
SOURCE -> INTERIM DB -|
|-> HISTORY DB
В базу данных HISTORY добавлены различия в записях между INTERIM и FINAL DB.
FINAL DB обновляется с помощью утилиты слияния Oracle.
В первый день мы извлекаем данные из SOURCE и помещаем 10 записей в промежуточную базу данных.
Мы запускаем поток PL / SQL, который обновляет FINAL DB и HISTORY DB, каждый из которых содержит 10 записей.
В День 2 приходят еще 10 записей.Но 1 - обновление, 1 - удаление, 1 - вставка.
Итак, теперь в FINAL DB всего 11 записей (ранее 10 + 1 вставка), а в базе данных HISTORY 13 записей (все вставки)(ранее 10 + 1 обновление + 1 удаление + 1 вставка)).
Мы используем записи в БД ИСТОРИИ со статусами DELETE для удаления записей в ФИНАЛЬНОЙ БД.
Приведенная выше предпосылка верна, если мы извлекаем все записи из SOURCE.
Если мы извлекаем только дельта-данные (записи, которые изменились), то это даетневерно удаляет.Например: вместо выборки всех 10 (как в шаге (5)), если я выбираю только 2 записи (1 обновление и 1 вставка), нет способа найти DELETES в таблице HISTORY (так как остальные 8 записей не являютсябудет также помечен как DELETE в таблице HISTORY.)
Вопрос:
Реальный сценарий включает в себя миллионы записей, и, следовательно, мы не можем получить вседанные в промежуточной БД.Оператор Oracle Merge
объединяет изменения в FINAL DB, но не выполняет удаления, которые мы планируем сделать, выполняя дополнительные операторы удаления, используя записи в таблице истории, имеющие статус «DELETE».Но вопрос в том, каким образом мы можем иметь правильные записи в таблице истории, когда у нас есть дельта-данные в промежуточной базе данных?
Одно решение:
Периодически извлекать полные данные, чтобы определитьудаляет.
Пожалуйста, предложите любые другие решения / мысли.Благодаря.