Инкрементальная загрузка данных
Представим таблицу на 500 млн строк. Каждый день нам нужно обновлять данные в хранилище
Можно каждый раз загружать всю таблицу целиком. Но зачем, если за день изменилось только 50 тысяч строк?
Здесь используется инкрементальная загрузка — в хранилище передаются только новые и изменившиеся данные, а не вся таблица
Как это работает?
Например, в таблице есть поле updated_at:
SELECT * FROM orders WHERE updated_at > ‘2026-09-10 12:00:00’
При первом запуске загружаем всю таблицу и сохраняем момент последней загрузки
При следующем — забираем только записи, которые появились или изменились после этого момента
Важно: инкремент — это не только новые строки
Если заказ уже был в хранилище, но его статус изменился, эту запись тоже нужно обновить. Здесь часто используют UPSERT: новые записи добавляются, существующие — обновляются
А вот с удалениями есть отдельная проблема. Если строку удалили из источника, обычный запрос по updated_at её уже не увидит
Поэтому удаления отслеживают отдельно — например, через флаг is_deleted или CDC (Change Data Capture). CDC позволяет фиксировать INSERT, UPDATE и DELETE и передавать только произошедшие изменения
Какие способы используют для поиска изменений?
- updated_at — простой вариант для таблиц, где есть надёжное поле изменения - Последовательный id — подходит, если данные только добавляются и старые записи не меняются - CDC — отслеживает изменения непосредственно в источнике и подходит для более сложных сценариев
Главный плюс инкрементальной загрузки — не нужно каждый раз обрабатывать весь объём данных
Это снижает нагрузку на источник, ускоряет загрузку и экономит ресурсы