-> Parallel Seq Scan on p1_c3_c2
(12 rows)
--- hinting on children don't work
+-- hinting on children don't work but enables parallel
/*+Parallel(p1_c1 10 hard)*/
EXPLAIN (COSTS false) SELECT * FROM p1;
LOG: pg_hint_plan:
duplication hint:
error hint:
- QUERY PLAN
-----------------------------
- Append
- -> Seq Scan on p1
- -> Seq Scan on p1_c1
- -> Seq Scan on p1_c2
- -> Seq Scan on p1_c3
- -> Seq Scan on p1_c4
- -> Seq Scan on p1_c1_c1
- -> Seq Scan on p1_c1_c2
- -> Seq Scan on p1_c3_c1
- -> Seq Scan on p1_c3_c2
-(10 rows)
+ QUERY PLAN
+-------------------------------------------
+ Gather
+ Workers Planned: 1
+ -> Append
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
+(12 rows)
-- Joins
EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
duplication hint:
error hint:
- QUERY PLAN
--------------------------------------------------
- Gather
- Workers Planned: 10
- -> Hash Join
- Hash Cond: (p1_c1.id = p2_c1.id)
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1_c1.id = p2_c1.id)
+ -> Gather
+ Workers Planned: 10
-> Append
-> Parallel Seq Scan on p1_c1
-> Parallel Seq Scan on p1_c1_c1
-> Parallel Seq Scan on p1_c1_c2
- -> Hash
+ -> Hash
+ -> Gather
+ Workers Planned: 1
-> Append
- -> Seq Scan on p2_c1
- -> Seq Scan on p2_c1_c1
- -> Seq Scan on p2_c1_c2
-(13 rows)
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+(15 rows)
/*+Parallel(p2_c1 10 hard)*/
EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
duplication hint:
error hint:
- QUERY PLAN
--------------------------------------------------
- Gather
- Workers Planned: 10
- -> Hash Join
- Hash Cond: (p2_c1.id = p1_c1.id)
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1_c1.id = p2_c1.id)
+ -> Gather
+ Workers Planned: 1
-> Append
- -> Parallel Seq Scan on p2_c1
- -> Parallel Seq Scan on p2_c1_c1
- -> Parallel Seq Scan on p2_c1_c2
- -> Hash
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Hash
+ -> Gather
+ Workers Planned: 10
-> Append
- -> Seq Scan on p1_c1
- -> Seq Scan on p1_c1_c1
- -> Seq Scan on p1_c1_c2
-(13 rows)
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+(15 rows)
/*+Parallel(p1_c1 10 hard) Parallel(p2_c1 10 hard)*/
EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
duplication hint:
error hint:
- QUERY PLAN
--------------------------------------------------
- Gather
- Workers Planned: 1
- -> Hash Join
- Hash Cond: (p1.id = p2.id)
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1.id = p2.id)
+ -> Gather
+ Workers Planned: 1
-> Append
-> Parallel Seq Scan on p1
-> Parallel Seq Scan on p1_c1
-> Parallel Seq Scan on p1_c1_c2
-> Parallel Seq Scan on p1_c3_c1
-> Parallel Seq Scan on p1_c3_c2
- -> Hash
+ -> Hash
+ -> Gather
+ Workers Planned: 1
-> Append
- -> Seq Scan on p2
- -> Seq Scan on p2_c1
- -> Seq Scan on p2_c2
- -> Seq Scan on p2_c3
- -> Seq Scan on p2_c4
- -> Seq Scan on p2_c1_c1
- -> Seq Scan on p2_c1_c2
- -> Seq Scan on p2_c3_c1
- -> Seq Scan on p2_c3_c2
-(25 rows)
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(27 rows)
SET parallel_setup_cost to DEFAULT;
SET parallel_tuple_cost to DEFAULT;
duplication hint:
error hint:
- QUERY PLAN
--------------------------------------------------
- Gather
- Workers Planned: 10
- -> Hash Join
- Hash Cond: (p2.id = p1.id)
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1.id = p2.id)
+ -> Gather
+ Workers Planned: 1
-> Append
- -> Parallel Seq Scan on p2
- -> Parallel Seq Scan on p2_c1
- -> Parallel Seq Scan on p2_c2
- -> Parallel Seq Scan on p2_c3
- -> Parallel Seq Scan on p2_c4
- -> Parallel Seq Scan on p2_c1_c1
- -> Parallel Seq Scan on p2_c1_c2
- -> Parallel Seq Scan on p2_c3_c1
- -> Parallel Seq Scan on p2_c3_c2
- -> Hash
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
+ -> Hash
+ -> Gather
+ Workers Planned: 10
-> Append
- -> Seq Scan on p1
- -> Seq Scan on p1_c1
- -> Seq Scan on p1_c2
- -> Seq Scan on p1_c3
- -> Seq Scan on p1_c4
- -> Seq Scan on p1_c1_c1
- -> Seq Scan on p1_c1_c2
- -> Seq Scan on p1_c3_c1
- -> Seq Scan on p1_c3_c2
-(25 rows)
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(27 rows)
/*+Parallel(p2 10 hard) Parallel(p1 5 hard) */
EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
duplication hint:
error hint:
- QUERY PLAN
---------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------
Hash Join
- Hash Cond: (p2.id = p1.id)
- -> Append
- -> Index Scan using p2_id2_val on p2
- -> Index Scan using p2_c1_id2_val on p2_c1
- -> Index Scan using p2_c2_id2_val on p2_c2
- -> Index Scan using p2_c3_id_val_idx on p2_c3
- -> Index Scan using p2_c4_id_val_idx on p2_c4
- -> Index Scan using p2_c1_c1_id_val_idx on p2_c1_c1
- -> Index Scan using p2_c1_c2_id_val_idx on p2_c1_c2
- -> Index Scan using p2_c3_c1_id_val_idx on p2_c3_c1
- -> Index Scan using p2_c3_c2_id_val_idx on p2_c3_c2
+ Hash Cond: (p1.id = p2.id)
+ -> Gather
+ Workers Planned: 10
+ -> Append
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
-> Hash
-> Gather
- Workers Planned: 10
+ Workers Planned: 1
-> Append
- -> Parallel Seq Scan on p1
- -> Parallel Seq Scan on p1_c1
- -> Parallel Seq Scan on p1_c2
- -> Parallel Seq Scan on p1_c3
- -> Parallel Seq Scan on p1_c4
- -> Parallel Seq Scan on p1_c1_c1
- -> Parallel Seq Scan on p1_c1_c2
- -> Parallel Seq Scan on p1_c3_c1
- -> Parallel Seq Scan on p1_c3_c2
-(25 rows)
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(27 rows)
-- seqscan doesn't harm parallelism
/*+Parallel(p1 10 hard) SeqScan(p1) */
duplication hint:
error hint:
- QUERY PLAN
--------------------------------------------------
- Gather
- Workers Planned: 10
- -> Hash Join
- Hash Cond: (p1.id = p2.id)
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1.id = p2.id)
+ -> Gather
+ Workers Planned: 10
-> Append
-> Parallel Seq Scan on p1
-> Parallel Seq Scan on p1_c1
-> Parallel Seq Scan on p1_c1_c2
-> Parallel Seq Scan on p1_c3_c1
-> Parallel Seq Scan on p1_c3_c2
- -> Hash
+ -> Hash
+ -> Gather
+ Workers Planned: 1
-> Append
- -> Seq Scan on p2
- -> Seq Scan on p2_c1
- -> Seq Scan on p2_c2
- -> Seq Scan on p2_c3
- -> Seq Scan on p2_c4
- -> Seq Scan on p2_c1_c1
- -> Seq Scan on p2_c1_c2
- -> Seq Scan on p2_c3_c1
- -> Seq Scan on p2_c3_c2
-(25 rows)
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(27 rows)
-- parallelism is not available for the case
/*+Parallel(p1 10 hard) IndexScan(p1) */
duplication hint:
error hint:
- QUERY PLAN
---------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------
Hash Join
Hash Cond: (p1.id = p2.id)
- -> Append
- -> Index Scan using p1_pkey on p1
- -> Index Scan using p1_c1_pkey on p1_c1
- -> Index Scan using p1_c2_pkey on p1_c2
- -> Index Scan using p1_c3_pkey on p1_c3
- -> Index Scan using p1_c4_pkey on p1_c4
- -> Index Scan using p1_c1_c1_pkey on p1_c1_c1
- -> Index Scan using p1_c1_c2_pkey on p1_c1_c2
- -> Index Scan using p1_c3_c1_pkey on p1_c3_c1
- -> Index Scan using p1_c3_c2_pkey on p1_c3_c2
- -> Hash
+ -> Gather
+ Workers Planned: 10
-> Append
- -> Seq Scan on p2
- -> Seq Scan on p2_c1
- -> Seq Scan on p2_c2
- -> Seq Scan on p2_c3
- -> Seq Scan on p2_c4
- -> Seq Scan on p2_c1_c1
- -> Seq Scan on p2_c1_c2
- -> Seq Scan on p2_c3_c1
- -> Seq Scan on p2_c3_c2
-(23 rows)
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
+ -> Hash
+ -> Gather
+ Workers Planned: 1
+ -> Append
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(27 rows)
-- Parallel on UNION
EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
SET parallel_setup_cost to 0;
SET parallel_tuple_cost to 0;
SET min_parallel_relation_size to 0;
+SET max_parallel_workers_per_gather to 0;
/*+Parallel(p1 10) */
EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
LOG: pg_hint_plan:
duplication hint:
error hint:
- QUERY PLAN
-----------------------------
- Append
- -> Seq Scan on p1
- -> Seq Scan on p1_c1
- -> Seq Scan on p1_c2
- -> Seq Scan on p1_c3
- -> Seq Scan on p1_c4
- -> Seq Scan on p1_c1_c1
- -> Seq Scan on p1_c1_c2
- -> Seq Scan on p1_c3_c1
- -> Seq Scan on p1_c3_c2
- -> Seq Scan on p2
- -> Seq Scan on p2_c1
- -> Seq Scan on p2_c2
- -> Seq Scan on p2_c3
- -> Seq Scan on p2_c4
- -> Seq Scan on p2_c1_c1
- -> Seq Scan on p2_c1_c2
- -> Seq Scan on p2_c3_c1
- -> Seq Scan on p2_c3_c2
-(19 rows)
+ QUERY PLAN
+-------------------------------------------
+ Gather
+ Workers Planned: 1
+ -> Append
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
+ -> Parallel Seq Scan on p2
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c2
+ -> Parallel Seq Scan on p2_c3
+ -> Parallel Seq Scan on p2_c4
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Parallel Seq Scan on p2_c3_c1
+ -> Parallel Seq Scan on p2_c3_c2
+(21 rows)
-- all children are parallel, so this can be parallel
/*+Parallel(p1 10) Parallel(p2 10) */
SET parallel_setup_cost to DEFAULT;
SET parallel_tuple_cost to DEFAULT;
SET min_parallel_relation_size to DEFAULT;
+SET max_parallel_workers_per_gather to DEFAULT;
/*+Parallel(p1 10 hard)Parallel(p2 10 hard) */
EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
LOG: pg_hint_plan:
-> Parallel Seq Scan on p2_c3_c2
(21 rows)
+-- num of workers of non-hinted relations should be default value
+SET parallel_setup_cost to 0;
+SET parallel_tuple_cost to 0;
+SET min_parallel_relation_size to 0;
+SET max_parallel_workers_per_gather to 3;
+/*+Parallel(p1 10 hard) */
+EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
+LOG: pg_hint_plan:
+used hint:
+Parallel(p1 10 hard)
+not used hint:
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (t1.id = p1.id)
+ -> Gather
+ Workers Planned: 3
+ -> Parallel Seq Scan on t1
+ -> Hash
+ -> Gather
+ Workers Planned: 10
+ -> Append
+ -> Parallel Seq Scan on p1
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c2
+ -> Parallel Seq Scan on p1_c3
+ -> Parallel Seq Scan on p1_c4
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Parallel Seq Scan on p1_c3_c1
+ -> Parallel Seq Scan on p1_c3_c2
+(18 rows)
+
-- Negative hint
-SET max_parallel_workers_per_gather to 5;
SET parallel_setup_cost to 0;
SET parallel_tuple_cost to 0;
SET min_parallel_relation_size to 0;
+SET max_parallel_workers_per_gather to 5;
EXPLAIN (COSTS false) SELECT * FROM p1;
QUERY PLAN
-------------------------------------------