Структуры словарей
Типы размещения словарей
Существует несколько способов хранения словарей в памяти, каждый из которых имеет свои компромиссы между использованием CPU и RAM.
| Layout | Description |
|---|---|
| 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 в определениях в конфигурационном файле.
- DDL
- Configuration file
См. также CREATE DICTIONARY для полного синтаксиса DDL.
Словари, в имени макета которых нет слова complex-key*, имеют ключ типа UInt64, а словари с complex-key* имеют составной ключ (сложный, с произвольными типами).
Пример числового ключа (столбец key_column имеет тип UInt64):
- DDL
- Configuration file
Пример составного ключа (ключ состоит из одного элемента типа String):
- DDL
- Configuration file
Повышение производительности словарей
Существует несколько способов повысить производительность словарей:
- Вызывать функцию работы со словарём после
GROUP BY. - Пометить атрибуты для извлечения как инъективные.
Атрибут называется инъективным, если разным ключам соответствуют различные значения атрибута.
Поэтому, когда в
GROUP BYиспользуется функция, которая по ключу извлекает значение атрибута, эта функция автоматически выносится изGROUP BY.
ClickHouse генерирует исключение при ошибках, связанных со словарями. Примеры таких ошибок:
- Не удалось загрузить словарь, к которому выполняется обращение.
- Ошибка при запросе к словарю типа
cached.
Вы можете просмотреть список словарей и их статусы в таблице system.dictionaries.