[Документация Yandex Cloud](../../index.md) > [Yandex Data Transfer](../index.md) > [Концепции](index.md) > Периодическое инкрементальное копирование

# Периодическое инкрементальное копирование

Такое копирование запускается через определенные интервалы времени. При нем в приемник попадают только те данные, которые были изменены в источнике с момента предыдущего копирования. Этот подход позволяет обновлять данные в приемнике с минимальными задержками и с низкой нагрузкой на источник данных, но не учитывает операции удаления данных в источнике. Это эффективнее, чем копировать таблицы целиком, но менее эффективно, чем использовать тип трансфера _**Копирование и репликация**_.

{% note info %}

Инкрементальное копирование можно настроить для источников PostgreSQL, ClickHouse® и Airbyte®.

{% endnote %}

Чтобы найти измененные данные, в таблице используется _ключевая колонка_, значения в которой меняются при каждом добавлении или обновлении данных. Для ключевой колонки рекомендуется построить индекс, чтобы каждый вызов не приводил к полному сканированию таблицы (fullscan). Если в таблицу только добавляются данные, в качестве ключевой колонки подходит столбец `id`. Если в таблице могут изменяться существующие данные, в качестве ключевой колонки рекомендуется добавить столбец `updated_at` с [временным](https://postgrespro.ru/docs//postgresql/current/datatype-datetime) типом данных и записывать в него текущее время при каждом изменении. Трансфер запоминает максимальное значение в ключевой колонке и при следующей активации будет считывать только те данные, которые были добавлены или обновлены с момента последнего запуска.

В качестве ключевой колонки можно указывать столбцы таблиц с [числовым](https://postgrespro.ru/docs//postgresql/current/datatype-numeric), [символьным](https://postgrespro.ru/docs//postgresql/current/datatype-character) или [временным](https://postgrespro.ru/docs//postgresql/current/datatype-datetime) типом данных. А, например, тип данных [UUID](https://postgrespro.ru/docs//postgresql/current/datatype-uuid) не подойдет.

Чтобы периодическое инкрементальное копирование давало корректный результат, в таблице источника должны выполняться следующие условия:

* Значения ключевой колонки должны строго возрастать и не принимать значение `null`.
* Значения в ключевой колонке должны изменяться при добавлении и изменении данных.
* Данные не должны удаляться. Если удаление необходимо, сохраняйте данные для удаления в другую таблицу и поставляйте отдельно.

## Время ожидания завершения транзакций {#increment-delay}

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

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

Время ожидания завершения транзакций должно быть:

* Дольше, чем средняя транзакция вставки или изменения данных. В стандартных приложениях такие транзакции выполняются за несколько секунд.
* Значительно меньше периода между запусками трансфера, так как напрямую влияет на время выполнения трансфера.

Рекомендуемое значение и значение по умолчанию — `15` секунд.

_ClickHouse® является зарегистрированным товарным знаком [ClickHouse, Inc](https://clickhouse.com)._