2010-06-11 4 views
2

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

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

Задача, с которой я столкнулся, - как определить удаление записей в Oracle?

Решение, о котором я могу думать, заключается в использовании дополнительного автономного/встроенного db (например, derby, h2 и т. Д.). Этот db содержит 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) 

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

Спасибо.

ответ

4

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

+1

+1 Streams Change Data Capture - это, безусловно, самое легкое касание исходной базы данных, но вам придется делать одноразовое изменение таблиц для добавления дополнительных протоколов. – dpbradley

+0

В любом случае мне не разрешено изменять/добавлять исходную таблицу. Собственность источника db принадлежит другой компании. – janetsmith

0

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

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

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

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

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

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

+0

Направление связи между серверами - это только один путь от Oracle до Sybase. Это связано с какой-то политикой безопасности компании моего клиента. – janetsmith

Смежные вопросы