Перейти к основному содержанию

Словари в ClickHouse

Словари, созданные в ClickHouse Cloud, на начальном этапе создания могут временно работать несогласованно. Это означает, что сразу после создания вы можете не увидеть в словаре никаких данных. Однако после нескольких попыток запрос на создание может попасть на другие реплики, и данные станут видимыми. Иногда это происходит потому, что словарь был создан до того, как часть попала на сервер. Например:
2024-01-25 13:38:25.615837 - CREATE DICTIONARY received
2024-01-25 13:38:25.626468 - CREATE DICTIONARY finished
2024-01-25 13:38:25.733008 - Part all_0_0_0 downloaded
Как видите, часть появилась только после создания словаря. Это может быть ещё более серьёзной проблемой, если вы используете LIFETIME(MIN 0 MAX 0), потому что в этом случае словарь никогда не будет обновляться автоматически. Поэтому словарь останется пустым, пока не будет выполнена команда RELOAD DICTIONARIES. Чтобы решить эту проблему, при создании словаря используйте запрос SELECT вместо указания исходной таблицы и включите настройку select_sequential_consistency=1. Вместо указания исходной таблицы:
SOURCE(CLICKHOUSE(
    table 'test.temp_title_table_1706189903924'
    user default password 'PASSWORD'))
Используйте запрос SELECT с select_sequential_consistency=1:
SOURCE(CLICKHOUSE(QUERY
    'SELECT songTitle, mappedTitle
    FROM test.temp_title_table_1706189903924
    SETTINGS select_sequential_consistency=1' USER default PASSWORD ''))

Почему возникает эта проблема?

Когда вы выполняете вставку данных, а затем создаете или перезагружаете словарь, DDL может дойти до реплики раньше самих данных (или новых данных). Из-за этого словари на разных репликах могут оказаться в несогласованном состоянии. В результате, в зависимости от того, на какую реплику попадет запрос, вы можете получить разные результаты. Обратите внимание: то же самое происходит, если вы выполняете вставку, а затем сразу читаете данные из таблицы. Если чтение идет с реплики, которая еще не успела реплицировать данные, вы не увидите только что вставленные данные. Если вам нужна последовательная согласованность, ценой снижения производительности (поэтому использовать ее обычно не рекомендуется), можно включить select_sequential_consistency. Со словарями ситуация немного сложнее, поскольку они используют не настройки запроса, а настройки сервера. В результате при загрузке данных в словарь, даже если вы выполняете SET select_sequential_consistency=1, данные на разных репликах все равно могут загружаться несогласованно. Если указать select_sequential_consistency=1 в запросе источника словаря, словарь будет учитывать эту настройку, даже если она не включена глобально как настройка сервера.
Последнее изменение 10 июня 2026 г.