+LOAD 'pg_hint_plan';
+ALTER SYSTEM SET session_preload_libraries TO 'pg_hint_plan';
+SET pg_hint_plan.enable_hint TO on;
+SET pg_hint_plan.debug_print TO on;
+SET client_min_messages TO LOG;
+SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
+SET enable_indexscan to false;
+SET enable_bitmapscan to false;
+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;
+CREATE TABLE s1.tl (a int);
+INSERT INTO s1.tl (SELECT a FROM generate_series(0, 100000) a);
+EXPLAIN (COSTS false) SELECT * FROM s1.t1;
+ QUERY PLAN
+----------------
+ Seq Scan on t1
+(1 row)
+
+/*+Parallel(t1 10)*/
+EXPLAIN (COSTS false) SELECT * FROM s1.t1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(t1 10 soft)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------
+ Gather
+ Workers Planned: 2
+ -> Parallel Seq Scan on t1
+(3 rows)
+
+/*+Parallel(t1 10 soft)*/
+EXPLAIN (COSTS false) SELECT * FROM s1.t1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(t1 10 soft)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------
+ Gather
+ Workers Planned: 2
+ -> Parallel Seq Scan on t1
+(3 rows)
+
+/*+Parallel(t1 10 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM s1.t1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(t1 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------
+ Gather
+ Workers Planned: 10
+ -> Parallel Seq Scan on t1
+(3 rows)
+
+-- Inheritnce tables
+/*+Parallel(p1 10 soft)*/
+EXPLAIN (COSTS false) SELECT * FROM p1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1 10 soft)
+duplication hint:
+error hint:
+
+ 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)
+
+/*+Parallel(p1 10 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM p1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------
+ 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
+(12 rows)
+
+-- Joins
+EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
+ QUERY PLAN
+----------------------------------------
+ Hash Join
+ Hash Cond: (p1_c1.id = p2_c1.id)
+ -> Append
+ -> Seq Scan on p1_c1
+ -> Seq Scan on p1_c1_c1
+ -> Seq Scan on p1_c1_c2
+ -> Hash
+ -> Append
+ -> Seq Scan on p2_c1
+ -> Seq Scan on p2_c1_c1
+ -> Seq Scan on p2_c1_c2
+(11 rows)
+
+/*+Parallel(p1_c1 10 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1_c1 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------
+ Gather
+ Workers Planned: 10
+ -> Hash Join
+ Hash Cond: (p1_c1.id = p2_c1.id)
+ -> Append
+ -> Parallel Seq Scan on p1_c1
+ -> Parallel Seq Scan on p1_c1_c1
+ -> Parallel Seq Scan on p1_c1_c2
+ -> Hash
+ -> Append
+ -> Seq Scan on p2_c1
+ -> Seq Scan on p2_c1_c1
+ -> Seq Scan on p2_c1_c2
+(13 rows)
+
+/*+Parallel(p2_c1 10 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM p1_c1 join p2_c1 on p1_c1.id = p2_c1.id;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p2_c1 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------
+ Gather
+ Workers Planned: 10
+ -> Hash Join
+ Hash Cond: (p2_c1.id = p1_c1.id)
+ -> Append
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+ -> Hash
+ -> Append
+ -> Seq Scan on p1_c1
+ -> Seq Scan on p1_c1_c1
+ -> Seq Scan on p1_c1_c2
+(13 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;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1_c1 10 hard)
+Parallel(p2_c1 10 hard)
+duplication hint:
+error hint:
+
+ 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
+ -> Gather
+ Workers Planned: 10
+ -> Append
+ -> Parallel Seq Scan on p2_c1
+ -> Parallel Seq Scan on p2_c1_c1
+ -> Parallel Seq Scan on p2_c1_c2
+(15 rows)
+
+-- Joins on inheritance tables
+/*+Parallel(p1 10)*/
+EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1 10 soft)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------
+ Gather
+ Workers Planned: 1
+ -> Hash Join
+ Hash Cond: (p1.id = p2.id)
+ -> 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
+ -> 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(p2 10 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p2 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------
+ Gather
+ Workers Planned: 10
+ -> Hash Join
+ Hash Cond: (p2.id = p1.id)
+ -> 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
+ -> 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(p2 10 hard) Parallel(p1 5 hard) */
+EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1 5 hard)
+Parallel(p2 10 hard)
+duplication hint:
+error hint:
+
+ QUERY PLAN
+-------------------------------------------------------
+ Hash Join
+ Hash Cond: (p1.id = p2.id)
+ -> Gather
+ Workers Planned: 5
+ -> 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
+ -> 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)
+
+-- Negative hint
+SET max_parallel_workers_per_gather to 5;
+EXPLAIN (COSTS false) SELECT * FROM p1;
+ 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)
+
+/*+Parallel(p1 0 hard)*/
+EXPLAIN (COSTS false) SELECT * FROM p1;
+LOG: pg_hint_plan:
+used hint:
+not used hint:
+Parallel(p1 0 hard)
+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)
+
+ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
+SELECT pg_reload_conf();
+ pg_reload_conf
+----------------
+ t
+(1 row)
+