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: Parallel(t1 10 soft) not used hint: 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: Parallel(t1 10 soft) not used hint: 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: Parallel(t1 10 hard) not used hint: 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: Parallel(p1 10 soft) not used hint: 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: Parallel(p1 10 hard) not used hint: 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: Parallel(p1_c1 10 hard) not used hint: 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: Parallel(p2_c1 10 hard) not used hint: 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: Parallel(p1_c1 10 hard) Parallel(p2_c1 10 hard) not used hint: 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: Parallel(p1 10 soft) not used hint: 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: Parallel(p2 10 hard) not used hint: 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: Parallel(p1 5 hard) Parallel(p2 10 hard) not used hint: 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: Parallel(p1 0 hard) not used hint: 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)