0Pricing
SQL Academy · Урок

Эффективные запросы к секционированным таблицам

Пишите запросы, использующие отсечение секций, и проверяйте его работу с помощью EXPLAIN

«Эффективные запросы к секционированным таблицам» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Фильтрация по ключу партиции

Отсечение партиций работает только тогда, когда предложение WHERE включает ключ партиции:

-- Prunes (uses date partitioning):
SELECT * FROM events WHERE ts >= '2024-03-01' AND ts < '2024-04-01';

-- No pruning — scans all partitions:
SELECT * FROM events WHERE user_id = 42;

Составное отсечение

Планировщик может отсекать партиции по нескольким ключам в таблицах с многоуровневым секционированием:

SELECT * FROM events
WHERE ts >= '2024-03-01' AND ts < '2024-04-01'
  AND user_id = 42;
-- Prunes by date AND by hash partition.

EXPLAIN показывает отсечение

Проверьте план, чтобы убедиться, что отсечение выполняется:

EXPLAIN SELECT * FROM events WHERE ts >= '2024-03-01' AND ts < '2024-04-01';
-- Append
--   -> Seq Scan on events_2024_q1
-- Only Q1 partition shown; others pruned.

Исключение по ограничениям и отсечение партиций

Современный PG по умолчанию использует быстрое «отсечение партиций». Старое «исключение по ограничениям» работало медленнее; убедитесь, что enable_partition_pruning = on.

Отсечение во время выполнения

Даже для параметризованных запросов (PREPARE) PG может выполнять отсечение во время выполнения:

PREPARE p(timestamptz, timestamptz) AS
SELECT * FROM events WHERE ts >= $1 AND ts < $2;

EXECUTE p('2024-03-01', '2024-04-01');
-- Pruning happens at execute, not at parse.

Индексы между партициями

Индексы распространяются на партиции. Запрос по индексированному столбцу работает по всем партициям, но планировщик сканирует индекс каждой из них.

Агрегация между партициями

Предложение GROUP BY по ключу партиции даёт наибольший выигрыш. GROUP BY по другим столбцам сканирует каждую партицию.

Параллельное выполнение по партициям

PostgreSQL может параллельно выполнять сканирование партиций (PG 11+):

SET max_parallel_workers_per_gather = 4;
EXPLAIN SELECT COUNT(*) FROM events;
-- Parallel Append over partitions.

Соединения секционированных таблиц

Если обе секционированные таблицы используют один ключ партиции, «соединение по партициям» выполняется быстрее: каждая партиция соединяется отдельно:

SET enable_partitionwise_join = on;
-- Now PG can join events to event_metrics partition-by-partition.

Как избежать распространённых ошибок

  • Не применяйте функции к ключу партиции в WHERE — это отключает отсечение
  • Не забывайте добавлять ключ партиции в запросы
  • Не создавайте тысячи крошечных партиций — накладные расходы на планирование будут доминировать

Разумное количество партиций

Старайтесь использовать десятки или небольшое количество сотен партиций, а не тысячи. Каждая партиция создаёт накладные расходы при планировании. Для очень детального разбиения используйте подпартиционирование.

Обслуживание отдельных партиций

VACUUM, ANALYZE и REINDEX выполняются для каждой партиции отдельно и могут выполняться параллельно. Чем больше у вас партиций, тем заметнее выигрыш — в разумных пределах.

Итоги

Секционирование особенно полезно для запросов, фильтрующих данные по ключу партиции.

  • WHERE по ключу партиции → отсечение
  • Подтверждайте результат с помощью EXPLAIN
  • Включайте соединение по партициям для подходящих соединений
  • Не создавайте чрезмерное количество партиций

Быстрая проверка

У вас есть таблица events, секционированная по месяцам по столбцу ts. Какой запрос использует отсечение партиций?

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

Урок «Эффективные запросы к секционированным таблицам» бесплатный?

Да — полный текст урока «Эффективные запросы к секционированным таблицам» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Эффективные запросы к секционированным таблицам»?

Пишите запросы, использующие отсечение секций, и проверяйте его работу с помощью EXPLAIN Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Эффективные запросы к секционированным таблицам»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужно секционирование: отсечение и обслуживание
  2. Секционирование по диапазону, списку и хешу
  3. Отсоединение и присоединение секций
  4. Эффективные запросы к секционированным таблицам
← Назад к SQL Academy