Выбор ответа Middle CDC и инкрементальная загрузка спрашивают часто обновлено

Потери на границе водяного знака

Вопрос

Инкрементальная загрузка берёт updated_at > :last_watermark, где водяной знак равен максимальному updated_at прошлой выгрузки. Изредка пропадают строки. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Строки с тем же updatedat или закоммиченные позже с ранней меткой не попадают; нужно перекрытие и upsert. Метка времени присваивается в момент изменения, а видимой строка становится при коммите.

Варианты ответа

  1. PostgreSQL округляет timestamp до секунд, и строки внутри одной секунды после границы теряются
  2. Водяной знак нужно хранить в XCom, а не в таблице: иначе параллельные запуски DAG перезаписывают его друг у друга
  3. Строки с тем же updated_at или закоммиченные позже с ранней меткой не попадают; нужно перекрытие и upsertправильный ответ
  4. Выгрузку нужно сортировать по первичному ключу, иначе часть страниц при чтении пропускается

Разбор

Метка времени присваивается в момент изменения, а видимой строка становится при коммите. Долгая транзакция может закоммитить строку с меткой ниже уже сдвинутого водяного знака, а строки с одинаковым временем делятся границей. Перекрытие окна возвращает их, а upsert гасит повторы. PostgreSQL хранит микросекунды. Место хранения водяного знака проблему не решает. Сортировка выгрузки не меняет условие отбора.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.