分区裁剪与分区连接
00:00
PostgreSQL分区裁剪与分区连接:运行时裁剪、分区智能连接与性能优化
1. 分区裁剪
1.1 计划时裁剪
-- WHERE 条件常量在计划时已知
EXPLAIN SELECT * FROM orders WHERE order_date = '2026-05-15';
-- 只扫描 orders_2026_q2
1.2 运行时裁剪
-- 参数化查询在执行时裁剪
PREPARE get_orders(DATE) AS
SELECT * FROM orders WHERE order_date = $1;
EXPLAIN EXECUTE get_orders('2026-05-15');
-- Append
-- Subplans Removed: 3 -- 运行时裁剪了3个分区
2. 分区连接(Partitionwise Join)
-- 当两表都是分区表且分区策略匹配时
-- PostgreSQL 可以逐分区连接
SET enable_partitionwise_join = ON;
EXPLAIN SELECT * FROM orders o JOIN order_items oi ON o.id = oi.order_id;
-- 每对对应分区单独连接
-- 减少内存使用和计算量
3. 分区聚合
SET enable_partitionwise_aggregate = ON;
-- 逐分区聚合后合并
SELECT order_date, SUM(amount) FROM orders GROUP BY order_date;
-- 每个分区先聚合,然后合并结果