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

Оптимизация отсечения партиций: настройка производительности запросов 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НизкиеВысокие
Вывод EXPLAINpartitions=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 и вычисления, ускоряя запросы к большим объёмам данных.