DBAtlas · 数据库运维图谱

验证分区裁剪是否生效(规划时和运行时)

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';

作用

比较规划时裁剪、使用通用计划时的运行时裁剪('Subplans Removed: N'),以及在分区键上应用函数时裁剪如何失效。

适用场景

当分区表上的查询比预期慢、计划扫描了每个分区,或应用使用 ORM/prepared statement 时。

注意

对分区键应用函数或类型转换(date_trunc(created_at)、created_at::text)会禁用裁剪;请将条件写成键上的范围。使用通用计划时,裁剪发生在执行器启动阶段,只显示为 'Subplans Removed';对于 now() 等 STABLE 表达式,在不带 ANALYZE 的 EXPLAIN 中也能看到。enable_partition_pruning = off 时完全不进行裁剪。分区很多时,也要测量 Planning Time。

在 DBAtlas 中打开 →

相关内容