Pull to refresh

Comments 2

Это цветочки, если нужно просто изменившиеся данные находить и обрабатывать. Более сложный кейс - это когда связные сущности приходят независимо друг от друга и для обновления хранилища приходится по дельте одной сущности искать в истории все данные связной сущности. В таком случае сложность организации инкрементальной загрузки растёт с количеством взаимосвязанных объектов.

Пример: freights и surcharges при перевозке грузов. Зачастую эти данные приходят независимо и имеют период действия довольно широкий и совершенно разный. Например, стоимость входа в порт (surcharge) может быть валидна год. А может прийти изменение этой стоимости и тогда по этому surcharge нужно найти все freights, которые попадали в период его действия и перерасчитать полную стоимость перевозки. Таким образом дельта, состоящая из одной строки спровоцирует скан таблицы freights за год в худшем случае. А могут одновременно изменяться и freights (соответственно нужно искать связанные surcharges) и surcharges (нужно искать связанные freights).

Взяли пример примитивный же :)

На моей практике был случай построения инкремента для таблицы, у которой 57 таблиц источников и каждой таблицы-истоника своя гранулярность изменения и своя функция извлечения инкремента. И тут уже задача усложняется на пару порядков. Но она решаема например методом сбора ключей целевой таблицы через внешние соединения на инкремент таблиц-источников.

Само по себе извлечение инкремента из источника может быть не тривиальной задачей и не всегда это можно решить через простую детерминированную скалярную функцию в условии where. Это может быть и плавающее окно и сбор измененных ключей источника через CDC процесс.

По накате инкремента нет важного упоминания что такая операция всегда должна быть атомарной в одну транзакцию - "все или ничего". Техника наката должна подбираться под конкретную СУБД. Не всегда upsert и delete оптимальные операторы например в колоночных СУБД. Тогда применяется другая магия а которой можно отдельную статью написать.

Sign up to leave a comment.