2020-10-26 10:29:30 +00:00
---
2022-08-26 17:37:11 +00:00
slug: /ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout
2022-04-09 13:29:05 +00:00
sidebar_position: 41
sidebar_label: "Хранение словарей в памяти"
2020-10-26 10:29:30 +00:00
---
2020-03-20 18:20:59 +00:00
# Хранение словарей в памяти {#dicts-external-dicts-dict-layout}
2017-10-25 05:27:09 +00:00
2018-12-12 17:28:00 +00:00
Словари можно размещать в памяти множеством способов.
2017-10-25 05:27:09 +00:00
2020-10-13 17:23:29 +00:00
Рекомендуем [flat ](#flat ), [hashed ](#dicts-external_dicts_dict_layout-hashed ) и [complex_key_hashed ](#complex-key-hashed ). Скорость обработки словарей при этом максимальна.
2017-10-25 05:27:09 +00:00
2021-04-21 16:25:04 +00:00
Размещение с кэшированием не рекомендуется использовать из-за потенциально низкой производительности и сложностей в подборе оптимальных параметров. Читайте о б этом подробнее в разделе [cache ](#cache ).
2017-10-25 05:27:09 +00:00
2019-08-23 10:55:34 +00:00
Повысить производительность словарей можно следующими способами:
2017-10-25 05:27:09 +00:00
2020-04-30 18:19:18 +00:00
- Вызывать функцию для работы с о словарём после `GROUP BY` .
- Помечать извлекаемые атрибуты как инъективные. Атрибут называется инъективным, если разным ключам соответствуют разные значения атрибута. Тогда при использовании в `GROUP BY` функции, достающей значение атрибута по ключу, эта функция автоматически выносится из `GROUP BY` .
2017-10-25 05:27:09 +00:00
При ошибках работы с о словарями ClickHouse генерирует исключения. Например, в следующих ситуациях:
2020-04-30 18:19:18 +00:00
- При обращении к словарю, который не удалось загрузить.
- При ошибке запроса к `cached` -словарю.
2017-10-25 05:27:09 +00:00
2022-05-28 19:59:55 +00:00
Список внешних словарей и их статус можно посмотреть в таблице [system.dictionaries ](../../../operations/system-tables/dictionaries.md ).
2017-10-25 05:27:09 +00:00
Общий вид конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2021-10-26 05:50:15 +00:00
< clickhouse >
2017-10-25 05:27:09 +00:00
< dictionary >
...
< layout >
2018-03-10 23:36:26 +00:00
< layout_type >
2017-10-25 05:27:09 +00:00
<!-- layout settings -->
< / layout_type >
< / layout >
...
< / dictionary >
2021-10-26 05:50:15 +00:00
< / clickhouse >
2017-10-25 05:27:09 +00:00
```
2020-08-06 17:05:43 +00:00
Соответствущий [DDL-запрос ](../../statements/create/dictionary.md#create-dictionary-query ):
2020-02-20 06:31:06 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- layout settings
...
```
2022-05-28 20:14:36 +00:00
Ключ словарей не имеющих слово `complex-key*` в названии имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ), `complex-key*` словари позволяют произвольный тип ключа (составной, и из разных типов).
2022-05-28 19:59:55 +00:00
2022-05-28 20:07:39 +00:00
[UInt64 ](../../../sql-reference/data-types/int-uint.md ) ключи в XML словарях задаются тегом `<id>` .
2022-05-28 20:14:36 +00:00
Пример конфигурации (поле key_column имеет тип UInt64):
2022-05-28 19:59:55 +00:00
```xml
...
< structure >
< id >
< name > key_column< / name >
< / id >
...
```
2022-05-28 20:14:36 +00:00
Cо с та вные `complex` ключи в XML словарях задаются тегом `<key>` .
2022-05-28 20:07:39 +00:00
2022-05-28 20:14:36 +00:00
Пример конфигурации составного ключа (ключ состоит из одного элемента с типом [String ](../../../sql-reference/data-types/string.md )):
2022-05-28 20:02:27 +00:00
```xml
2022-05-28 19:59:55 +00:00
...
< structure >
< key >
< attribute >
< name > country_code< / name >
< type > String< / type >
< / attribute >
< / key >
...
```
2021-04-21 16:25:04 +00:00
## Способы размещения словарей в памяти {#ways-to-store-dictionaries-in-memory}
2017-10-25 05:27:09 +00:00
2020-03-21 04:11:51 +00:00
- [flat ](#flat )
2020-06-05 19:22:38 +00:00
- [hashed ](#dicts-external_dicts_dict_layout-hashed )
2020-10-13 17:23:29 +00:00
- [sparse_hashed ](#dicts-external_dicts_dict_layout-sparse_hashed )
- [complex_key_hashed ](#complex-key-hashed )
2021-10-22 16:36:29 +00:00
- [complex_key_sparse_hashed ](#complex-key-sparse-hashed )
- [hashed_array ](#dicts-external_dicts_dict_layout-hashed-array )
- [complex_key_hashed_array ](#complex-key-hashed-array )
- [range_hashed ](#range-hashed )
2021-08-26 19:36:24 +00:00
- [complex_key_range_hashed ](#complex-key-range-hashed )
2021-10-22 16:36:29 +00:00
- [cache ](#cache )
2020-10-13 17:23:29 +00:00
- [complex_key_cache ](#complex-key-cache )
2021-10-22 16:36:29 +00:00
- [ssd_cache ](#ssd-cache )
- [complex_key_ssd_cache ](#complex-key-ssd-cache )
- [direct ](#direct )
2020-10-13 17:23:29 +00:00
- [complex_key_direct ](#complex-key-direct )
- [ip_trie ](#ip-trie )
2017-10-25 05:27:09 +00:00
2020-03-20 18:20:59 +00:00
### flat {#flat}
2017-10-25 05:27:09 +00:00
2021-04-23 05:11:26 +00:00
Словарь полностью хранится в оперативной памяти в виде плоских массивов. Объём памяти, занимаемой словарём, пропорционален размеру самого большого ключа (по объему).
2017-10-25 05:27:09 +00:00
2021-04-23 08:57:10 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ) и е г о величина ограничена параметром `max_array_size` (значение по умолчанию — 500 000). Если при создании словаря обнаружен ключ больше, то ClickHouse бросает исключение и не создает словарь. Начальный размер плоских массивов словарей контролируется параметром initial_array_size (по умолчанию - 1024).
2017-10-25 05:27:09 +00:00
2021-04-21 16:25:04 +00:00
Поддерживаются все виды источников. При обновлении данные (из файла или из таблицы) считываются целиком.
2017-10-25 05:27:09 +00:00
Это метод обеспечивает максимальную производительность среди всех доступных способов размещения словаря.
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< layout >
2021-04-21 16:25:04 +00:00
< flat >
< initial_array_size > 50000< / initial_array_size >
< max_array_size > 5000000< / max_array_size >
< / flat >
2017-10-25 05:27:09 +00:00
< / layout >
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2021-04-21 16:25:04 +00:00
LAYOUT(FLAT(INITIAL_ARRAY_SIZE 50000 MAX_ARRAY_SIZE 5000000))
2020-02-20 06:31:06 +00:00
```
2020-06-05 19:22:38 +00:00
### hashed {#dicts-external_dicts_dict_layout-hashed}
2017-10-25 05:27:09 +00:00
2021-04-23 05:11:26 +00:00
Словарь полностью хранится в оперативной памяти в виде хэш-таблиц. Словарь может содержать произвольное количество элементов с произвольными идентификаторами. Н а практике количество ключей может достигать десятков миллионов элементов.
2017-10-25 05:27:09 +00:00
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2021-05-14 06:12:25 +00:00
Если `preallocate` имеет значение `true` (по умолчанию `false` ), хеш-таблица будет предварительно определена (это ускорит загрузку словаря). Используйте этот метод только в случае, если:
2021-05-13 17:05:58 +00:00
- Источник поддерживает произвольное количество элементов (пока поддерживается только источником `ClickHouse` ).
2021-05-14 06:12:31 +00:00
- В данных нет дубликатов (иначе это может увеличить объем используемой памяти хеш-таблицы).
2021-05-13 17:05:58 +00:00
2021-04-23 05:11:26 +00:00
Поддерживаются все виды источников. При обновлении данные (из файла, из таблицы) читаются целиком.
2017-10-25 05:27:09 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< layout >
2021-05-13 17:05:58 +00:00
< hashed >
< preallocate > 0< / preallocate >
< / hashed >
2017-10-25 05:27:09 +00:00
< / layout >
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2021-05-13 17:05:58 +00:00
LAYOUT(HASHED(PREALLOCATE 0))
2020-02-20 06:31:06 +00:00
```
2020-10-13 17:23:29 +00:00
### sparse_hashed {#dicts-external_dicts_dict_layout-sparse_hashed}
2020-02-20 06:31:06 +00:00
Аналогичен `hashed` , но при этом занимает меньше места в памяти и генерирует более высокую загрузку CPU.
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2021-05-24 21:33:56 +00:00
Для этого типа размещения также можно задать `preallocate` в значении `true` . В данном случае это более важно, чем для типа `hashed` .
2021-05-13 17:05:58 +00:00
2020-02-20 06:31:06 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2020-02-20 06:31:06 +00:00
< layout >
< sparse_hashed / >
< / layout >
```
или
2020-03-20 18:20:59 +00:00
``` sql
2021-05-13 17:05:58 +00:00
LAYOUT(SPARSE_HASHED([PREALLOCATE 0]))
2020-02-20 06:31:06 +00:00
```
2017-10-25 05:27:09 +00:00
2020-10-13 17:23:29 +00:00
### complex_key_hashed {#complex-key-hashed}
2017-10-25 05:27:09 +00:00
2021-10-19 18:51:46 +00:00
Тип размещения предназначен для использования с составными [ключами ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md ). Аналогичен `hashed` .
2017-10-25 05:27:09 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< layout >
< complex_key_hashed / >
< / layout >
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
LAYOUT(COMPLEX_KEY_HASHED())
```
2021-10-19 18:51:46 +00:00
### complex_key_sparse_hashed {#complex-key-sparse-hashed}
Тип размещения предназначен для использования с составными [ключами ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md ). Аналогичен [sparse_hashed ](#dicts-external_dicts_dict_layout-sparse_hashed ).
Пример конфигурации:
``` xml
< layout >
< complex_key_sparse_hashed / >
< / layout >
```
или
``` sql
LAYOUT(COMPLEX_KEY_SPARSE_HASHED())
```
### hashed_array {#dicts-external_dicts_dict_layout-hashed-array}
2021-10-22 16:06:53 +00:00
Словарь полностью хранится в оперативной памяти. Каждый атрибут хранится в массиве. Ключевой атрибут хранится в виде хеш-таблицы, где е г о значение является индексом в массиве атрибутов. Словарь может содержать произвольное количество элементов с произвольными идентификаторами. Н а практике количество ключей может достигать десятков миллионов элементов.
2021-10-19 18:51:46 +00:00
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2021-10-22 16:07:01 +00:00
Поддерживаются все виды источников. При обновлении данные (из файла, из таблицы) считываются целиком.
2021-10-19 18:51:46 +00:00
Пример конфигурации:
``` xml
< layout >
< hashed_array >
< / hashed_array >
< / layout >
```
или
``` sql
LAYOUT(HASHED_ARRAY())
```
### complex_key_hashed_array {#complex-key-hashed-array}
Тип размещения предназначен для использования с составными [ключами ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md ). Аналогичен [hashed_array ](#dicts-external_dicts_dict_layout-hashed-array ).
Пример конфигурации:
``` xml
< layout >
< complex_key_hashed_array / >
< / layout >
```
или
``` sql
LAYOUT(COMPLEX_KEY_HASHED_ARRAY())
```
2020-10-13 17:23:29 +00:00
### range_hashed {#range-hashed}
2017-10-25 05:27:09 +00:00
Словарь хранится в оперативной памяти в виде хэш-таблицы с упорядоченным массивом диапазонов и соответствующих им значений.
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2019-08-26 01:34:16 +00:00
Этот способ размещения работает также как и hashed и позволяет дополнительно к ключу использовать дипазоны по дате/времени (произвольному числовому типу).
2017-10-25 05:27:09 +00:00
Пример: таблица содержит скидки для каждого рекламодателя в виде:
2020-03-20 18:20:59 +00:00
``` text
2018-03-25 02:04:22 +00:00
+---------------+---------------------+-------------------+--------+
| advertiser id | discount start date | discount end date | amount |
+===============+=====================+===================+========+
| 123 | 2015-01-01 | 2015-01-15 | 0.15 |
+---------------+---------------------+-------------------+--------+
| 123 | 2015-01-16 | 2015-01-31 | 0.25 |
+---------------+---------------------+-------------------+--------+
| 456 | 2015-01-01 | 2015-01-15 | 0.05 |
+---------------+---------------------+-------------------+--------+
2017-10-25 05:27:09 +00:00
```
2020-04-30 18:19:18 +00:00
Чтобы использовать выборку по диапазонам дат, необходимо в [structure ](external-dicts-dict-structure.md ) определить элементы `range_min` , `range_max` . В этих элементах должны присутствовать элементы `name` и `type` (если `type` не указан, будет использован тип по умолчанию – Date). `type` может быть любым численным типом (Date/DateTime/UInt64/Int32/др.).
2017-10-25 05:27:09 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< structure >
< id >
< name > Id< / name >
< / id >
< range_min >
< name > first< / name >
2019-08-26 01:34:16 +00:00
< type > Date< / type >
2017-10-25 05:27:09 +00:00
< / range_min >
< range_max >
< name > last< / name >
2020-03-20 18:20:59 +00:00
< type > Date< / type >
2017-10-25 05:27:09 +00:00
< / range_max >
...
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY somedict (
id UInt64,
first Date,
last Date
)
PRIMARY KEY id
LAYOUT(RANGE_HASHED())
RANGE(MIN first MAX last)
```
2019-08-26 01:34:16 +00:00
Для работы с такими словарями в функцию `dictGetT` необходимо передавать дополнительный аргумент, для которого подбирается диапазон:
2017-10-25 05:27:09 +00:00
2020-03-21 04:11:51 +00:00
dictGetT('dict_name', 'attr_name', id, date)
2017-10-25 05:27:09 +00:00
Функция возвращает значение для заданных `id` и диапазона дат, в который входит переданная дата.
Особенности алгоритма:
2020-04-30 18:19:18 +00:00
- Если не найден `id` или для найденного `id` не найден диапазон, то возвращается значение по умолчанию для словаря.
2021-02-09 18:49:45 +00:00
- Если есть перекрывающиеся диапазоны, то возвращается значение из любого (случайного) подходящего диапазона.
- Если граница диапазона `NULL` или некорректная дата (1900-01-01), то диапазон считается открытым. Диапазон может быть открытым с обеих сторон.
2017-10-25 05:27:09 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2021-10-26 05:50:15 +00:00
< clickhouse >
2017-10-25 05:27:09 +00:00
< dictionary >
...
< layout >
< range_hashed / >
< / layout >
< structure >
< id >
< name > Abcdef< / name >
< / id >
< range_min >
2019-08-26 01:34:16 +00:00
< name > StartTimeStamp< / name >
2020-03-20 18:20:59 +00:00
< type > UInt64< / type >
2017-10-25 05:27:09 +00:00
< / range_min >
< range_max >
2019-08-26 01:34:16 +00:00
< name > EndTimeStamp< / name >
< type > UInt64< / type >
2017-10-25 05:27:09 +00:00
< / range_max >
< attribute >
< name > XXXType< / name >
< type > String< / type >
< null_value / >
< / attribute >
< / structure >
< / dictionary >
2021-10-26 05:50:15 +00:00
< / clickhouse >
2017-10-25 05:27:09 +00:00
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY somedict(
Abcdef UInt64,
StartTimeStamp UInt64,
EndTimeStamp UInt64,
XXXType String DEFAULT ''
)
PRIMARY KEY Abcdef
RANGE(MIN StartTimeStamp MAX EndTimeStamp)
```
2017-10-25 05:27:09 +00:00
2021-08-26 19:36:24 +00:00
### complex_key_range_hashed {#complex-key-range-hashed}
2021-08-27 18:07:59 +00:00
Словарь хранится в оперативной памяти в виде хэш-таблицы с упорядоченным массивом диапазонов и соответствующих им значений (см. [range_hashed ](#range-hashed )). Данный тип размещения предназначен для использования с составными [ключами ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md ).
2021-08-26 19:36:24 +00:00
Пример конфигурации:
``` sql
CREATE DICTIONARY range_dictionary
(
CountryID UInt64,
CountryKey String,
StartDate Date,
EndDate Date,
Tax Float64 DEFAULT 0.2
)
PRIMARY KEY CountryID, CountryKey
SOURCE(CLICKHOUSE(TABLE 'date_table'))
LIFETIME(MIN 1 MAX 1000)
LAYOUT(COMPLEX_KEY_RANGE_HASHED())
RANGE(MIN StartDate MAX EndDate);
```
2020-03-20 18:20:59 +00:00
### cache {#cache}
2017-10-25 05:27:09 +00:00
Словарь хранится в кэше, состоящем из фиксированного количества ячеек. Ячейки содержат часто используемые элементы.
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2017-10-25 05:27:09 +00:00
При поиске в словаре сначала просматривается кэш. Н а каждый блок данных, все не найденные в кэше или устаревшие ключи запрашиваются у источника с помощью `SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)` . Затем, полученные данные записываются в кэш.
2021-09-10 00:26:10 +00:00
Если ключи не были найдены в словаре, то для обновления кэша создается задание и добавляется в очередь обновлений. Параметры очереди обновлений можно устанавливать настройками `max_update_queue_size` , `update_queue_push_timeout_milliseconds` , `query_wait_timeout_milliseconds` , `max_threads_for_updates`
2017-10-25 05:27:09 +00:00
2021-09-15 11:28:27 +00:00
Для cache-словарей при помощи настройки `allow_read_expired_keys` может быть задано время устаревания [lifetime ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime.md ) данных в кэше. Если с момента загрузки данных в ячейку прошло больше времени, чем `lifetime` , то значение не используется, а ключ устаревает. Ключ будет запрошен заново при следующей необходимости е г о использовать.
2021-09-07 17:07:27 +00:00
2021-09-10 00:26:10 +00:00
Это наименее эффективный из всех способов размещения словарей. Скорость работы кэша очень сильно зависит от правильности настройки и сценария использования. Словарь типа `cache` показывает высокую производительность лишь при достаточно большой частоте успешных обращений (рекомендуется 99% и выше). Посмотреть среднюю частоту успешных обращений (`hit rate`) можно в таблице [system.dictionaries ](../../../operations/system-tables/dictionaries.md ).
2021-09-07 17:07:27 +00:00
2021-09-10 00:26:10 +00:00
Если параметр `allow_read_expired_keys` выставлен в 1 (0 по умолчанию), то словарь поддерживает асинхронные обновления. Если клиент запрашивает ключи, которые находятся в кэше, но при этом некоторые из них устарели, то словарь вернет устаревшие ключи клиенту и запросит их асинхронно у источника.
2017-10-25 05:27:09 +00:00
Чтобы увеличить производительность кэша, используйте подзапрос с `LIMIT` , а снаружи вызывайте функцию с о словарём.
2022-08-29 18:20:46 +00:00
Поддерживаются все виды источников.
2017-10-25 05:27:09 +00:00
Пример настройки:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< layout >
< cache >
<!-- Размер кэша в количестве ячеек. Округляется вверх до степени двух. -->
< size_in_cells > 1000000000< / size_in_cells >
2021-09-07 17:07:27 +00:00
<!-- Позволить читать устаревшие ключи. -->
< allow_read_expired_keys > 0< / allow_read_expired_keys >
<!-- Максимальный размер очереди обновлений. -->
< max_update_queue_size > 100000< / max_update_queue_size >
<!-- Максимальное время (в миллисекундах) для отправки в очередь. -->
< update_queue_push_timeout_milliseconds > 10< / update_queue_push_timeout_milliseconds >
<!-- Максимальное время ожидания (в миллисекундах) для выполнения обновлений. -->
< query_wait_timeout_milliseconds > 60000< / query_wait_timeout_milliseconds >
<!-- Максимальное число потоков для обновления кэша словаря. -->
< max_threads_for_updates > 4< / max_threads_for_updates >
2017-10-25 05:27:09 +00:00
< / cache >
< / layout >
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
LAYOUT(CACHE(SIZE_IN_CELLS 1000000000))
```
2017-10-25 05:27:09 +00:00
Укажите достаточно большой размер кэша. Количество ячеек следует подобрать экспериментальным путём:
2020-03-20 18:20:59 +00:00
1. Выставить некоторое значение.
2. Запросами добиться полной заполненности кэша.
3. Оценить потребление оперативной памяти с помощью таблицы `system.dictionaries` .
4. Увеличивать/уменьшать количество ячеек до получения требуемого расхода оперативной памяти.
2017-10-25 05:27:09 +00:00
2022-04-09 13:29:05 +00:00
:::danger "Warning"
2018-07-20 17:35:34 +00:00
Н е используйте в качестве источника ClickHouse, поскольку он медленно обрабатывает запросы с о случайным чтением.
2022-08-21 17:01:17 +00:00
:::
2017-10-25 05:27:09 +00:00
2020-10-13 17:23:29 +00:00
### complex_key_cache {#complex-key-cache}
2017-10-25 05:27:09 +00:00
2020-04-30 18:19:18 +00:00
Тип размещения предназначен для использования с составными [ключами ](external-dicts-dict-structure.md ). Аналогичен `cache` .
2018-03-14 09:08:37 +00:00
2020-11-04 00:55:54 +00:00
### ssd_cache {#ssd-cache}
2021-09-10 00:26:10 +00:00
Похож на `cache` , но хранит данные на SSD, а индекс в оперативной памяти. В с е параметры, относящиеся к очереди обновлений, могут также быть применены к SSD-кэш словарям.
2020-11-04 00:55:54 +00:00
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2020-11-04 00:55:54 +00:00
``` xml
< layout >
< ssd_cache >
<!-- Size of elementary read block in bytes. Recommended to be equal to SSD's page size. -->
< block_size > 4096< / block_size >
<!-- Max cache file size in bytes. -->
< file_size > 16777216< / file_size >
<!-- Size of RAM buffer in bytes for reading elements from SSD. -->
< read_buffer_size > 131072< / read_buffer_size >
<!-- Size of RAM buffer in bytes for aggregating elements before flushing to SSD. -->
< write_buffer_size > 1048576< / write_buffer_size >
<!-- Path where cache file will be stored. -->
2021-10-17 19:28:22 +00:00
< path > /var/lib/clickhouse/user_files/test_dict< / path >
2020-11-04 00:55:54 +00:00
< / ssd_cache >
< / layout >
```
или
``` sql
2021-03-18 09:55:17 +00:00
LAYOUT(SSD_CACHE(BLOCK_SIZE 4096 FILE_SIZE 16777216 READ_BUFFER_SIZE 1048576
2021-10-17 19:28:22 +00:00
PATH '/var/lib/clickhouse/user_files/test_dict'))
2020-11-04 00:55:54 +00:00
```
### complex_key_ssd_cache {#complex-key-ssd-cache}
Тип размещения предназначен для использования с составными [ключами ](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure.md ). Похож на `ssd_cache` .
2020-05-03 12:55:22 +00:00
### direct {#direct}
Словарь не хранит данные локально и взаимодействует с источником непосредственно в момент запроса.
2022-05-28 19:59:55 +00:00
Ключ словаря имеет тип [UInt64 ](../../../sql-reference/data-types/int-uint.md ).
2020-05-03 12:55:22 +00:00
2020-05-07 20:00:30 +00:00
Поддерживаются все виды [источников ](external-dicts-dict-sources.md ), кроме локальных файлов.
2020-05-03 12:55:22 +00:00
Пример конфигурации:
``` xml
< layout >
< direct / >
< / layout >
```
или
``` sql
LAYOUT(DIRECT())
```
2020-10-13 17:23:29 +00:00
### complex_key_direct {#complex-key-direct}
2020-05-13 16:05:05 +00:00
Тип размещения предназначен для использования с составными [ключами ](external-dicts-dict-structure.md ). Аналогичен `direct` .
2020-10-13 17:23:29 +00:00
### ip_trie {#ip-trie}
2018-03-14 09:08:37 +00:00
Тип размещения предназначен для сопоставления префиксов сети (IP адресов) с метаданными, такими как ASN.
Пример: таблица содержит префиксы сети и соответствующие им номера AS и коды стран:
2020-03-20 18:20:59 +00:00
``` text
2018-03-14 09:08:37 +00:00
+-----------------+-------+--------+
| prefix | asn | cca2 |
+=================+=======+========+
| 202.79.32.0/20 | 17501 | NP |
+-----------------+-------+--------+
| 2620:0:870::/48 | 3856 | US |
+-----------------+-------+--------+
| 2a02:6b8:1::/48 | 13238 | RU |
+-----------------+-------+--------+
| 2001:db8::/32 | 65536 | ZZ |
+-----------------+-------+--------+
```
При использовании такого макета структура должна иметь составной ключ.
Пример:
2020-03-20 18:20:59 +00:00
``` xml
2018-03-14 09:08:37 +00:00
< structure >
< key >
< attribute >
< name > prefix< / name >
< type > String< / type >
< / attribute >
< / key >
< attribute >
< name > asn< / name >
< type > UInt32< / type >
< null_value / >
< / attribute >
< attribute >
< name > cca2< / name >
< type > String< / type >
< null_value > ??< / null_value >
< / attribute >
...
2020-12-24 15:46:45 +00:00
< / structure >
< layout >
< ip_trie >
<!-- Ключевой аттрибут `prefix` будет доступен через dictGetString -->
<!-- Эта опция увеличивает потреблямую память -->
< access_to_key_from_attributes > true< / access_to_key_from_attributes >
< / ip_trie >
< / layout >
2018-03-14 09:08:37 +00:00
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY somedict (
prefix String,
asn UInt32,
cca2 String DEFAULT '??'
)
PRIMARY KEY prefix
```
2018-04-23 06:20:21 +00:00
Этот ключ должен иметь только один атрибут типа `String` , содержащий допустимый префикс IP. Другие типы еще не поддерживаются.
2018-03-14 09:08:37 +00:00
Для запросов необходимо использовать те же функции (`dictGetT` с кортежем), что и для словарей с составными ключами:
2020-03-20 18:20:59 +00:00
``` sql
2018-04-23 06:20:21 +00:00
dictGetT('dict_name', 'attr_name', tuple(ip))
```
2018-03-14 09:08:37 +00:00
2018-04-23 06:20:21 +00:00
Функция принимает либо `UInt32` для IPv4, либо `FixedString(16)` для IPv6:
2018-03-14 09:08:37 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2018-04-23 06:20:21 +00:00
dictGetString('prefix', 'asn', tuple(IPv6StringToNum('2001:db8::1')))
```
2018-03-14 09:08:37 +00:00
Никакие другие типы не поддерживаются. Функция возвращает атрибут для префикса, соответствующего данному IP-адресу. Если есть перекрывающиеся префиксы, возвращается наиболее специфический.
2020-12-24 15:46:45 +00:00
Данные должны полностью помещаться в оперативной памяти.