Как выяснить, какая запись была удалена эффективным способом? - PullRequest
3 голосов
/ 11 июня 2010

Я работаю над собственным решением ETL, от db1 (Oracle) до db2 (Sybase). Нам нужно передавать данные постепенно (Change Data Capture?) В db2.

У меня есть доступ только для чтения к таблицам, поэтому я не могу создать таблицу или триггер в Oracle db1.

Проблема, с которой я сталкиваюсь, заключается в том, как обнаружить удаление записи в Oracle?

Решение, которое я могу придумать, заключается в использовании дополнительных автономных / встроенных БД (например, derby, h2 и т. Д.). Эта база данных содержит 2 таблицы, а именно old_data, new_data.

old_data содержит поле первичного ключа от интересующего вас Oracle.

Каждый раз, когда запускается процесс ETL, таблица new_data заполняется полем первичного ключа из таблицы Oracle. После этого я запущу следующую команду sql, чтобы получить удаленные строки:

SELECT old_data.id FROM old_data WHERE old_data.id NOT IN (SELECT new_data.id FROM new_data)

Я думаю, что это будет очень дорогая операция, когда объем данных станет очень большим. У тебя есть идея получше?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Какая редакция Oracle? Если у вас Enterprise Edition , посмотрите Oracle Streams . Вы можете извлечь удаления из журнала REDO, а не из самой базы данных

0 голосов
/ 11 июня 2010

Один из подходов, который вы могли бы использовать, - это использовать возможность обратного отсчета Oracle (если вы используете версию 9i или новее):

http://forums.oracle.com/forums/thread.jspa?messageID=2608773

Это позволит вам выбрать из предыдущего состояния базы данных.

Если не всегда удаляются записи, вы можете повысить эффективность:

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

Небольшое примечание о вашем решении, если флэшбэк не вариант: я не думаю, что ваш запрос на выборку имеет большое значение - это все те вставки, чтобы заполнить те боковые таблицы, которые действительно займут много времени. Почему бы просто не выполнить этот запрос к производственному серверу Sybase перед обновлением?

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