2017-02-10 3 views
0

Я пытаюсь загрузить данные из таблицы DB2 в Netezza через ETL Datastage. Это дельта-нагрузка против столбца временной метки. Так источник SQL, какОтсутствующие данные при загрузке данных через ETL-файл

select * from db2_table where timestamp_column > '2017-02-10 08:24:00'; 

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

select max(timestamp_column) from netezza_table; 

возвращает '2017-02-10 11:17:56'

Что выглядит хорошо для меня.

Но я заметил, что у нас есть запись в таблице DB2, timestamp_column которой '2017-02-10 11:17:54', хотя эти данные отсутствуют в таблице Netezza назначения.

Это не обычная проблема, но когда возникла проблема, я заметил, что значение отсутствующей записи меньше 1 или 2 секунд.

Мой вопрос: если max(timestamp_column) значение '2017-02-10 11:17:56' в Netezza, тогда работа ETL должна была получить запись '2017-02-10 11:17:54'.

Как можно пропустить эту запись?

+0

По какой причине вы удалили форматирование, которое я добавил? Твой вопрос довольно трудно читать без него. – mustaccio

+0

Эй, прошу прощения. это произошло по ошибке. – Amlan

ответ

0

Вполне возможно, что транзакция, которая обновила запись '2017-02-10 11:17:54', зафиксированную после строки, была прочитана заданием ETL. Уровень изоляции по умолчанию в базе данных DB2 (я предполагаю DB2 для LUW) - это CS, который блокирует только текущую строку при обработке курсора, а другие транзакции могут обновлять строки, которые уже были прочитаны.

Вы можете попытаться повысить уровень изоляции задания ETL до RR, чтобы гарантировать, что набор результатов не изменится, пока вы не прочитаете его, но имейте в виду, что это повлияет на параллелизм обновлений на стороне DB2.

+0

Спасибо за ваш комментарий. Уровень изоляции в моей работе ETL - RU. В качестве исходной таблицы используется таблица транзакций и несколько записей в секунду. Итак, каков наилучший способ решить эту проблему. – Amlan

+0

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

+0

Да, но проблема в следующий раз, когда ETL будет извлекать данные из исходной таблицы, где timestamp_column> '2017-02-10 11:17:56' (поскольку мы загружаем дельта-записи через это задание). , поэтому эти недостающие данные не будут доступны в моей таблице адресатов. – Amlan

0

Способом решения проблемы может быть временная метка изменения строки. Эта метка времени создается DB2 автоматически при вставке или времени обновления и, следовательно, идеальное решение для определения дельт. Добавить дополнительный столбец в исходной таблице, как этот

rct timestamp not null generated always for each row on update as row change timestamp 

Чтобы избежать конфликтов из-за изменения DDL вы также определили этот столбец как «скрытый». Это означает, что он может быть явно выбран, но не возвращается при запуске

SELECT * FROM tab 
Смежные вопросы