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: одно и то же условие фильтрации на одном и том же фрагменте данных даёт одинаковый результат.
- Doris формирует 64-битный хеш из «выражения фильтрации + Key Range» и использует его как уникальный идентификатор записи кэша.
- Каждый Segment может использовать этот хеш для поиска существующего результата фильтрации в кэше.
- Кэшированный результат хранится в виде сжатого битового вектора (
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';
Порядок выполнения:
- Первое выполнение: требуются полное сканирование и проверка условия. Condition Cache сохраняет результат в кэше LRU.
- Последующие идентичные запросы: кэш используется напрямую, чтобы пропустить большинство неподходящих диапазонов строк и сканировать только те части, которые могут соответствовать условию.
Если несколько запросов используют одно и то же условие фильтрации (например, 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-запросами.