Инкрементальная загрузка данных

Представим таблицу на 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 — отслеживает изменения непосредственно в источнике и подходит для более сложных сценариев

Главный плюс инкрементальной загрузки — не нужно каждый раз обрабатывать весь объём данных

Это снижает нагрузку на источник, ускоряет загрузку и экономит ресурсы

Инкрементальная загрузка данных | Сетка — социальная сеть от hh.ru Инкрементальная загрузка данных | Сетка — социальная сеть от hh.ru