Типы структур словаря
Словари можно хранить в памяти разными способами, и каждый из них предполагает компромисс между использованием CPU и оперативной памяти.
| Структура | Описание |
|---|---|
| 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 | Структура префиксного дерева для быстрого поиска по IP-префиксам (на основе CIDR). |
| hierarchical | Поддержка иерархий с числовым ключом, описывающим отношения родитель-потомок. |
| polygon | Эффективный поиск вхождения Point в Polygon (обратное геокодирование). |
| regexp_tree | Сопоставляет ключи с деревом регулярных выражений. |
Укажите структуру словаря
Вы можете настроить структуру словаря с помощью конструкции LAYOUT (для DDL) или параметра layout в определениях файла конфигурации.
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- настройки структуры
...<clickhouse>
<dictionary>
...
<layout>
<layout_type>
<!-- настройки структуры -->
</layout_type>
</layout>
...
</dictionary>
</clickhouse>См. также CREATE DICTIONARY для полного синтаксиса DDL.
Словари, в структуре которых нет слова complex-key*, имеют ключ типа UInt64, а словари complex-key* — составной ключ (сложный, с произвольными типами).
Пример числового ключа (столбец key_column имеет тип UInt64):
CREATE DICTIONARY dict_name (
key_column UInt64,
...
)
PRIMARY KEY key_column<structure>
<id>
<name>key_column</name>
</id>
...
</structure>Пример составного ключа (ключ содержит один элемент типа String):
CREATE DICTIONARY dict_name (
country_code String,
...
)
PRIMARY KEY country_code<structure>
<key>
<attribute>
<name>country_code</name>
<type>String</type>
</attribute>
</key>
...
</structure>Как повысить производительность словаря
Есть несколько способов повысить производительность словаря:
- Вызывайте функцию для работы со словарём после
GROUP BY. - Помечайте извлекаемые атрибуты как инъективные.
Атрибут называется инъективным, если разным ключам соответствуют разные значения атрибута.
Поэтому, если в
GROUP BYиспользуется функция, которая получает значение атрибута по ключу, эта функция автоматически выносится изGROUP BY.
ClickHouse генерирует исключение при ошибках, связанных со словарями. Примеры таких ошибок:
- Не удалось загрузить словарь, к которому выполняется обращение.
- Ошибка при выполнении запроса к словарю
cached.
Вы можете просмотреть список словарей и их статусы в таблице system.dictionaries.