LIFETIME (задаётся в секундах).
LIFETIME — это интервал обновления для полностью загруженных словарей и интервал инвалидации для кэшированных словарей.
Во время обновления к старой версии словаря по-прежнему можно обращаться в запросах.
Обновление словарей не блокирует запросы, за исключением их начальной загрузки при первом использовании.
Если во время обновления возникает ошибка, она записывается в журнал сервера, а запросы могут по-прежнему использовать старую версию словаря.
Если обновление словаря завершается успешно, старая версия словаря заменяется атомарно.
Пример настроек:
<lifetime>0</lifetime> (LIFETIME(0)) предотвращает обновление словарей.
Можно задать интервал времени для обновлений, и ClickHouse выберет равномерно случайный момент в этих пределах. Это необходимо, чтобы распределить нагрузку на источник словаря при обновлении на большом числе серверов.
Пример настроек:
<min>0</min> и <max>0</max>, ClickHouse не перезагружает словарь по тайм-ауту.
В этом случае ClickHouse может перезагрузить словарь раньше, если был изменён файл конфигурации словаря или выполнена команда SYSTEM RELOAD DICTIONARY.
При обновлении словарей ClickHouse server использует разную логику в зависимости от типа источника:
- Для текстового файла проверяется время изменения. Если оно отличается от ранее зафиксированного, словарь обновляется.
- Словари из других источников по умолчанию обновляются при каждом обращении.
- В таблице словаря должно быть поле, которое всегда изменяется при обновлении исходных данных.
- В настройках источника должен быть указан запрос, возвращающий изменяющееся поле. ClickHouse server интерпретирует результат запроса как строку, и, если эта строка изменилась по сравнению с предыдущим состоянием, словарь обновляется. Укажите запрос в поле
<invalidate_query>в настройках источника.
Cache, ComplexKeyCache, SSDCache и SSDComplexKeyCache поддерживаются как синхронные, так и асинхронные обновления.
Для словарей Flat, Hashed, HashedArray и ComplexKeyHashed также можно запрашивать только те данные, которые изменились после предыдущего обновления. Если update_field указан в конфигурации источника словаря, в запрос данных будет добавлено значение времени предыдущего обновления в секундах. В зависимости от типа источника (Executable, HTTP, MySQL, PostgreSQL, ClickHouse или ODBC) перед запросом данных из внешнего источника к update_field будет применяться различная логика.
- Если источник — HTTP,
update_fieldбудет добавлен как параметр запроса, а его значением будет время последнего обновления. - Если источник — Executable,
update_fieldбудет добавлен как аргумент исполняемого скрипта, а его значением будет время последнего обновления. - Если источник — ClickHouse, MySQL, PostgreSQL или ODBC, будет добавлено дополнительное условие
WHERE, в которомupdate_fieldсравнивается со временем последнего обновления по условию «больше или равно».- По умолчанию это условие
WHEREпроверяется на самом верхнем уровне SQL-запроса. Либо это условие можно проверять в любом другомWHERE-условии внутри запроса, используя ключевое слово{condition}. Пример:
- По умолчанию это условие
update_field, можно также задать дополнительную опцию update_lag. Значение опции update_lag вычитается из времени предыдущего обновления перед запросом обновлённых данных.
Пример настроек: