DBAtlas · Атлас эксплуатации баз данных

Проверить, что работает отсечение секций (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.

Открыть в DBAtlas →

Связанные материалы