ETL как транзакция
-
06-07-2019 - |
Вопрос
Для всех ETL, которые я написал до сих пор, я никогда не делал их транзакциями - т.е., если таблица 4 не работает, откатите все обратно.
Какова лучшая практика в этом отношении?
Кому "BeginTran + Commit" или не "BeginTran + Commit"
РЕДАКТИРОВАТЬ: у меня есть один главный пакет, вызывающий 4 других пакета. Можно ли свернуть их все в одну транзакцию?
Решение
begin + commit в управляемых размерах партии. Вы не хотите заключать импорт по 6 часов в одну транзакцию каждую ночь. Держите свои партии в размере, который может закончиться через 2-3 минуты максимум. То, что вы столкнетесь с проблемами чистоты данных, которые приведут к сбою ETL - это само собой разумеющееся, поэтому, по крайней мере, уменьшите влияние на что-то управляемое (т. Е. Не запускайте откат, который будет длиться еще 6 часов) . р>
Другие советы
В SSIS я всегда начинаю Trans + Commit
. Я хочу убедиться, что я могу перезапустить пакет без проблем (или необходимости найти, какие строки были вставлены), если он потерпит неудачу.
Это намного облегчает восстановление и очистку.
Вы часто перемещаете слишком много данных в ETL для использования транзакции SQL (журнал должен хранить ВСЕ данные для отката, помните). Я предпочитаю разрабатывать пакеты таким образом, чтобы их можно было повторно запускать без разрушения. В идеале они должны быть настроены так, чтобы, если они умирают в середине потока, вы могли просто запустить их, и они продолжат где-то примерно там, где они остановились. Иногда для этого есть снижение производительности, но я думаю, что оно того стоит.
Технически вы можете свернуть пакеты в одну транзакцию; практически, а может и нет.