cached хранит словарь в кэше с фиксированным количеством ячеек.
Эти ячейки содержат часто используемые элементы.
Ключ словаря имеет тип 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.
Для словарей cache можно задать срок действия данных в кэше — lifetime. Если с момента загрузки данных в ячейку прошло больше времени, чем lifetime, значение ячейки не используется, и ключ считается устаревшим. При следующем обращении этот ключ будет запрошен повторно. Это поведение можно настроить с помощью параметра allow_read_expired_keys.
Это наименее эффективный из всех способов хранения словарей. Производительность кэша сильно зависит от правильности настроек и сценария использования. Словарь типа cache показывает хорошую производительность только при достаточно высокой доле попаданий в кэш (рекомендуется 99% и выше). Среднюю долю попаданий можно посмотреть в таблице system.dictionaries.
Если параметр allow_read_expired_keys установлен в 1 (по умолчанию — 0), словарь может поддерживать асинхронные обновления. Если клиент запрашивает ключи и все они есть в кэше, но некоторые из них устарели, словарь вернет клиенту устаревшие ключи и асинхронно запросит их из источника.
Чтобы повысить производительность кэша, используйте подзапрос с LIMIT и вызывайте функцию вне словаря.
Поддерживаются все типы источников.
Пример настроек:
- DDL
- Файл конфигурации
Задайте достаточно большой размер кэша. Чтобы подобрать количество ячеек, нужно поэкспериментировать:
- Задайте некоторое значение.
- Выполняйте запросы, пока кэш полностью не заполнится.
- Оцените потребление памяти с помощью таблицы
system.dictionaries. - Увеличивайте или уменьшайте количество ячеек, пока не будет достигнут требуемый уровень потребления памяти.
Не рекомендуется использовать ClickHouse в качестве источника для этой структуры. Поиск по словарю требует случайных точечных чтений, а ClickHouse не оптимизирован под такой шаблон доступа.