OSDN Git Service

Fix wrongly lowering max_parallel_workers_per_gather
authorKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Fri, 10 Feb 2017 02:09:52 +0000 (11:09 +0900)
committerKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Fri, 10 Feb 2017 08:02:40 +0000 (17:02 +0900)
Number of parallel workers of non-hinted relations is wrongly forced
to be zero even if max_parallel_workers_per_gather is more than
zero. Non-hinted relations get to have max_parallel_workes_per_gather
as set by this fix.

doc/pg_hint_plan-ja.html
doc/pg_hint_plan.html
expected/ut-W.out
pg_hint_plan.c
sql/ut-W.sql

index b054f89..9c74b26 100755 (executable)
@@ -620,6 +620,14 @@ postgres=#
 <dd>NoIndexScanヒント句を指定した場合は、Index ScanだけでなくIndex Only Scanも選択されません。</dd>
 </dl>
 
+<dt><h3>並列実行ヒントとスキャン方式ヒントの関係について</h3></dt>
+<dd>並列実行ヒントは同じオブジェクトにどのスキャン方式ヒントも指定することができますが、並列実行不能なスキャン方式が選択された場合は並列実行指定は無効になります。</dd>
+</dl>
+
+<dt><h3>UNION に対する並列実行ヒント</h3></dt>
+<dd>並列実行ヒントは同じオブジェクトにどのスキャン方式ヒントも指定することができますが、並列実行不能なスキャン方式が選択された場合は並列実行指定は無効になります。</dd>
+</dl>
+
 <dt><h3>Set ヒントでの pg_hint_plan 自身の制御変数の設定</h3></dt>
 <dd>pg_hint_plan 自身の挙動を設定する変数を Set ヒントで変更した場合は期待通りに動作しない場合があります。</dd>
 <ul>
index ddeacc8..8e6932f 100755 (executable)
@@ -436,6 +436,15 @@ IN (SELECT ... {<b>LIMIT | OFFSET</b> ...} ...)
 <h3>Behavior of NoIndexScan</h3>
 <dd>NoIndexScan hint involes NoIndexOnlyScan.</dd>
 
+<h3>Parallel vs Scan hints</h3>
+<dd>Although any kind of scan method hint is allowed to be specified with parallel hint on the same object, parallel-unsafe scan methods beat parallel.</dd>
+
+<h3>Parallel hint and UNION</h3>
+<dd>Parallel hint affects on both plain and inheritance tables. While
+UNION gets parallel only if all underlying subqueries are
+parallel-safe. So a UNION becomes parallel only when the all
+underlying subqueries are parallel-safe. There's no means to tell
+UNION itself to be parallel.</dd>
 
 <h3>Setting pg_hint_plan parameters by Set hints</h3>
 <dd><p>pg_hint_plan paramters change the behavior of itself so some parameters doesn't work as expected.</p>
index eb7de87..4d22b77 100644 (file)
@@ -123,7 +123,7 @@ error hint:
          ->  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:
@@ -133,19 +133,21 @@ Parallel(p1_c1 10 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)
+                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;
@@ -173,22 +175,24 @@ not used hint:
 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;
@@ -199,22 +203,24 @@ not used hint:
 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;
@@ -258,12 +264,12 @@ not used hint:
 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
@@ -274,18 +280,20 @@ error hint:
                ->  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;
@@ -299,34 +307,36 @@ not used hint:
 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;
@@ -381,34 +391,36 @@ not used hint:
 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) */
@@ -421,12 +433,12 @@ not used hint:
 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
@@ -437,18 +449,20 @@ error hint:
                ->  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) */
@@ -461,32 +475,36 @@ not used hint:
 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;
@@ -517,6 +535,7 @@ 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:
@@ -526,28 +545,30 @@ 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
-   ->  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) */
@@ -588,6 +609,7 @@ error hint:
 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:
@@ -623,11 +645,47 @@ error hint:
          ->  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                 
 -------------------------------------------
index 0fa0303..61820a8 100644 (file)
@@ -2915,12 +2915,10 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
         * max_parallel_workers_per_gather should be non-zero here if Workers hint
         * is specified.
         */
-       if (max_hint_nworkers >= 0)
-       {
-               current_hint_state->init_nworkers = 0;
+       if (max_hint_nworkers > 0 && max_parallel_workers_per_gather < 1)
                set_config_int32_option("max_parallel_workers_per_gather",
                                                                1, current_hint_state->context);
-       }
+       current_hint_state->init_nworkers = max_parallel_workers_per_gather;
 
        if (debug_level > 1)
        {
index 7b4431f..3652089 100644 (file)
@@ -39,7 +39,7 @@ SET min_parallel_relation_size to DEFAULT;
 /*+Parallel(p1 10 hard)*/
 EXPLAIN (COSTS false) SELECT * FROM p1;
 
--- 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;
 
@@ -95,6 +95,7 @@ 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;
 
@@ -104,16 +105,26 @@ EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
 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;
 
 
+-- 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;
+
 -- 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;
 
 /*+Parallel(p1 0 hard)*/