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

Condition Cache ускоряет повторяющиеся запросы с фильтрацией

Condition Cache — это механизм ускорения запросов в Apache Doris, предназначенный для запросов с повторяющимися условиями. Он кэширует результат применения определённого условия фильтрации к конкретному Segment в виде сжатого битового вектора. Когда последующий запрос находит результат в кэше, этот результат можно использовать напрямую, избегая повторного сканирования и фильтрации. Это снижает нагрузку на CPU и IO и сокращает время отклика на запрос.

В задачах крупномасштабной аналитики запросы часто содержат повторяющиеся условия фильтрации, например:

SELECT * FROM orders WHERE region = 'ASIA';
SELECT count(*) FROM orders WHERE region = 'ASIA';

Такие запросы многократно выполняют одну и ту же логику фильтрации на одних и тех же фрагментах данных (Segments), создавая избыточную нагрузку на CPU и IO. Condition Cache повторно использует результаты фильтрации, чтобы сократить ненужное сканирование и фильтрацию, существенно уменьшая время отклика на запрос.

Принцип работы​

Основная идея Condition Cache: одно и то же условие фильтрации на одном и том же фрагменте данных даёт одинаковый результат.

  1. Doris формирует 64-битный хеш из «выражения фильтрации + Key Range» и использует его как уникальный идентификатор записи кэша.
  2. Каждый Segment может использовать этот хеш для поиска существующего результата фильтрации в кэше.
  3. Кэшированный результат хранится в виде сжатого битового вектора (std::vector<bool>).

Значения битов интерпретируются следующим образом:

Значение битаЗначение
0Диапазон строк не соответствует условию, и его можно пропустить
1Диапазон может содержать строки, соответствующие условию, и требует дальнейшего сканирования

Так Doris может быстро отбрасывать неподходящие данные крупными блоками и выполнять точную фильтрацию только при необходимости.

Сценарии применения​

Condition Cache наиболее эффективен в следующих сценариях:

СценарийОписание
Повторяющиеся условияОдни и те же или похожие условия фильтрации используются часто
Относительно стабильные данныеДанные внутри Segment обычно неизменяемы (INSERT/Compaction создаёт новые Segments, а старые записи кэша вытесняются автоматически)
Высокая селективностьПосле фильтрации по условию остаётся лишь небольшое количество строк, что позволяет максимально сократить сканирование

Сценарии, в которых Condition Cache не применяется​

Condition Cache не действует в следующих сценариях:

  • Запрос содержит условие Delete (маркеры удаления должны обеспечивать корректность, поэтому кэш отключается).
  • Во время выполнения создаётся TopN Runtime Filter (пока не поддерживается).

Настройка и управление​

Включение и отключение​

  • Назначение: включить Condition Cache на уровне сеанса.

  • Команда:

    set enable_condition_cache = true;
  • Описание: этот параметр определяет, использует ли текущий сеанс Condition Cache.

Управление памятью​

Использование памяти в Condition Cache подчиняется следующим правилам:

ПараметрОписание
Политика вытесненияLRU (Least Recently Used): при превышении лимита ёмкости автоматически вытесняются записи, которые не использовались дольше всего
Параметр ёмкостиcondition_cache_limit, в MB, по умолчанию 1024
Файл конфигурацииbe.conf
Автоматическое вытеснениеПосле Compaction для Segment старые записи кэша автоматически вытесняются по политике LRU

Пример изменения лимита ёмкости:

# be.conf
condition_cache_limit = 1024

Статистика и мониторинг кэша​

Doris предоставляет широкий набор статистических метрик для наблюдения за эффективностью Condition Cache. С их помощью можно оценить пользу кэша и долю попаданий в него.

Метрики в Profile​

В плане выполнения запроса (Profile) доступны следующие метрики:

Название метрикиЗначение
ConditionCacheSegmentHitКоличество Segment, для которых найден результат в кэше
ConditionCacheFilteredRowsКоличество строк, отфильтрованных непосредственно с помощью кэша

Системные метрики​

Эти метрики можно просмотреть через систему мониторинга или интерфейс metrics:

Название метрикиЗначение
condition_cache_search_countКоличество обращений к кэшу
condition_cache_hit_countКоличество попаданий в кэш

Пример использования​

Типичный сценарий​

Предположим, у вас есть следующий запрос:

SELECT order_id, amount
FROM orders
WHERE region = 'ASIA' AND order_date >= '2023-01-01';

Порядок выполнения:

  1. Первое выполнение: требуются полное сканирование и проверка условия. Condition Cache сохраняет результат в кэше LRU.
  2. Последующие идентичные запросы: кэш используется напрямую, чтобы пропустить большинство неподходящих диапазонов строк и сканировать только те части, которые могут соответствовать условию.

Если несколько запросов используют одно и то же условие фильтрации (например, region = 'ASIA' AND order_date >= '2023-01-01'), они также могут совместно использовать Condition Cache, снижая общие накладные расходы.

Примечания​

  • Кэш не сохраняется: после перезапуска Doris Condition Cache очищается.
  • Операции Delete отключают кэш: для Segments с маркерами удаления необходимо гарантировать строгую согласованность, поэтому Condition Cache не используется.

Часто задаваемые вопросы​

Вопрос 1: Чем Condition Cache отличается от Query Cache?

Condition Cache кэширует «информацию о соответствии данных Segment условию фильтрации» (битовый вектор). Он работает с более мелкой гранулярностью и позволяет повторно использовать результаты в разных запросах. Это механизм оптимизации на уровне выполнения запросов.

Вопрос 2: Почему после включения Condition Cache запрос не стал быстрее?

Проверьте следующие возможные причины:

  • Условие запроса содержит маркер Delete или TopN Runtime Filter, поэтому кэш не действует.
  • Данные записываются часто. После Compaction старые Segments заменяются новыми, а кэш вытесняется.
  • Условие имеет низкую селективность: после фильтрации остаётся много строк, поэтому польза ограничена.
  • Используйте condition_cache_hit_count / condition_cache_search_count, чтобы проверить, не слишком ли низка доля попаданий в кэш.

Вопрос 3: Как проверить, использует ли запрос Condition Cache?

Проверьте метрики ConditionCacheSegmentHit и ConditionCacheFilteredRows в Profile. Если их значения больше 0, произошло попадание в кэш и его использование позволило отфильтровать строки.

Вопрос 4: Нужен ли перезапуск после изменения condition_cache_limit?

condition_cache_limit задаётся в be.conf. Чтобы изменение вступило в силу, необходимо перезапустить BE.

Итоги​

Condition Cache — это механизм оптимизации в Doris для запросов с повторяющимися условиями. Его преимущества:

  • Позволяет избежать избыточных вычислений и снижает потребление ресурсов CPU/IO.
  • Работает прозрачно и автоматически, не требуя вмешательства пользователя.
  • Использует мало памяти и даёт заметный эффект при высокой доле попаданий в кэш и высокой доле отфильтрованных строк.

Грамотное использование Condition Cache позволяет сократить время отклика в сценариях с частыми OLAP-запросами.