Ограничения
Неопределённый статус вставки
Ограничение окна дедупликации
*_deduplication_window других операций вставки, дедупликация может работать не так, как задумано. В этом случае одни и те же данные могут быть вставлены несколько раз.
Включение дедупликации при вставке при повторных попытках
Дедупликация при вставке для таблиц
*MergeTree поддерживают дедупликацию при вставке.
Для движков *ReplicatedMergeTree дедупликация при вставке включена по умолчанию и управляется настройками replicated_deduplication_window и replicated_deduplication_window_seconds. Для нереплицируемых движков *MergeTree дедупликация управляется настройкой non_replicated_deduplication_window.
Перечисленные выше настройки определяют параметры журнала дедупликации таблицы. Журнал дедупликации хранит конечное число block_id, которые определяют, как работает дедупликация (см. ниже).
Дедупликация при вставке на уровне запроса
insert_deduplicate=1 включает дедупликацию на уровне запроса. Обратите внимание: если выполнить вставку данных с insert_deduplicate=0, эти данные уже нельзя будет дедуплицировать, даже если затем повторить вставку с insert_deduplicate=1. Это связано с тем, что при вставках с insert_deduplicate=0 для блоков не записываются идентификаторы block_id.
Как работает дедупликация при вставке
*MergeTree, каждому блоку присваивается уникальный block_id — хеш данных в этом блоке. Этот block_id используется как уникальный ключ операции вставки. Если такой же block_id найден в журнале дедупликации, блок считается дубликатом и не вставляется в таблицу.
Этот подход хорошо работает, когда вставки содержат разные данные. Однако если одни и те же данные намеренно вставляются несколько раз, нужно использовать настройку insert_deduplication_token, чтобы управлять процессом дедупликации. Эта настройка позволяет указать уникальный токен для каждой вставки, который ClickHouse использует для определения, являются ли данные дубликатом.
Для запросов INSERT ... VALUES разбиение вставляемых данных на блоки детерминировано и задаётся настройками. Поэтому повторные попытки вставки следует выполнять с теми же значениями настроек, что и в исходной операции.
Для запросов INSERT ... SELECT важно, чтобы часть SELECT возвращала одни и те же данные в одном и том же порядке при каждом выполнении. Обратите внимание: на практике этого трудно добиться. Чтобы обеспечить стабильный порядок данных при повторных попытках, укажите секцию ORDER BY ALL в части SELECT запроса. Сейчас в запросе необходимо использовать именно ORDER BY ALL. Поддержка ORDER BY пока не реализована, и часть SELECT запроса не будет считаться стабильной. Имейте в виду, что между повторными попытками выбранная таблица может быть обновлена — в этом случае результирующие данные могут измениться, и дедупликация не произойдёт. Кроме того, при вставке больших объёмов данных число блоков может превысить окно журнала дедупликации, и ClickHouse не сможет определить, что эти блоки нужно дедуплицировать.
Сейчас поведение INSERT ... SELECT управляется настройкой insert_select_deduplicate. Она определяет, применяется ли дедупликация к данным, вставляемым с помощью запросов INSERT ... SELECT. Подробности и примеры использования см. в документации по ссылке.
Дедупликация при вставке с materialized view
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views.
Если включена настройка insert_deduplicate=1, вставленные данные дедуплицируются в исходной таблице. Настройка deduplicate_blocks_in_dependent_materialized_views=1 дополнительно включает дедупликацию в зависимых таблицах. Для полной дедупликации необходимо включить обе настройки.
При вставке блоков в таблицы materialized view ClickHouse вычисляет block_id, хешируя строку, которая объединяет block_id исходной таблицы и дополнительные идентификаторы. Это обеспечивает точную дедупликацию в materialized view и позволяет различать данные по их исходной вставке независимо от преобразований, применённых до записи в целевую таблицу materialized view.
Примеры
Идентичные блоки после преобразований в materialized view
dst были вставлены две части. 2 блока из select — 2 части при вставке. Эти части содержат разные данные.
mv_dst было вставлено 2 части. Эти части содержат одни и те же данные, однако дедупликация для них не выполнялась.
dst, так и для таблицы mv_dst.
Идентичные блоки при вставке
select получаются два блока — следовательно, для вставки в таблицу dst тоже должно быть два блока. Однако мы видим, что в таблицу dst был вставлен только один блок. Это произошло потому, что для второго блока была выполнена дедупликация. В нём те же данные и тот же ключ дедупликации block_id, который вычисляется как хеш от вставленных данных. Такое поведение не соответствует ожидаемому. Такие случаи редки, но теоретически возможны. Чтобы корректно обрабатывать такие ситуации, пользователь должен указать insert_deduplication_token. Исправим это на следующих примерах:
Одинаковые блоки при вставке с insert_deduplication_token
insert_deduplication_token имеет более высокий приоритет: если указан insert_deduplication_token, ClickHouse не использует хеш-сумму данных.
Разные операции вставки после преобразования создают одинаковые данные в базовой таблице materialized view
mv_dst вставляются одни и те же данные. Данные не дедуплицируются, потому что исходные данные различались.
Разные варианты вставки через materialized view в одну базовую таблицу с эквивалентными данными
mv_dst (как и ожидалось).
dst и mv_dst.