Словари
Словарь — это отображение (ключ -> атрибуты
), которое удобно для различных типов справочных списков.
ClickHouse поддерживает специальные функции для работы со словарями, которые можно использовать в запросах. Использовать словари с функциями проще и эффективнее, чем использовать JOIN
со справочными таблицами.
ClickHouse поддерживает:
- Словари с набором функций.
- Встроенные словари с конкретным набором функций.
Если вы только начинаете работать со Словарями в ClickHouse, у нас есть учебник, который охватывает эту тему. Загляните сюда.
Вы можете добавлять свои собственные словари из различных источников данных. Источником для словаря может быть таблица ClickHouse, локальный текстовый или исполняемый файл, HTTP(s) ресурс или другая СУБД. Для получения дополнительной информации смотрите "Источники словарей".
ClickHouse:
- Полностью или частично хранит словари в RAM.
- Периодически обновляет словари и динамически загружает отсутствующие значения. Другими словами, словари могут загружаться динамически.
- Позволяет создавать словари с помощью xml файлов или DDL запросов.
Конфигурация словарей может находиться в одном или нескольких xml-файлах. Путь к конфигурации указывается в параметре dictionaries_config.
Словари могут загружаться при запуске сервера или при первом использовании, в зависимости от настройки dictionaries_lazy_load.
Системная таблица dictionaries содержит информацию о словарях, сконфигурированных на сервере. Для каждого словаря там можно найти:
- Статус словаря.
- Конфигурационные параметры.
- Метрики, такие как объем RAM, выделенный для словаря, или количество запросов с момента успешной загрузки словаря.
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Создание словаря с помощью DDL-запроса
Словари могут быть созданы с помощью DDL запросов, и это рекомендуемый метод, так как при создании словарей с помощью DDL:
- Не добавляются дополнительные записи в файлы конфигурации сервера.
- Словарями можно управлять как первоклассными сущностями, такими как таблицы или представления.
- Данные могут быть прочитаны напрямую, используя знакомый SELECT, а не функции табличного словаря. Обратите внимание, что при прямом доступе к словарю через оператор SELECT кэшированный словарь вернет только кэшированные данные, в то время как некэшированный словарь — все данные, которые он хранит.
- Словари можно легко переименовывать.
Создание словаря с помощью конфигурационного файла
Создание словаря с помощью конфигурационного файла не применимо к ClickHouse Cloud. Пожалуйста, используйте DDL (см. выше) и создайте свой словарь как пользователь default
.
Конфигурационный файл словаря имеет следующий формат:
Вы можете настроить любое количество словарей в одном и том же файле.
Вы можете преобразовать значения для небольшого словаря, описывая его в запросе SELECT
(см. функцию transform). Эта функциональность не связана со словарями.
Настройка словаря
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Если словарь настроен с использованием xml файла, то конфигурация словаря имеет следующую структуру:
Соответствующий DDL-запрос имеет следующую структуру:
Хранение словарей в памяти
Существует множество способов хранения словарей в памяти.
Мы рекомендуем flat, hashed и complex_key_hashed, которые обеспечивают оптимальную скорость обработки.
Кэширование не рекомендуется из-за потенциально низкой производительности и трудностей в выборе оптимальных параметров. Читайте подробнее в разделе cache.
Существует несколько способов улучшить производительность словаря:
- Вызывайте функцию для работы со словарем после
GROUP BY
. - Отмечайте атрибуты для извлечения как инъективные. Атрибут называется инъективным, если различным ключам соответствуют различные значения атрибутов. Таким образом, когда
GROUP BY
использует функцию, которая извлекает значение атрибута по ключу, эта функция автоматически исключается изGROUP BY
.
ClickHouse генерирует исключение для ошибок со словарями. Примеры ошибок:
- Словарь, к которому осуществляется доступ, не может быть загружен.
- Ошибка при запросе к
cached
словарю.
Вы можете видеть список словарей и их статусы в таблице system.dictionaries.
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Конфигурация выглядит следующим образом:
Соответствующий DDL-запрос:
Словари без слова complex-key*
в компоновке имеют ключ с типом UInt64, словари complex-key*
имеют составной ключ (сложный, с произвольными типами).
Ключи UInt64 в XML словарях определяются с помощью тега <id>
.
Пример конфигурации (колонка key_column имеет тип UInt64):
Составные complex
ключи XML словарей определяются тегом <key>
.
Пример конфигурации составного ключа (ключ имеет один элемент с типом String):
Способы хранения словарей в памяти
Различные методы хранения данных словарей в памяти связаны с компромиссами в использовании CPU и RAM. Дерево решений, опубликованное в разделе Выбор компоновки блога, связанного со словарями, является хорошей отправной точкой для принятия решения о том, какую компоновку использовать.
- flat
- hashed
- sparse_hashed
- complex_key_hashed
- complex_key_sparse_hashed
- hashed_array
- complex_key_hashed_array
- range_hashed
- complex_key_range_hashed
- cache
- complex_key_cache
- ssd_cache
- complex_key_ssd_cache
- direct
- complex_key_direct
- ip_trie
flat
Словарь полностью хранится в памяти в виде плоских массивов. Сколько памяти использует словарь? Объем пропорционален размеру наибольшего ключа (в занимаемом пространстве).
Ключ словаря имеет тип UInt64, а значение ограничено max_array_size
(по умолчанию — 500,000). Если во время создания словаря обнаружен более крупный ключ, ClickHouse выбрасывает исключение и не создает словарь. Начальный размер плоских массивов словаря контролируется настройкой initial_array_size
(по умолчанию — 1024).
Поддерживаются все типы источников. При обновлении данные (из файла или таблицы) считываются полностью.
Этот метод обеспечивает наилучшую производительность среди всех доступных методов хранения словаря.
Пример конфигурации:
или
hashed
Словарь полностью хранится в памяти в виде хеш-таблицы. Словарь может содержать любое количество элементов с любыми идентификаторами. На практике количество ключей может достигать десятков миллионов.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников. При обновлении данные (из файла или таблицы) считываются полностью.
Пример конфигурации:
или
Пример конфигурации:
или
sparse_hashed
Аналогично hashed
, но использует меньше памяти в ущерб большему использованию CPU.
Ключ словаря имеет тип UInt64.
Пример конфигурации:
или
Также возможно использовать shards
для этого типа словаря, и это более важно для sparse_hashed
, чем для hashed
, поскольку sparse_hashed
медленнее.
complex_key_hashed
Этот тип хранения предназначен для использования с составными ключами. Аналогично hashed
.
Пример конфигурации:
или
complex_key_sparse_hashed
Этот тип хранения предназначен для использования с составными ключами. Аналогично sparse_hashed.
Пример конфигурации:
или
hashed_array
Словарь полностью хранится в памяти. Каждый атрибут хранится в массиве. Ключевой атрибут хранится в виде хеш-таблицы, где значение — это индекс в массиве атрибутов. Словарь может содержать любое количество элементов с любыми идентификаторами. На практике количество ключей может достигать десятков миллионов.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников. При обновлении данные (из файла или таблицы) считываются полностью.
Пример конфигурации:
или
complex_key_hashed_array
Этот тип хранения предназначен для использования с составными ключами. Аналогично hashed_array.
Пример конфигурации:
или
range_hashed
Словарь хранится в памяти в виде хеш-таблицы с упорядоченным массивом диапазонов и их соответствующими значениями.
Ключ словаря имеет тип UInt64. Этот метод хранения работает так же, как и hashed и позволяет использовать диапазоны даты/времени (произвольный числовой тип) в дополнение к ключу.
Пример: таблица содержит скидки для каждого рекламодателя в формате:
Чтобы использовать выборку для диапазонов дат, определите элементы range_min
и range_max
в структуре. Эти элементы должны содержать элементы name
и type
(если type
не указан, будет использован тип по умолчанию — Date). type
может быть любым числовым типом (Date / DateTime / UInt64 / Int32 / другие).
Значения range_min
и range_max
должны помещаться в тип Int64
.
Пример:
или
Для работы с этими словарями вам необходимо передать дополнительный аргумент функции dictGet
, для которого выбирается диапазон:
Пример запроса:
Эта функция возвращает значение для указанных id
и диапазона дат, который включает переданную дату.
Подробности алгоритма:
- Если
id
не найден или диапазон не найден дляid
, возвращается значение по умолчанию типа атрибута. - Если есть пересекающиеся диапазоны и
range_lookup_strategy=min
, возвращается совпадающий диапазон с минимальнымrange_min
, если найдено несколько диапазонов, возвращается диапазон с минимальнымrange_max
, если снова найдено несколько диапазонов (несколько диапазонов имели одинаковыйrange_min
иrange_max
), возвращается случайный из них. - Если есть пересекающиеся диапазоны и
range_lookup_strategy=max
, возвращается совпадающий диапазон с максимальнымrange_min
, если найдено несколько диапазонов, возвращается диапазон с максимальнымrange_max
, если снова найдено несколько диапазонов (несколько диапазонов имели одинаковыйrange_min
иrange_max
), возвращается случайный из них. - Если
range_max
— этоNULL
, диапазон открыт.NULL
обрабатывается как максимальное возможное значение. Дляrange_min
можно использовать1970-01-01
или0
(-MAX_INT) как открытое значение.
Пример конфигурации:
или
Пример конфигурации с пересекающимися диапазонами и открытыми диапазонами:
complex_key_range_hashed
Словарь хранится в памяти в виде хеш-таблицы с упорядоченным массивом диапазонов и соответствующими значениями (см. range_hashed). Этот тип хранения предназначен для использования с составными ключами.
Пример конфигурации:
cache
Словарь хранится в кэше с фиксированным количеством ячеек. Эти ячейки содержат часто используемые элементы.
Ключ словаря имеет тип UInt64.
При поиске словаря сначала ищется в кэше. Для каждого блока данных запрашиваются все ключи, которые не найдены в кэше или устарели, с использованием запроса SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)
. Полученные данные затем записываются в кэш.
Если ключи не найдены в словаре, то создается задача обновления кэша и добавляется в очередь обновления. Свойства очереди обновления могут контролироваться с помощью настроек max_update_queue_size
, update_queue_push_timeout_milliseconds
, query_wait_timeout_milliseconds
, max_threads_for_updates
.
Для кэшированных словарей можно задать expiration lifetime данных в кэше. Если с момента загрузки данных в ячейку прошло больше времени, чем lifetime
, значение ячейки не используется, и ключ становится устаревшим. Ключ запрашивается снова в следующий раз, когда он нужно будет использовать. Это поведение можно настроить с помощью настройки allow_read_expired_keys
.
Это самый неэффективный из всех способов хранения словарей. Скорость кэша сильно зависит от правильных настроек и сценария использования. Словарь типа кэш работает хорошо только при высоких уровнях попадания (рекомендуется 99% и выше). Вы можете просмотреть средний уровень попадания в таблице system.dictionaries.
Если настройка allow_read_expired_keys
установлена в 1, по умолчанию 0, то словарь может поддерживать асинхронные обновления. Если клиент запрашивает ключи, и все они находятся в кэше, но некоторые из них устарели, то словарь вернет устаревшие ключи клиенту и запросит их асинхронно из источника.
Для повышения производительности кэша используйте подзапрос с LIMIT
и вызывайте функцию со словарем извне.
Поддерживаются все типы источников.
Пример настроек:
или
Установите достаточно большой размер кэша. Вам нужно экспериментировать, чтобы выбрать количество ячеек:
- Установите какое-то значение.
- Запустите запросы, пока кэш не заполнится полностью.
- Оцените использование памяти с помощью таблицы
system.dictionaries
. - Увеличивайте или уменьшайте количество ячеек, пока не будет достигнуто необходимое потребление памяти.
Не используйте ClickHouse в качестве источника, так как это медленно обрабатывает запросы с произвольными чтениями.
complex_key_cache
Этот тип хранения предназначен для использования с составными ключами. Аналогично cache
.
ssd_cache
Аналогично cache
, но хранит данные на SSD, а индекс в RAM. Все настройки кэш-диктантов, связанные с очередью обновления, также могут быть применены к словарям кэша SSD.
Ключ словаря имеет тип UInt64.
или
complex_key_ssd_cache
Этот тип хранения предназначен для использования с составными ключами. Аналогично ssd_cache
.
direct
Словарь не хранится в памяти и напрямую обращается к источнику во время обработки запроса.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников, кроме локальных файлов.
Пример конфигурации:
или
complex_key_direct
Этот тип хранения предназначен для использования с составными ключами. Аналогично direct
.
ip_trie
Этот словарь предназначен для поиска IP-адресов по сетевому префиксу. Он хранит диапазоны IP в нотации CIDR и позволяет быстро определять, к какому префиксу (например, подсеть или диапазон ASN) относится данный IP, что делает его идеальным для поиска на основе IP, такого как геолокация или классификация сети.
Пример
Предположим, у нас есть таблица в ClickHouse, которая содержит наши IP-префиксы и сопоставления:
Давайте определим словарь ip_trie
для этой таблицы. Компоновка ip_trie
требует составного ключа:
или
Ключ должен иметь только один атрибут типа String
, который содержит допустимый IP-префикс. Другие типы пока не поддерживаются.
Синтаксис:
Функция принимает либо UInt32
для IPv4, либо FixedString(16)
для IPv6. Например:
Другие типы пока не поддерживаются. Функция возвращает атрибут для префикса, который соответствует данному IP-адресу. Если есть пересекающиеся префиксы, возвращается самый конкретный.
Данные должны полностью помещаться в RAM.
Обновление данных словаря с использованием LIFETIME
ClickHouse периодически обновляет словари на основе тега LIFETIME
(определенным в секундах). LIFETIME
— это интервал обновления для полностью загруженных словарей и интервал недействительности для кэшированных словарей.
Во время обновлений старая версия словаря все еще может использоваться для запросов. Обновления словаря (кроме загрузки словаря при первом использовании) не блокируют запросы. Если возникает ошибка во время обновления, ошибка записывается в журнал сервера и запросы могут продолжаться с использованием старой версии словаря. Если обновление словаря прошло успешно, старая версия словаря заменяется атомарно.
Пример настроек:
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
или
Установка <lifetime>0</lifetime>
(LIFETIME(0)
) предотвращает обновление словарей.
Вы можете установить временной интервал для обновлений, и ClickHouse выберет равномерно случайное время в этом диапазоне. Это необходимо для распределения нагрузки на источник словаря при обновлении на большом количестве серверов.
Пример настроек:
или
Если <min>0</min>
и <max>0</max>
, ClickHouse не перезагрузит словарь по таймауту. В этом случае ClickHouse может перезагрузить словарь раньше, если конфигурационный файл словаря был изменен или была выполнена команда SYSTEM RELOAD DICTIONARY
.
При обновлении словарей сервер ClickHouse применяет различную логику в зависимости от типа источника:
- Для текстового файла проверяется время модификации. Если время отличается от ранее записанного времени, словарь обновляется.
- Словари из других источников обновляются каждый раз по умолчанию.
Для других источников (ODBC, PostgreSQL, ClickHouse и т.д.) вы можете настроить запрос, который обновит словари только в том случае, если они действительно изменились, а не каждый раз. Для этого выполните следующие действия:
- Таблица словаря должна иметь поле, которое всегда меняется, когда обновляются исходные данные.
- Настройки источника должны указывать запрос, который извлекает изменяющееся поле. Сервер ClickHouse интерпретирует результат запроса как строку, и если эта строка изменилась по сравнению с ее предыдущим состоянием, словарь обновляется. Укажите запрос в поле
<invalidate_query>
в настройках для источника.
Пример настроек:
или
Для словарей Cache
, ComplexKeyCache
, SSDCache
и SSDComplexKeyCache
поддерживаются как синхронные, так и асинхронные обновления.
Также возможно для словарей Flat
, Hashed
, HashedArray
, ComplexKeyHashed
запрашивать только данные, которые изменились после предыдущего обновления. Если update_field
указан как часть конфигурации источника словаря, значение времени предыдущего обновления в секундах будет добавлено к запросу данных. В зависимости от типа источника (исполняемый файл, HTTP, MySQL, PostgreSQL, ClickHouse или ODBC) будет применена различная логика к update_field
перед запросом данных из внешнего источника.
- Если источник — это HTTP, то
update_field
будет добавлен в качестве параметра запроса с последним временем обновления в качестве значения параметра. - Если источник — исполняемый файл, то
update_field
будет добавлен в качестве аргумента исполняемого сценария с последним временем обновления в качестве значения аргумента. - Если источник — ClickHouse, MySQL, PostgreSQL, ODBC — будет дополнительная часть
WHERE
, гдеupdate_field
будет сравнен как больше или равно с последним временем обновления.- По умолчанию это условие
WHERE
проверяется на высшем уровне SQL-запроса. В качестве альтернативы это условие может быть проверено в любом другомWHERE
-условии внутри запроса с использованием ключевого слова{condition}
. Пример:
- По умолчанию это условие
Если опция update_field
установлена, можно задать дополнительную опцию update_lag
. Значение опции update_lag
вычитается из времени предыдущего обновления перед запросом обновленных данных.
Пример настроек:
или
Источники словарей
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Словарь может быть подключен к ClickHouse из различных источников.
Если словарь настроен с использованием xml файла, конфигурация выглядит следующим образом:
В случае DDL-запроса конфигурация, описанная выше, будет выглядеть так:
Источник настраивается в разделе source
.
Для типов источников Локальный файл, Исполняемый файл, HTTP(s), ClickHouse доступны опциональные настройки:
или
Типы источников (source_type
):
Локальный файл
Пример настроек:
или
Поля настройки:
path
— Абсолютный путь к файлу.format
— Формат файла. Поддерживаются все форматы, описанные в Форматы.
Когда словарь с источником FILE
создается с помощью DDL команды (CREATE DICTIONARY ...
), исходный файл должен находиться в директории user_files
, чтобы предотвратить доступ пользователей БД к произвольным файлам на узле ClickHouse.
См. Также
Исполняемый файл
Работа с исполняемыми файлами зависит от того, как словарь хранится в памяти. Если словарь хранится с использованием cache
и complex_key_cache
, ClickHouse запрашивает необходимые ключи, отправляя запрос в STDIN исполняемого файла. В противном случае ClickHouse запускает исполняемый файл и рассматривает его вывод как данные словаря.
Пример настроек:
Поля настройки:
command
— Абсолютный путь к исполняемому файлу или имя файла (если каталог команды находится вPATH
).format
— Формат файла. Поддерживаются все форматы, описанные в Форматы.command_termination_timeout
— исполняемый сценарий должен содержать основной цикл чтения и записи. После уничтожения словаря труба закрывается, и исполняемый файл будет иметьcommand_termination_timeout
секунд на завершение, прежде чем ClickHouse отправит сигнал SIGTERM дочернему процессу.command_termination_timeout
указывается в секундах. Значение по умолчанию — 10. Необязательный параметр.command_read_timeout
- Таймаут для чтения данных из stdout команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.command_write_timeout
- Таймаут для записи данных в stdin команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.implicit_key
— исполняемый исходный файл может возвращать только значения, и соответствие запрашиваемым ключам определяется неявно — по порядку строк в результате. Значение по умолчанию — false.execute_direct
- Еслиexecute_direct
=1
, тоcommand
будет искаться внутри папки user_scripts, указанной с помощью user_scripts_path. Дополнительные аргументы сценария могут быть указаны с помощью пробела в качестве разделителя. Пример:script_name arg1 arg2
. Еслиexecute_direct
=0
,command
передается в качестве аргумента дляbin/sh -c
. Значение по умолчанию —0
. Необязательный параметр.send_chunk_header
- контролирует, нужно ли отправлять количество строк перед отправкой блока данных для обработки. Необязательный. Значение по умолчанию —false
.
Этот источник словаря можно настроить только с помощью XML-конфигурации. Создание словарей с исполняемым источником через DDL отключено, иначе пользователь БД мог бы выполнять произвольные бинарные файлы на узле ClickHouse.
Исполняемый пул
Исполняемый пул позволяет загружать данные из пула процессов. Этот источник не работает с компоновками словарей, которые требуют загрузки всех данных из источника. Исполняемый пул работает, если словарь хранится с использованием cache
, complex_key_cache
, ssd_cache
, complex_key_ssd_cache
, direct
или complex_key_direct
компоновок.
Исполняемый пул будет создавать пул процессов с указанной командой и поддерживать их работу до тех пор, пока они не завершатся. Программа должна считывать данные из STDIN, пока они доступны, и выводить результат в STDOUT. Она может ожидать следующий блок данных в STDIN. ClickHouse не закроет STDIN после обработки блока данных, но будет передавать другой фрагмент данных по мере необходимости. Исполняемый сценарий должен быть готов к такому способу обработки данных — он должен опрашивать STDIN и сбрасывать данные в STDOUT заранее.
Пример настроек:
Поля настройки:
command
— Абсолютный путь к исполняемому файлу или имя файла (если каталог программы записан вPATH
).format
— Формат файла. Поддерживаются все форматы, описанные в "Форматах".pool_size
— Размер пула. Если 0 указано в качествеpool_size
, то ограничений по размеру пула нет. Значение по умолчанию —16
.command_termination_timeout
— исполняемый сценарий должен содержать основной цикл чтения и записи. После уничтожения словаря труба закрывается, и исполняемый файл будет иметьcommand_termination_timeout
секунд на завершение, прежде чем ClickHouse отправит сигнал SIGTERM дочернему процессу. Указывается в секундах. Значение по умолчанию — 10. Необязательный параметр.max_command_execution_time
— максимальное время выполнения команды исполняемого скрипта для обработки блока данных. Указывается в секундах. Значение по умолчанию — 10. Необязательный параметр.command_read_timeout
- тайм-аут для чтения данных из stdout команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.command_write_timeout
- тайм-аут для записи данных в stdin команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.implicit_key
— исполняемый исходный файл может возвращать только значения, и соответствие запрашиваемым ключам определяется неявно — по порядку строк в результате. Значение по умолчанию — false. Необязательный параметр.execute_direct
- Еслиexecute_direct
=1
, тоcommand
будет искаться внутри папки user_scripts, указанной с помощью user_scripts_path. Дополнительные аргументы сценария могут быть указаны с помощью пробела в качестве разделителя. Пример:script_name arg1 arg2
. Еслиexecute_direct
=0
,command
передается в качестве аргумента дляbin/sh -c
. Значение по умолчанию —1
. Необязательный параметр.send_chunk_header
- контролирует, нужно ли отправлять количество строк перед отправкой блока данных для обработки. Необязательный. Значение по умолчанию —false
.
Этот источник словаря можно настроить только с помощью XML-конфигурации. Создание словарей с исполняемым источником через DDL отключено, иначе пользователь БД мог бы выполнять произвольный бинарный файл на узле ClickHouse.
HTTP(S)
Работа с HTTP(S) сервером зависит от того, как словарь хранится в памяти. Если словарь хранится с использованием cache
и complex_key_cache
, ClickHouse запрашивает необходимые ключи, отправляя запрос с помощью метода POST
.
Пример настроек:
или
Для того чтобы ClickHouse мог получить доступ к HTTPS ресурсу, необходимо настроить openSSL в конфигурации сервера.
Параметры настроек:
url
– Исходный URL.format
– Формат файла. Поддерживаются все форматы, описанные в "Форматы".credentials
– Базовая HTTP аутентификация. Необязательный параметр.user
– Имя пользователя, необходимое для аутентификации.password
– Пароль, необходимый для аутентификации.headers
– Все пользовательские записи заголовков HTTP, используемые для HTTP-запроса. Необязательный параметр.header
– Один заголовок HTTP.name
– Имя идентификатора, использующегося для заголовка, отправленного с запросом.value
– Значение, установленное для определенного имени идентификатора.
При создании словаря с помощью команды DDL (CREATE DICTIONARY ...
) удаленные хосты для HTTP словарей проверяются на соответствие содержимому секции remote_url_allow_hosts
из конфигурации, чтобы предотвратить доступ пользователей базы данных к произвольному HTTP серверу.
DBMS
ODBC
Вы можете использовать этот метод для подключения к любой базе данных, для которой есть ODBC драйвер.
Пример настроек:
или
Параметры настроек:
db
– Имя базы данных. Укажите его, если имя базы данных не задано в параметрах<connection_string>
.table
– Имя таблицы и схемы, если они существуют.connection_string
– Строка подключения.invalidate_query
– Запрос для проверки статуса словаря. Необязательный параметр. Подробнее в разделе Обновление данных словаря с использованием LIFETIME.background_reconnect
– Повторное подключение к реплике в фоновом режиме в случае сбоя подключения. Необязательный параметр.query
– Пользовательский запрос. Необязательный параметр.
Поля table
и query
не могут использоваться одновременно. И одно из полей table
или query
должно быть объявлено.
ClickHouse получает символы кавычек от ODBC-драйвера и кладет все настройки в запросы к драйверу, поэтому необходимо установить имя таблицы в соответствии с регистром имени таблицы в базе данных.
Если у вас возникли проблемы с кодировками при использовании Oracle, смотрите соответствующий пункт Часто задаваемые вопросы.
Известная уязвимость функциональности ODBC словаря
При подключении к базе данных через ODBC-драйвер параметр подключения Servername
может быть подменен. В этом случае значения USERNAME
и PASSWORD
из odbc.ini
отправляются на удаленный сервер и могут быть скомпрометированы.
Пример небезопасного использования
Настроим unixODBC для PostgreSQL. Содержимое /etc/odbc.ini
:
Если затем вы сделаете запрос, такой как
ODBC-драйвер отправит значения USERNAME
и PASSWORD
из odbc.ini
на some-server.com
.
Пример подключения к PostgreSQL
Операционная система Ubuntu.
Установка unixODBC и ODBC-драйвера для PostgreSQL:
Настройка /etc/odbc.ini
(или ~/.odbc.ini
, если вы вошли как пользователь, который запускает ClickHouse):
Конфигурация словаря в ClickHouse:
или
Возможно, вам понадобится отредактировать odbc.ini
, чтобы указать полный путь к библиотеке с драйвером DRIVER=/usr/local/lib/psqlodbcw.so
.
Пример подключения к MS SQL Server
Операционная система Ubuntu.
Установка ODBC-драйвера для подключения к MS SQL:
Настройка драйвера:
Замечания:
- Чтобы определить самую раннюю версию TDS, поддерживаемую конкретной версией SQL Server, обратитесь к документации продукта или посмотрите MS-TDS Product Behavior
Настройка словаря в ClickHouse:
или
Mysql
Пример настроек:
или
Параметры настроек:
-
port
– Порт на сервере MySQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
). -
user
– Имя пользователя MySQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
). -
password
– Пароль пользователя MySQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
). -
replica
– Секция конфигурации реплик. Может быть несколько секций.replica/host
– Хост MySQL.replica/priority
– Приоритет реплики. При попытке подключения ClickHouse просматривает реплики в порядке приоритета. Чем ниже число, тем выше приоритет.
-
db
– Имя базы данных. -
table
– Имя таблицы. -
where
– Критерии выбора. Синтаксис для условий такой же, как для оператораWHERE
в MySQL, например,id > 10 AND id < 20
. Необязательный параметр. -
invalidate_query
– Запрос для проверки статуса словаря. Необязательный параметр. Подробнее в разделе Обновление данных словаря с использованием LIFETIME. -
fail_on_connection_loss
– Параметр конфигурации, который контролирует поведение сервера при потере подключения. Еслиtrue
, исключение выбрасывается немедленно, если связь между клиентом и сервером была утеряна. Еслиfalse
, сервер ClickHouse повторяет попытку выполнить запрос трижды, прежде чем выбросить исключение. Обратите внимание, что повторные попытки приводят к увеличению времени отклика. Значение по умолчанию:false
. -
query
– Пользовательский запрос. Необязательный параметр.
Поля table
или where
не могут использоваться вместе с полем query
. И одно из полей table
или query
должно быть объявлено.
Не существует явного параметра secure
. При установлении SSL-соединения безопасность является обязательной.
MySQL можно подключить к локальному хосту через сокеты. Для этого установите host
и socket
.
Пример настроек:
или
ClickHouse
Пример настроек:
или
Параметры настроек:
host
– Хост ClickHouse. Если это локальный хост, запрос обрабатывается без какой-либо сетевой активности. Для повышения отказоустойчивости вы можете создать Распределенную таблицу и использовать ее в последующих конфигурациях.port
– Порт на сервере ClickHouse.user
– Имя пользователя ClickHouse.password
– Пароль пользователя ClickHouse.db
– Имя базы данных.table
– Имя таблицы.where
– Критерии выбора. Может быть опущено.invalidate_query
– Запрос для проверки статуса словаря. Необязательный параметр. Подробнее в разделе Обновление данных словаря с использованием LIFETIME.secure
- Используйте ssl для подключения.query
– Пользовательский запрос. Необязательный параметр.
Поля table
или where
не могут использоваться вместе с полем query
. И одно из полей table
или query
должно быть объявлено.
MongoDB
Пример настроек:
или
или
Параметры настроек:
host
– Хост MongoDB.port
– Порт на сервере MongoDB.user
– Имя пользователя MongoDB.password
– Пароль пользователя MongoDB.db
– Имя базы данных.collection
– Имя коллекции.options
- Опции строки подключения MongoDB (необязательный параметр).
или
Параметры настроек:
uri
- URI для Establish подключения.collection
– Имя коллекции.
Redis
Пример настроек:
или
Параметры настроек:
host
– Хост Redis.port
– Порт на сервере Redis.storage_type
– Структура внутреннего хранилища Redis, используемая для работы с ключами.simple
предназначен для простых источников и для хешированных одиночных ключевых источников,hash_map
предназначен для хешированных источников с двумя ключами. Диапазон источников и кэшированные источники с комплексным ключом не поддерживаются. Может быть опущен, значение по умолчаниюsimple
.db_index
– Конкретный числовой индекс логической базы данных Redis. Может быть опущен, значение по умолчанию 0.
Cassandra
Пример настроек:
Параметры настроек:
host
– Хост Cassandra или запятую, разделенный список хостов.port
– Порт на серверах Cassandra. Если не указан, используется порт по умолчанию 9042.user
– Имя пользователя Cassandra.password
– Пароль пользователя Cassandra.keyspace
– Имя пространства ключей (базы данных).column_family
– Имя семейства столбцов (таблицы).allow_filtering
– Флаг, позволяющий или запрещающий потенциально дорогие условия по столбцам ключа кластеризации. Значение по умолчанию 1.partition_key_prefix
– Число столбцов ключа партиции в первичном ключе таблицы Cassandra. Обязательно для словарей составного ключа. Порядок ключевых столбцов в определении словаря должен быть таким же, как в Cassandra. Значение по умолчанию 1 (первый ключевой столбец является ключом партиции, а остальные ключевые столбцы — ключами кластеризации).consistency
– Уровень согласованности. Возможные значения:One
,Two
,Three
,All
,EachQuorum
,Quorum
,LocalQuorum
,LocalOne
,Serial
,LocalSerial
. Значение по умолчаниюOne
.where
– Необязательные критерии выбора.max_threads
– Максимальное количество потоков, которые могут быть использованы для загрузки данных из нескольких партиций в словарях составных ключей.query
– Пользовательский запрос. Необязательный параметр.
Поля column_family
или where
не могут использоваться вместе с полем query
. И одно из полей column_family
или query
должно быть объявлено.
PostgreSQL
Пример настроек:
или
Параметры настроек:
host
– Хост на сервере PostgreSQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
).port
– Порт на сервере PostgreSQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
).user
– Имя пользователя PostgreSQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
).password
– Пароль пользователя PostgreSQL. Вы можете указать его для всех реплик или для каждой по отдельности (внутри<replica>
).replica
– Секция конфигурации реплик. Может быть несколько секций:replica/host
– Хост PostgreSQL.replica/port
– Порт PostgreSQL.replica/priority
– Приоритет реплики. При попытке подключения ClickHouse просматривает реплики в порядке приоритета. Чем ниже число, тем выше приоритет.
db
– Имя базы данных.table
– Имя таблицы.where
– Критерии выбора. Синтаксис для условий такой же, как для оператораWHERE
в PostgreSQL. Например,id > 10 AND id < 20
. Необязательный параметр.invalidate_query
– Запрос для проверки статуса словаря. Необязательный параметр. Подробнее в разделе Обновление данных словаря с использованием LIFETIME.background_reconnect
– Повторное подключение к реплике в фоновом режиме в случае сбоя подключения. Необязательный параметр.query
– Пользовательский запрос. Необязательный параметр.
Поля table
или where
не могут использоваться вместе с полем query
. И одно из полей table
или query
должно быть объявлено.
Null
Специальный источник, который можно использовать для создания фиктивных (пустых) словарей. Такие словари могут быть полезны для тестов или с настройками с отдельными узлами данных и запросов на узлах с распределенными таблицами.
Ключ словаря и поля
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Клаузула structure
описывает ключ словаря и поля, доступные для запросов.
XML описание:
Атрибуты описаны в элементах:
<id>
— Ключевая колонка<attribute>
— Колонка данных: может быть несколько атрибутов.
DDL запрос:
Атрибуты описаны в теле запроса:
PRIMARY KEY
— Ключевая колонкаAttrName AttrType
— Колонка данных. Может быть несколько атрибутов.
Ключ
ClickHouse поддерживает следующие типы ключей:
- Числовой ключ.
UInt64
. Определен в теге<id>
или с использованием ключевого словаPRIMARY KEY
. - Составной ключ. Набор значений различных типов. Определен в теге
<key>
или с помощью ключевого словаPRIMARY KEY
.
XML-структура может содержать либо <id>
, либо <key>
. DDL-запрос должен содержать единственный PRIMARY KEY
.
Вы не должны описывать ключ как атрибут.
Числовой ключ
Тип: UInt64
.
Пример конфигурации:
Параметры конфигурации:
name
– Имя колонки с ключами.
Для DDL-запроса:
PRIMARY KEY
– Имя колонки с ключами.
Составной ключ
Ключ может быть tuple
из любых типов полей. Структура в этом случае должна быть complex_key_hashed
или complex_key_cache
.
Составной ключ может состоять из одного элемента. Это позволяет использовать строку в качестве ключа, например.
Структура ключа задается в элементе <key>
. Поля ключа указываются в том же формате, что и атрибуты словаря. Пример:
или
Для запроса к функции dictGet*
в качестве ключа передается кортеж. Пример: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2))
.
Атрибуты
Пример конфигурации:
или
Параметры конфигурации:
Тег | Описание | Обязательно |
---|---|---|
name | Имя колонки. | Да |
type | Тип данных ClickHouse: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64, UUID, Decimal32, Decimal64, Decimal128, Decimal256,Date, Date32, DateTime, DateTime64, String, Array. ClickHouse пытается привести значение из словаря к указанному типу данных. Например, для MySQL поле может быть TEXT , VARCHAR или BLOB в исходной таблице MySQL, но оно может быть загружено как String в ClickHouse.Nullable в настоящее время поддерживается для словарей Flat, Hashed, ComplexKeyHashed, Direct, ComplexKeyDirect, RangeHashed, Polygon, Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache. В словарях IPTrie типы Nullable не поддерживаются. | Да |
null_value | Значение по умолчанию для несуществующего элемента. В примере это пустая строка. Значение NULL может использоваться только для типов Nullable (см. предыдущую строку с описанием типов). | Да |
expression | Выражение, которое ClickHouse выполняет над значением. Выражение может быть именем колонки в удаленной SQL базе данных. Таким образом, вы можете использовать его для создания алиаса для удаленной колонки. Значение по умолчанию: без выражения. | Нет |
hierarchical | Если true , атрибут содержит значение родительского ключа для текущего ключа. См. Иерархические словари.Значение по умолчанию: false . | Нет |
injective | Флаг, который показывает, является ли изображение id -> attribute инъективным.Если true , ClickHouse может автоматически размещать после оператора GROUP BY запросы к словарям с инъекцией. Обычно это значительно снижает количество таких запросов.Значение по умолчанию: false . | Нет |
is_object_id | Флаг, который показывает, выполняется ли запрос для документа MongoDB по ObjectID .Значение по умолчанию: false . |
Иерархические словари
ClickHouse поддерживает иерархические словари с числовым ключом.
Посмотрите на следующую иерархическую структуру:
Эта иерархия может быть выражена в виде следующей таблицы словаря.
region_id | parent_region | region_name |
---|---|---|
1 | 0 | Россия |
2 | 1 | Москва |
3 | 2 | Центр |
4 | 0 | Великобритания |
5 | 4 | Лондон |
Эта таблица содержит колонку parent_region
, которая содержит ключ ближайшего родителя для элемента.
ClickHouse поддерживает иерархическое свойство для атрибутов внешних словарей. Это свойство позволяет вам настраивать иерархический словарь аналогично описанному выше.
Функция dictGetHierarchy позволяет вам получить цепочку родителей элемента.
Для нашего примера структура словаря может быть следующей:
Полигональные словари
Этот словарь оптимизирован для запросов "точка в полигоне", по сути, "обратный геокодинг". Учитывая координаты (широта/долгота), он эффективно находит, какой полигон/регион (из множества полигонов, таких как границы стран или регионов) содержит эту точку. Это хорошо подходит для сопоставления координат местоположений с их содержащим регионом.
Пример конфигурации полигонального словаря:
Если вы используете словарь с ClickHouse Cloud, пожалуйста, используйте опцию DDL-запроса для создания ваших словарей и создайте ваш словарь как пользователь default
.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с облаком.
Соответствующий DDL-запрос:
При настройке полигонального словаря ключ должен иметь один из двух типов:
- Простой полигон. Это массив точек.
- MultiPolygon. Это массив многоугольников. Каждый полигон является двумерным массивом точек. Первый элемент этого массива — это внешняя граница полигона, а последующие элементы определяют области, которые должны быть исключены из него.
Точки могут быть указаны как массив или кортеж их координат. В текущей реализации поддерживаются только двумерные точки.
Пользователь может загружать свои данные во всех форматах, поддерживаемых ClickHouse.
Доступно 3 типа хранения в памяти:
-
POLYGON_SIMPLE
. Это наивная реализация, где для каждого запроса производится линейный проход по всем полигонам, и проверяется принадлежность для каждого без использования дополнительных индексов. -
POLYGON_INDEX_EACH
. Для каждого полигона создаётся отдельный индекс, который позволяет быстро проверить, принадлежит ли он в большинстве случаев (оптимизирован для географических регионов). Также на рассматриваемую область накладывается сетка, что значительно сокращает количество рассматриваемых полигонов. Сетка создаётся рекурсивно, деля ячейку на 16 равных частей, и настраивается с помощью двух параметров. Деление останавливается, когда глубина рекурсии достигаетMAX_DEPTH
, или когда ячейка пересекает не более чемMIN_INTERSECTIONS
полигонов. Чтобы ответить на запрос, есть соответствующая ячейка, и к индексу для полигонов, хранящимся в ней, обращаются последовательно. -
POLYGON_INDEX_CELL
. Это размещение также создаёт описанную выше сетку. Доступны те же параметры. Для каждой ячейки сетки создаётся индекс на все фрагменты полигонов, которые в неё попадают, что позволяет быстро ответить на запрос. -
POLYGON
. СинонимPOLYGON_INDEX_CELL
.
Запросы к словарю осуществляются с использованием стандартных функций для работы со словарями. Важно отметить, что здесь ключами будут точки, для которых вы хотите найти содержащий их полигон.
Пример
Пример работы со словарём, определённым выше:
В результате выполнения последней команды для каждой точки в таблице 'points' будет найден минимальный полигон, содержащий эту точку, и будут выведены запрашиваемые атрибуты.
Пример
Вы можете читать колонки из полигональных словарей через SELECT запрос, просто включив store_polygon_key_column = 1
в конфигурации словаря или соответствующем DDL-запросе.
Запрос:
Результат:
Словарь дерева регулярных выражений
Этот словарь позволяет сопоставлять ключи значения на основе иерархических шаблонов регулярных выражений. Он оптимизирован для поиска по шаблонам (например, классификация строк, таких как строки пользовательских агентов, по совпадающим шаблонам regex), а не для точного сопоставления ключей.
Использование словаря дерева регулярных выражений в ClickHouse Open-Source
Словари дерева регулярных выражений определяются в ClickHouse open-source с использованием источника YAMLRegExpTree, для которого предоставляется путь к YAML-файлу, содержащему дерево регулярных выражений.
Источником словаря YAMLRegExpTree
является структура дерева regexp. Например:
Эта конфигурация состоит из списка узлов дерева регулярных выражений. Каждый узел имеет следующую структуру:
- regexp: регулярное выражение узла.
- attributes: список пользовательских атрибутов словаря. В этом примере есть два атрибута:
name
иversion
. Первый узел определяет оба атрибута. Второй узел определяет только атрибутname
. Атрибутversion
предоставляется дочерними узлами второго узла.- Значение атрибута может содержать обратные ссылки, ссылающиеся на группы захвата совпавшего регулярного выражения. В примере значение атрибута
version
в первом узле состоит из обратной ссылки\1
на группу захвата(\d+[\.\d]*)
в регулярном выражении. Номера обратных ссылок варьируются от 1 до 9 и записываются как$1
или\1
(для номера 1). Обратная ссылка заменяется соответствующей группой захвата во время выполнения запроса.
- Значение атрибута может содержать обратные ссылки, ссылающиеся на группы захвата совпавшего регулярного выражения. В примере значение атрибута
- дочерние узлы: список дочерних узлов узла дерева регулярных выражений, каждый из которых имеет свои собственные атрибуты и (возможно) дочерние узлы. Сравнение строк осуществляется в обход в глубину. Если строка соответствует узлу регулярного выражения, словарь проверяет, соответствует ли она также дочерним узлам узла. Если это так, атрибуты наиболее глубокого соответствующего узла назначаются. Атрибуты дочернего узла перезаписывают атрибуты с тем же именем родительских узлов. Имена дочерних узлов в YAML-файлах могут быть произвольными, например,
versions
в приведённом выше примере.
Словари дерева регулярных выражений допускают доступ только с использованием функций dictGet
, dictGetOrDefault
и dictGetAll
.
Пример:
Результат:
В этом случае мы сначала совпадаем с регулярным выражением \d+/tclwebkit(?:\d+[\.\d]*)
во втором узле верхнего уровня. Затем словарь продолжает искать среди дочерних узлов и находит, что строка также совпадает с 3[12]/tclwebkit
. В результате значение атрибута name
равно Android
(определено в первом уровне), а значение атрибута version
равно 12
(определено дочерним узлом).
С помощью мощного конфигурационного файла YAML мы можем использовать словари дерева регулярных выражений как парсер строк пользовательских агентов. Мы поддерживаем uap-core и демонстрируем, как использовать его в функциональном тесте 02504_regexp_dictionary_ua_parser
Сбор значений атрибутов
Иногда полезно возвращать значения из нескольких регулярных выражений, которые совпали, а не только значение листового узла. В этих случаях можно использовать специализированную функцию dictGetAll
. Если у узла есть значение атрибута типа T
, dictGetAll
вернёт Array(T)
содержащий ноль или более значений.
По умолчанию количество совпадений, возвращаемых для каждого ключа, не ограничено. Ограничение может быть передано в качестве необязательного четвёртого аргумента к dictGetAll
. Массив заполняется в топологическом порядке, что означает, что дочерние узлы идут до родительских узлов, а узлы-соседи следуют порядку в источнике.
Пример:
Результат:
Режимы совпадения
Поведение совпадения по шаблону можно изменить с помощью определённых настроек словаря:
regexp_dict_flag_case_insensitive
: Использовать нечувствительное к регистру совпадение (по умолчаниюfalse
). Может быть переопределено в отдельных выражениях с(?i)
и(?-i)
.regexp_dict_flag_dotall
: Позволить '.' соответствовать символам новой строки (по умолчаниюfalse
).
Использование словаря дерева регулярных выражений в ClickHouse Cloud
Выше использованный источник YAMLRegExpTree
работает в ClickHouse Open Source, но не в ClickHouse Cloud. Чтобы использовать словари дерева регулярных выражений в ClickHouse Cloud, сначала создайте словарь дерева регулярных выражений из YAML-файла локально в ClickHouse Open Source, затем экспортируйте этот словарь в CSV-файл, используя функцию таблицы dictionary
и оператор INTO OUTFILE.
Содержимое CSV-файла:
Схема экспортированного файла:
id UInt64
: id узла дерева RegexpTree.parent_id UInt64
: id родительского узла.regexp String
: строка регулярного выражения.keys Array(String)
: имена пользовательских атрибутов.values Array(String)
: значения пользовательских атрибутов.
Чтобы создать словарь в ClickHouse Cloud, сначала создайте таблицу regexp_dictionary_source_table
со следующей структурой:
Затем обновите локальный CSV следующим образом:
Вы можете узнать, как вставить локальные файлы для получения подробной информации. После инициализации исходной таблицы мы можем создать RegexpTree из источника таблицы:
Встраиваемые словари
Эта страница не применима к ClickHouse Cloud. Функция, описанная здесь, недоступна в сервисах ClickHouse Cloud. Смотрите руководство по совместимости с Cloud для получения дополнительной информации.
ClickHouse содержит встроенную функцию для работы с геобазой.
Это позволяет вам:
- Использовать ID региона для получения его названия на нужном языке.
- Использовать ID региона для получения ID города, области, федерального округа, страны или континента.
- Проверять, является ли регион частью другого региона.
- Получать цепочку родительских регионов.
Все функции поддерживают "транслокальность", возможность одновременно использовать различные перспективы собственности на регион. Для получения дополнительной информации смотрите раздел "Функции для работы с веб-аналитическими словарями".
Внутренние словари отключены в стандартном пакете.
Чтобы включить их, раскомментируйте параметры path_to_regions_hierarchy_file
и path_to_regions_names_files
в файле конфигурации сервера.
Геобаза загружается из текстовых файлов.
Поместите файлы regions_hierarchy*.txt
в директорию path_to_regions_hierarchy_file
. Этот параметр конфигурации должен содержать путь к файлу regions_hierarchy.txt
(стандартная региональная иерархия), а остальные файлы (regions_hierarchy_ua.txt
) должны находиться в той же директории.
Поместите файлы regions_names_*.txt
в директорию path_to_regions_names_files
.
Вы также можете создать эти файлы самостоятельно. Формат файла следующий:
regions_hierarchy*.txt
: Разделенные табуляцией (без заголовка), колонки:
- ID региона (
UInt32
) - ID родительского региона (
UInt32
) - тип региона (
UInt8
): 1 - континент, 3 - страна, 4 - федеральный округ, 5 - регион, 6 - город; другие типы не имеют значений - население (
UInt32
) — необязательная колонка
regions_names_*.txt
: Разделенные табуляцией (без заголовка), колонки:
- ID региона (
UInt32
) - название региона (
String
) — Не может содержать табуляции или символы новой строки, даже экранированные.
Для хранения в оперативной памяти используется плоский массив. По этой причине ID не должны превышать миллиона.
Словари могут обновляться без перезагрузки сервера. Однако набор доступных словарей не обновляется.
Для обновлений проверяются времена модификации файлов. Если файл был изменён, словарь обновляется.
Интервал проверки изменений настраивается в параметре builtin_dictionaries_reload_interval
.
Обновления словарей (кроме загрузки при первом использовании) не блокируют запросы. Во время обновлений запросы используют старые версии словарей. Если во время обновления возникает ошибка, сообщение об ошибке записывается в журнал сервера, и запросы продолжают использовать старую версию словарей.
Мы рекомендуем периодически обновлять словари с геобазой. Во время обновления создавайте новые файлы и сохраняйте их в отдельном месте. Когда всё будет готово, переименуйте их в файлы, используемые сервером.
Существуют также функции для работы с идентификаторами ОС и поисковыми системами, но их не следует использовать.