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

Структуры словарей

Типы размещения словарей

Существует несколько способов хранения словарей в памяти, каждый из которых имеет свои компромиссы между использованием CPU и RAM.

LayoutDescription
flatХранит данные в плоских массивах, индексируемых по ключу. Самый быстрый вариант размещения, но ключи должны быть типа UInt64 и ограничены max_array_size.
hashedХранит данные в хеш-таблице. Нет ограничения на размер ключа, поддерживает любое количество элементов.
sparse_hashedКак hashed, но расходует больше CPU в обмен на меньшее потребление памяти.
complex_key_hashedКак hashed, но для составных ключей.
complex_key_sparse_hashedКак sparse_hashed, но для составных ключей.
hashed_arrayАтрибуты хранятся в массивах с хеш-таблицей, сопоставляющей ключи с индексами массивов. Эффективно по памяти при большом количестве атрибутов.
complex_key_hashed_arrayКак hashed_array, но для составных ключей.
range_hashedХеш-таблица с упорядоченными диапазонами. Поддерживает поиск по ключу и диапазону даты/времени.
complex_key_range_hashedКак range_hashed, но для составных ключей.
cacheКэш фиксированного размера в памяти. Хранятся только часто запрашиваемые ключи.
complex_key_cacheКак cache, но для составных ключей.
ssd_cacheКак cache, но хранит данные на SSD с индексом в памяти.
complex_key_ssd_cacheКак ssd_cache, но для составных ключей.
directНет хранения в памяти — источник запрашивается напрямую для каждого обращения.
complex_key_directКак direct, но для составных ключей.
ip_trieПрефиксное дерево (trie) для быстрого поиска IP-префиксов (на основе CIDR).
Рекомендуемые варианты размещения

flat, hashed и complex_key_hashed обеспечивают наилучшую производительность запросов. Варианты размещения с кэшированием не рекомендуются из-за потенциально низкой производительности и сложности настройки параметров — подробности см. в разделе cache.

Указание макета словаря

Совет

Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default. Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.

Вы можете настроить макет словаря с помощью секции LAYOUT (для DDL) или параметра layout в определениях в конфигурационном файле.

CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- параметры макета
...

См. также CREATE DICTIONARY для полного синтаксиса DDL.

Словари, в имени макета которых нет слова complex-key*, имеют ключ типа UInt64, а словари с complex-key* имеют составной ключ (сложный, с произвольными типами).

Пример числового ключа (столбец key_column имеет тип UInt64):

CREATE DICTIONARY dict_name (
    key_column UInt64,
    ...
)
PRIMARY KEY key_column

Пример составного ключа (ключ состоит из одного элемента типа String):

CREATE DICTIONARY dict_name (
    country_code String,
    ...
)
PRIMARY KEY country_code

Повышение производительности словарей

Существует несколько способов повысить производительность словарей:

  • Вызывать функцию работы со словарём после GROUP BY.
  • Пометить атрибуты для извлечения как инъективные. Атрибут называется инъективным, если разным ключам соответствуют различные значения атрибута. Поэтому, когда в GROUP BY используется функция, которая по ключу извлекает значение атрибута, эта функция автоматически выносится из GROUP BY.

ClickHouse генерирует исключение при ошибках, связанных со словарями. Примеры таких ошибок:

  • Не удалось загрузить словарь, к которому выполняется обращение.
  • Ошибка при запросе к словарю типа cached.

Вы можете просмотреть список словарей и их статусы в таблице system.dictionaries.