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

структура словаря cache

Тип размещения словаря 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.

Для кэшированных словарей может быть задан срок действия lifetime данных в кэше. Если с момента загрузки данных в ячейку прошло больше времени, чем lifetime, значение ячейки не используется, и ключ считается просроченным. Ключ запрашивается повторно при следующем обращении. Это поведение можно настроить с помощью параметра allow_read_expired_keys.

Это наименее эффективный из всех способов хранения словарей. Скорость работы кэша сильно зависит от корректных настроек и сценария использования. Словарь типа cache показывает хорошие результаты только при достаточно высоком уровне попаданий в кэш (рекомендуется 99% и выше). Вы можете просмотреть среднее значение hit rate в таблице system.dictionaries.

Если настройка allow_read_expired_keys установлена в 1 (по умолчанию 0), словарь может поддерживать асинхронные обновления. Если клиент запрашивает ключи, и все они находятся в кэше, но некоторые из них просрочены, словарь вернет клиенту просроченные ключи и асинхронно запросит их из источника.

Чтобы улучшить производительность кэша, используйте подзапрос с LIMIT и выносите вызов функции со словарем во внешний запрос.

Поддерживаются все типы источников.

Пример настроек:

LAYOUT(CACHE(SIZE_IN_CELLS 1000000000))

Задайте достаточно большой размер кэша. Для выбора количества ячеек необходимо провести эксперименты:

  1. Установите некоторое значение.
  2. Запускайте запросы, пока кэш полностью не заполнится.
  3. Оцените потребление памяти с помощью таблицы system.dictionaries.
  4. Увеличивайте или уменьшайте количество ячеек, пока не будет достигнут требуемый объем потребляемой памяти.
Примечание

Не рекомендуется использовать ClickHouse в качестве источника для этого типа размещения. Поиск в словаре требует случайных точечных чтений, что не соответствует шаблону доступа, под который ClickHouse оптимизирован.