Оптимизация отсечения партиций: настройка производительности запросов Doris
Отсечение партиций (Partition Pruning) — это метод оптимизации запросов: на основе условий запроса он определяет нужные партиции, сканирует только их и пропускает остальные.
Благодаря отсечению партиций Doris может значительно сократить операции I/O и объём вычислений, ускоряя запросы к большим таблицам.
Условия применимости:
- Таблица партиционирована по столбцу с бизнес-данными (например, по дате).
- Условия запроса включают фильтры по столбцу партиционирования (например,
WHERE date BETWEEN ...). - Вы хотите уменьшить количество сканируемых партиций и сократить операции I/O.
- Вам нужно проверить с помощью
EXPLAIN, работает ли отсечение.
Пример: таблица продаж, партиционированная по дате
Следующий пример демонстрирует возможности отсечения партиций в Doris.
1. Создание таблицы: диапазонное партиционирование по дате
Цель: создать таблицу продаж sales, партиционированную по дате, с одной партицией на каждый месяц.
Команда:
CREATE TABLE sales (
date DATE,
product VARCHAR(50),
amount DECIMAL(10, 2)
)
PARTITION BY RANGE(date) (
PARTITION p1 VALUES LESS THAN ('2023-01-01'),
PARTITION p2 VALUES LESS THAN ('2023-02-01'),
PARTITION p3 VALUES LESS THAN ('2023-03-01'),
PARTITION p4 VALUES LESS THAN ('2023-04-01')
)
DISTRIBUTED BY HASH(date) BUCKETS 16
PROPERTIES
(
"replication_num" = "1"
);
Описание: столбец партиционирования — date. Всего создано 4 партиции, каждая из которых содержит данные за один месяц.
2. Запрос с фильтром по столбцу партиционирования
Цель: получить общую сумму продаж за период с 15 января 2023 года по 15 февраля 2023 года.
Команда:
SELECT SUM(amount) AS total_amount
FROM sales
WHERE date BETWEEN '2023-01-15' AND '2023-02-15';
Описание: предложение WHERE содержит фильтр по диапазону значений столбца партиционирования date. Именно он позволяет задействовать отсечение партиций.
3. Процесс отсечения партиций
| Шаг | Действие Doris | Результат |
|---|---|---|
| 1 | Анализ столбца партиционирования date в условиях запроса | Определён диапазон дат от 2023-01-15 до 2023-02-15 |
| 2 | Сопоставление условий запроса с определениями партиций | Выбраны партиции p2 и p3 |
| 3 | Автоматический пропуск ненужных партиций | Пропущены p1 и p4 |
| 4 | Выполнение сканирования и агрегации только в выбранных партициях | Быстрое получение результата |
4. Проверка отсечения с помощью EXPLAIN
Цель: с помощью команды EXPLAIN просмотреть план выполнения и проверить фактическое количество сканируемых партиций.
Команда:
EXPLAIN SELECT SUM(amount) AS total_amount
FROM sales
WHERE date BETWEEN '2023-01-15' AND '2023-02-15';
Ключевой фрагмент вывода:
| 0:VOlapScanNode(212) |
| TABLE: cir.sales(sales), PREAGGREGATION: ON |
| PREDICATES: (date[#0] >= '2023-01-15') AND (date[#0] <= '2023-02-15') |
| partitions=2/4 (p2,p3) |
Описание: поле partitions=2/4 (p2,p3) узла OlapScanNode показывает, что сканируются только 2 из 4 партиций (p2 и p3). Это означает, что отсечение партиций сработало.
Сравнение: отсечение работает и не работает
| Критерий | Отсечение партиций работает | Отсечение партиций не работает |
|---|---|---|
| Условия запроса | Содержат фильтр по столбцу партиционирования | Условия по столбцу партиционирования отсутствуют либо к нему применяется функция |
| Количество сканируемых партиций | Сканируются только выбранные партиции | Сканируются все партиции |
| Затраты на I/O | Низкие | Высокие |
| Вывод EXPLAIN | partitions=N/M (N < M) | partitions=M/M |
Часто задаваемые вопросы
Вопрос 1: запрос выполняется медленно, и я подозреваю, что отсечение партиций не работает. Как это проверить?
Выполните EXPLAIN <query> и проверьте поле partitions=N/M узла OlapScanNode. Если N == M, сканируются все партиции и отсечение не работает.
Вопрос 2: почему запрос по-прежнему сканирует все партиции, хотя WHERE содержит столбец партиционирования?
Распространённые причины:
- К столбцу партиционирования применяется функция (например,
DATE_FORMAT(date, ...)), поэтому оптимизатор не может определить диапазон. - Несоответствие типов (например, столбец партиционирования имеет тип
DATE, а значение фильтра представляет собой строку, которую невозможно неявно преобразовать). - Через
ORдобавлено условие по столбцу, который не участвует в партиционировании, поэтому условие нельзя протолкнуть на уровень сканирования.
Вопрос 3: чем отсечение партиций отличается от отсечения бакетов?
- Отсечение партиций (Partition Pruning): отсекает партиции на основе столбца, указанного в
PARTITION BY. - Отсечение бакетов / таблетов (Bucket Pruning / Tablet Pruning): отсекает таблеты на основе условий равенства по столбцу, указанному в
DISTRIBUTED BY HASH. Эти два метода можно сочетать, чтобы ещё больше сократить объём сканируемых данных.
Итоги
- Отсечение партиций автоматически сопоставляет условия запроса с партициями и позволяет сканировать только нужные партиции.
- Основные условия: таблица партиционирована по столбцу с бизнес-данными, а запрос содержит фильтры по столбцу партиционирования, которые можно протолкнуть на уровень сканирования.
- Поле
partitions=N/MвEXPLAINпозволяет быстро проверить, работает ли отсечение. - Грамотное использование отсечения партиций позволяет значительно сократить затраты на I/O и вычисления, ускоряя запросы к большим объёмам данных.