ClickHouse/docs/ru/query_language/dicts/external_dicts_dict_lifetime.md
BayoNet 7ef480e4de
DOCS-442: RU translation of the docs on DDL queries creating extenal dictionary (#9141)
* CLICKHOUSEDOCS-442: Translated docs for DDL query for creating external dictinaries.

* CLICKHOUSEDOCS-442: Fixes.

* Update docs/ru/query_language/show.md

* CLICKHOUSEDOCS-442: Fixed failing build.

Co-authored-by: Ivan Blinkov <github@blinkov.ru>
2020-02-20 09:31:06 +03:00

4.0 KiB
Raw Blame History

Обновление словарей

ClickHouse периодически обновляет словари. Интервал обновления для полностью загружаемых словарей и интервал инвалидации для кэшируемых словарей определяется в теге <lifetime> в секундах.

Обновление словарей (кроме загрузки при первом использовании) не блокирует запросы - во время обновления используется старая версия словаря. Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.

Пример настройки:

<dictionary>
    ...
    <lifetime>300</lifetime>
    ...
</dictionary>

или

CREATE DICTIONARY (...)
...
LIFETIME(300)
...

Настройка <lifetime>0</lifetime> запрещает обновление словарей.

Можно задать интервал, внутри которого ClickHouse равномерно-случайно выберет время для обновления. Это необходимо для распределения нагрузки на источник словаря при обновлении на большом количестве серверов.

Пример настройки:

<dictionary>
    ...
    <lifetime>
        <min>300</min>
        <max>360</max>
    </lifetime>
    ...
</dictionary>

или

LIFETIME(MIN 300 MAX 360)

При обновлении словарей сервер ClickHouse применяет различную логику в зависимости от типа источника:

  • У текстового файла проверяется время модификации. Если время изменилось по отношению к запомненному ранее, то словарь обновляется.
  • Для таблиц типа MyISAM, время модификации проверяется запросом SHOW TABLE STATUS.
  • Словари из других источников по умолчанию обновляются каждый раз.

Для источников MySQL (InnoDB), ODBC и ClickHouse можно настроить запрос, который позволит обновлять словари только в случае их фактического изменения, а не каждый раз. Чтобы это сделать необходимо выполнить следующие условия/действия:

  • В таблице словаря должно быть поле, которое гарантированно изменяется при обновлении данных в источнике.
  • В настройках источника указывается запрос, который получает изменяющееся поле. Результат запроса сервер ClickHouse интерпретирует как строку и если эта строка изменилась по отношению к предыдущему состоянию, то словарь обновляется. Запрос следует указывать в поле <invalidate_query> настроек источника.

Пример настройки:

<dictionary>
    ...
    <odbc>
      ...
      <invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
    </odbc>
    ...
</dictionary>

или

...
SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1'))
...

Оригинальная статья