Postgres使用UNION ALL查询分区表时能否实现并行查询?
可行解决方案
- 修正查询写法,适配分区表并行逻辑
你当前手动拆分两个子分区查询再用UNION ALL拼接的写法,PostgreSQL优化器无法识别为可并行的分区扫描任务,只会串行执行两个独立的查询分支。
改为直接查询父分区表,依赖分区剪枝自动定位到目标分区,优化器才能生成跨分区的并行执行计划:
SELECT * FROM test_trgm_x WHERE (n = 1 AND t ~ '(ulpa)') OR (n = 2 AND t ~ '(piente)');
- 调整并行执行相关配置参数
以下参数需要按需调整,调整后可通过SHOW 参数名确认生效:
max_parallel_workers_per_gather:至少设置为2及以上,建议首次测试设为4,控制单个Gather节点最多可调用的并行工作进程数min_parallel_table_scan_size、min_parallel_index_scan_size:均设置为0,绕过默认的最小扫描大小阈值,确保你的单分区55万行数据量级能触发并行parallel_tuple_cost:调低到0.001,parallel_setup_cost调低到100,降低优化器判定并行执行的成本门槛
- 确认版本与索引支持
PostgreSQL 11及以上版本才支持GIN索引的并行扫描,如果你使用的版本低于11,需要先升级数据库版本才能实现trigram GIN索引查询的并行执行。 - 强制并行验证
如果调整后仍然走串行计划,可以执行SET force_parallel_mode = on;强制优化器生成并行计划,验证你的场景是否支持并行,排除成本计算的干扰。
内容的提问来源于stack exchange,提问作者Kamil Szulc
相关产品推荐
相关产品推荐

