Проверить, что работает отсечение секций (partition pruning) на этапе планирования и выполнения
PostgreSQLСекционированиеКоманда
SHOW enable_partition_pruning;
-- Plan-time pruning: only the relevant partition should appear in the plan
EXPLAIN (COSTS OFF)
SELECT count(*) FROM sales WHERE created_at >= DATE '2026-03-01' AND created_at < DATE '2026-04-01';
-- Run-time pruning: generic plan / parameterized query, "Subplans Removed: N"
PREPARE q_sales(date) AS SELECT count(*) FROM sales WHERE created_at = $1;
SET plan_cache_mode = force_generic_plan;
EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF) EXECUTE q_sales('2026-03-15');
RESET plan_cache_mode;
DEALLOCATE q_sales;
-- Pruning killer: a function on the key column scans every partition
EXPLAIN (COSTS OFF)
SELECT count(*) FROM sales WHERE date_trunc('month', created_at) = DATE '2026-03-01';Что делает
Сравнивает отсечение на этапе планирования, отсечение на этапе выполнения с generic plan ('Subplans Removed: N') и то, как отсечение теряется при применении функции к ключу секционирования.
Когда использовать
Когда запросы к секционированной таблице медленнее ожидаемого, план сканирует все секции или приложение использует ORM/prepared statements.
Внимание
Применение функции или приведения типа к ключу секционирования (date_trunc(created_at), created_at::text) отключает отсечение; записывайте условие как диапазон по ключу. С generic plan отсечение происходит при запуске исполнителя и видно только как 'Subplans Removed'; для STABLE-выражений, таких как now(), оно видно и в EXPLAIN без ANALYZE. При enable_partition_pruning = off отсечение не выполняется вовсе. При большом числе секций измеряйте также Planning Time.
Связанные материалы
- Создать таблицу с помесячным range-секционированием (генерация секций в цикле)
- Подключить подготовленную таблицу как секцию с короткой блокировкой (ATTACH PARTITION)
- Отключить старую секцию, не блокируя рабочий трафик (DETACH CONCURRENTLY)
- Ловушка секции по умолчанию: создание новой секции завершается ошибкой 'would be violated by some row'
- Автоматизировать создание секций и их хранение через pg_partman