OSDN Git Service

Follow the behavioral change of parallel execution
[pghintplan/pg_hint_plan.git] / expected / ut-W.out
1 LOAD 'pg_hint_plan';
2 ALTER SYSTEM SET session_preload_libraries TO 'pg_hint_plan';
3 SET pg_hint_plan.enable_hint TO on;
4 SET pg_hint_plan.debug_print TO on;
5 SET client_min_messages TO LOG;
6 CREATE TABLE s1.tl (a int);
7 INSERT INTO s1.tl (SELECT a FROM generate_series(0, 100000) a);
8 -- Queries on ordinary tables with default setting
9 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
10    QUERY PLAN   
11 ----------------
12  Seq Scan on t1
13 (1 row)
14
15 SET parallel_setup_cost to 0;
16 SET parallel_tuple_cost to 0;
17 SET min_parallel_relation_size to 0;
18 SET max_parallel_workers_per_gather to DEFAULT;
19 /*+Parallel(t1 8)*/
20 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
21 LOG:  pg_hint_plan:
22 used hint:
23 Parallel(t1 8 soft)
24 not used hint:
25 duplication hint:
26 error hint:
27
28           QUERY PLAN           
29 -------------------------------
30  Gather
31    Workers Planned: 2
32    ->  Parallel Seq Scan on t1
33 (3 rows)
34
35 /*+Parallel(t1 8 soft)*/
36 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
37 LOG:  pg_hint_plan:
38 used hint:
39 Parallel(t1 8 soft)
40 not used hint:
41 duplication hint:
42 error hint:
43
44           QUERY PLAN           
45 -------------------------------
46  Gather
47    Workers Planned: 2
48    ->  Parallel Seq Scan on t1
49 (3 rows)
50
51 /*+Parallel(t1 8 hard)*/
52 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
53 LOG:  pg_hint_plan:
54 used hint:
55 Parallel(t1 8 hard)
56 not used hint:
57 duplication hint:
58 error hint:
59
60           QUERY PLAN           
61 -------------------------------
62  Gather
63    Workers Planned: 8
64    ->  Parallel Seq Scan on t1
65 (3 rows)
66
67 -- Queries on inheritance tables
68 SET parallel_setup_cost to 0;
69 SET parallel_tuple_cost to 0;
70 SET min_parallel_relation_size to 0;
71 /*+Parallel(p1 8)*/
72 EXPLAIN (COSTS false) SELECT * FROM p1;
73 LOG:  pg_hint_plan:
74 used hint:
75 Parallel(p1 8 soft)
76 not used hint:
77 duplication hint:
78 error hint:
79
80                 QUERY PLAN                 
81 -------------------------------------------
82  Gather
83    Workers Planned: 1
84    ->  Append
85          ->  Parallel Seq Scan on p1
86          ->  Parallel Seq Scan on p1_c1
87          ->  Parallel Seq Scan on p1_c2
88          ->  Parallel Seq Scan on p1_c3
89          ->  Parallel Seq Scan on p1_c4
90          ->  Parallel Seq Scan on p1_c1_c1
91          ->  Parallel Seq Scan on p1_c1_c2
92          ->  Parallel Seq Scan on p1_c3_c1
93          ->  Parallel Seq Scan on p1_c3_c2
94 (12 rows)
95
96 SET parallel_setup_cost to DEFAULT;
97 SET parallel_tuple_cost to DEFAULT;
98 SET min_parallel_relation_size to DEFAULT;
99 /*+Parallel(p1 8 hard)*/
100 EXPLAIN (COSTS false) SELECT * FROM p1;
101 LOG:  pg_hint_plan:
102 used hint:
103 Parallel(p1 8 hard)
104 not used hint:
105 duplication hint:
106 error hint:
107
108                 QUERY PLAN                 
109 -------------------------------------------
110  Gather
111    Workers Planned: 8
112    ->  Append
113          ->  Parallel Seq Scan on p1
114          ->  Parallel Seq Scan on p1_c1
115          ->  Parallel Seq Scan on p1_c2
116          ->  Parallel Seq Scan on p1_c3
117          ->  Parallel Seq Scan on p1_c4
118          ->  Parallel Seq Scan on p1_c1_c1
119          ->  Parallel Seq Scan on p1_c1_c2
120          ->  Parallel Seq Scan on p1_c3_c1
121          ->  Parallel Seq Scan on p1_c3_c2
122 (12 rows)
123
124 -- hinting on children makes the whole inheritance parallel
125 /*+Parallel(p1_c1 8 hard)*/
126 EXPLAIN (COSTS false) SELECT * FROM p1;
127 LOG:  pg_hint_plan:
128 used hint:
129 Parallel(p1_c1 8 hard)
130 not used hint:
131 duplication hint:
132 error hint:
133
134                 QUERY PLAN                 
135 -------------------------------------------
136  Gather
137    Workers Planned: 8
138    ->  Append
139          ->  Parallel Seq Scan on p1
140          ->  Parallel Seq Scan on p1_c1
141          ->  Parallel Seq Scan on p1_c2
142          ->  Parallel Seq Scan on p1_c3
143          ->  Parallel Seq Scan on p1_c4
144          ->  Parallel Seq Scan on p1_c1_c1
145          ->  Parallel Seq Scan on p1_c1_c2
146          ->  Parallel Seq Scan on p1_c3_c1
147          ->  Parallel Seq Scan on p1_c3_c2
148 (12 rows)
149
150 -- Joins
151 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
152                 QUERY PLAN                
153 ------------------------------------------
154  Hash Join
155    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
156    ->  Seq Scan on p1_c1_c1
157    ->  Hash
158          ->  Seq Scan on p2_c1_c1
159 (5 rows)
160
161 /*+Parallel(p1_c1_c1 8 hard)*/
162 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
163 LOG:  pg_hint_plan:
164 used hint:
165 Parallel(p1_c1_c1 8 hard)
166 not used hint:
167 duplication hint:
168 error hint:
169
170                    QUERY PLAN                    
171 -------------------------------------------------
172  Hash Join
173    Hash Cond: (p2_c1_c1.id = p1_c1_c1.id)
174    ->  Seq Scan on p2_c1_c1
175    ->  Hash
176          ->  Gather
177                Workers Planned: 8
178                ->  Parallel Seq Scan on p1_c1_c1
179 (7 rows)
180
181 SET parallel_setup_cost to 0;
182 SET parallel_tuple_cost to 0;
183 SET min_parallel_relation_size to 0;
184 /*+Parallel(p1_c1_c1 8 soft) Parallel(p2_c1_c1 0)*/
185 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
186 LOG:  pg_hint_plan:
187 used hint:
188 Parallel(p1_c1_c1 8 soft)
189 Parallel(p2_c1_c1 0 soft)
190 not used hint:
191 duplication hint:
192 error hint:
193
194                    QUERY PLAN                   
195 ------------------------------------------------
196  Gather
197    Workers Planned: 1
198    ->  Hash Join
199          Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
200          ->  Parallel Seq Scan on p1_c1_c1
201          ->  Hash
202                ->  Seq Scan on p2_c1_c1
203 (7 rows)
204
205 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 0)*/
206 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
207 LOG:  pg_hint_plan:
208 used hint:
209 Parallel(p1_c1_c1 8 hard)
210 Parallel(p2_c1_c1 0 soft)
211 not used hint:
212 duplication hint:
213 error hint:
214
215                    QUERY PLAN                   
216 ------------------------------------------------
217  Gather
218    Workers Planned: 8
219    ->  Hash Join
220          Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
221          ->  Parallel Seq Scan on p1_c1_c1
222          ->  Hash
223                ->  Seq Scan on p2_c1_c1
224 (7 rows)
225
226 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 8 hard)*/
227 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
228 LOG:  pg_hint_plan:
229 used hint:
230 Parallel(p1_c1_c1 8 hard)
231 Parallel(p2_c1_c1 8 hard)
232 not used hint:
233 duplication hint:
234 error hint:
235
236                    QUERY PLAN                    
237 -------------------------------------------------
238  Hash Join
239    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
240    ->  Gather
241          Workers Planned: 8
242          ->  Parallel Seq Scan on p1_c1_c1
243    ->  Hash
244          ->  Gather
245                Workers Planned: 8
246                ->  Parallel Seq Scan on p2_c1_c1
247 (9 rows)
248
249 -- Joins on inheritance tables
250 SET parallel_setup_cost to 0;
251 SET parallel_tuple_cost to 0;
252 SET min_parallel_relation_size to 0;
253 /*+Parallel(p1 8)*/
254 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
255 LOG:  pg_hint_plan:
256 used hint:
257 Parallel(p1 8 soft)
258 not used hint:
259 duplication hint:
260 error hint:
261
262                       QUERY PLAN                       
263 -------------------------------------------------------
264  Hash Join
265    Hash Cond: (p1.id = p2.id)
266    ->  Gather
267          Workers Planned: 1
268          ->  Append
269                ->  Parallel Seq Scan on p1
270                ->  Parallel Seq Scan on p1_c1
271                ->  Parallel Seq Scan on p1_c2
272                ->  Parallel Seq Scan on p1_c3
273                ->  Parallel Seq Scan on p1_c4
274                ->  Parallel Seq Scan on p1_c1_c1
275                ->  Parallel Seq Scan on p1_c1_c2
276                ->  Parallel Seq Scan on p1_c3_c1
277                ->  Parallel Seq Scan on p1_c3_c2
278    ->  Hash
279          ->  Gather
280                Workers Planned: 1
281                ->  Append
282                      ->  Parallel Seq Scan on p2
283                      ->  Parallel Seq Scan on p2_c1
284                      ->  Parallel Seq Scan on p2_c2
285                      ->  Parallel Seq Scan on p2_c3
286                      ->  Parallel Seq Scan on p2_c4
287                      ->  Parallel Seq Scan on p2_c1_c1
288                      ->  Parallel Seq Scan on p2_c1_c2
289                      ->  Parallel Seq Scan on p2_c3_c1
290                      ->  Parallel Seq Scan on p2_c3_c2
291 (27 rows)
292
293 /*+Parallel(p1 8)Parallel(p2 0)*/
294 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
295 LOG:  pg_hint_plan:
296 used hint:
297 Parallel(p1 8 soft)
298 Parallel(p2 0 soft)
299 not used hint:
300 duplication hint:
301 error hint:
302
303                    QUERY PLAN                    
304 -------------------------------------------------
305  Gather
306    Workers Planned: 1
307    ->  Hash Join
308          Hash Cond: (p1.id = p2.id)
309          ->  Append
310                ->  Parallel Seq Scan on p1
311                ->  Parallel Seq Scan on p1_c1
312                ->  Parallel Seq Scan on p1_c2
313                ->  Parallel Seq Scan on p1_c3
314                ->  Parallel Seq Scan on p1_c4
315                ->  Parallel Seq Scan on p1_c1_c1
316                ->  Parallel Seq Scan on p1_c1_c2
317                ->  Parallel Seq Scan on p1_c3_c1
318                ->  Parallel Seq Scan on p1_c3_c2
319          ->  Hash
320                ->  Append
321                      ->  Seq Scan on p2
322                      ->  Seq Scan on p2_c1
323                      ->  Seq Scan on p2_c2
324                      ->  Seq Scan on p2_c3
325                      ->  Seq Scan on p2_c4
326                      ->  Seq Scan on p2_c1_c1
327                      ->  Seq Scan on p2_c1_c2
328                      ->  Seq Scan on p2_c3_c1
329                      ->  Seq Scan on p2_c3_c2
330 (25 rows)
331
332 SET parallel_setup_cost to DEFAULT;
333 SET parallel_tuple_cost to DEFAULT;
334 SET min_parallel_relation_size to DEFAULT;
335 /*+Parallel(p2 8 soft)*/
336 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
337 LOG:  pg_hint_plan:
338 used hint:
339 Parallel(p2 8 soft)
340 not used hint:
341 duplication hint:
342 error hint:
343
344                    QUERY PLAN                    
345 -------------------------------------------------
346  Gather
347    Workers Planned: 1
348    ->  Hash Join
349          Hash Cond: (p2.id = p1.id)
350          ->  Append
351                ->  Parallel Seq Scan on p2
352                ->  Parallel Seq Scan on p2_c1
353                ->  Parallel Seq Scan on p2_c2
354                ->  Parallel Seq Scan on p2_c3
355                ->  Parallel Seq Scan on p2_c4
356                ->  Parallel Seq Scan on p2_c1_c1
357                ->  Parallel Seq Scan on p2_c1_c2
358                ->  Parallel Seq Scan on p2_c3_c1
359                ->  Parallel Seq Scan on p2_c3_c2
360          ->  Hash
361                ->  Append
362                      ->  Seq Scan on p1
363                      ->  Seq Scan on p1_c1
364                      ->  Seq Scan on p1_c2
365                      ->  Seq Scan on p1_c3
366                      ->  Seq Scan on p1_c4
367                      ->  Seq Scan on p1_c1_c1
368                      ->  Seq Scan on p1_c1_c2
369                      ->  Seq Scan on p1_c3_c1
370                      ->  Seq Scan on p1_c3_c2
371 (25 rows)
372
373 /*+Parallel(p2 8 hard)*/
374 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
375 LOG:  pg_hint_plan:
376 used hint:
377 Parallel(p2 8 hard)
378 not used hint:
379 duplication hint:
380 error hint:
381
382                    QUERY PLAN                    
383 -------------------------------------------------
384  Gather
385    Workers Planned: 8
386    ->  Hash Join
387          Hash Cond: (p2.id = p1.id)
388          ->  Append
389                ->  Parallel Seq Scan on p2
390                ->  Parallel Seq Scan on p2_c1
391                ->  Parallel Seq Scan on p2_c2
392                ->  Parallel Seq Scan on p2_c3
393                ->  Parallel Seq Scan on p2_c4
394                ->  Parallel Seq Scan on p2_c1_c1
395                ->  Parallel Seq Scan on p2_c1_c2
396                ->  Parallel Seq Scan on p2_c3_c1
397                ->  Parallel Seq Scan on p2_c3_c2
398          ->  Hash
399                ->  Append
400                      ->  Seq Scan on p1
401                      ->  Seq Scan on p1_c1
402                      ->  Seq Scan on p1_c2
403                      ->  Seq Scan on p1_c3
404                      ->  Seq Scan on p1_c4
405                      ->  Seq Scan on p1_c1_c1
406                      ->  Seq Scan on p1_c1_c2
407                      ->  Seq Scan on p1_c3_c1
408                      ->  Seq Scan on p1_c3_c2
409 (25 rows)
410
411 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
412 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
413 LOG:  pg_hint_plan:
414 used hint:
415 Parallel(p1 5 hard)
416 Parallel(p2 8 hard)
417 not used hint:
418 duplication hint:
419 error hint:
420
421                       QUERY PLAN                       
422 -------------------------------------------------------
423  Hash Join
424    Hash Cond: (p1.id = p2.id)
425    ->  Gather
426          Workers Planned: 5
427          ->  Append
428                ->  Parallel Seq Scan on p1
429                ->  Parallel Seq Scan on p1_c1
430                ->  Parallel Seq Scan on p1_c2
431                ->  Parallel Seq Scan on p1_c3
432                ->  Parallel Seq Scan on p1_c4
433                ->  Parallel Seq Scan on p1_c1_c1
434                ->  Parallel Seq Scan on p1_c1_c2
435                ->  Parallel Seq Scan on p1_c3_c1
436                ->  Parallel Seq Scan on p1_c3_c2
437    ->  Hash
438          ->  Gather
439                Workers Planned: 8
440                ->  Append
441                      ->  Parallel Seq Scan on p2
442                      ->  Parallel Seq Scan on p2_c1
443                      ->  Parallel Seq Scan on p2_c2
444                      ->  Parallel Seq Scan on p2_c3
445                      ->  Parallel Seq Scan on p2_c4
446                      ->  Parallel Seq Scan on p2_c1_c1
447                      ->  Parallel Seq Scan on p2_c1_c2
448                      ->  Parallel Seq Scan on p2_c3_c1
449                      ->  Parallel Seq Scan on p2_c3_c2
450 (27 rows)
451
452 -- Mixture with a scan hint
453 -- p1 can be parallel
454 /*+Parallel(p1 8 hard) IndexScan(p2) */
455 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
456 LOG:  pg_hint_plan:
457 used hint:
458 IndexScan(p2)
459 Parallel(p1 8 hard)
460 not used hint:
461 duplication hint:
462 error hint:
463
464                           QUERY PLAN                          
465 --------------------------------------------------------------
466  Hash Join
467    Hash Cond: (p2.id = p1.id)
468    ->  Append
469          ->  Index Scan using p2_id2_val on p2
470          ->  Index Scan using p2_c1_id2_val on p2_c1
471          ->  Index Scan using p2_c2_id2_val on p2_c2
472          ->  Index Scan using p2_c3_id_val_idx on p2_c3
473          ->  Index Scan using p2_c4_id_val_idx on p2_c4
474          ->  Index Scan using p2_c1_c1_id_val_idx on p2_c1_c1
475          ->  Index Scan using p2_c1_c2_id_val_idx on p2_c1_c2
476          ->  Index Scan using p2_c3_c1_id_val_idx on p2_c3_c1
477          ->  Index Scan using p2_c3_c2_id_val_idx on p2_c3_c2
478    ->  Hash
479          ->  Gather
480                Workers Planned: 8
481                ->  Append
482                      ->  Parallel Seq Scan on p1
483                      ->  Parallel Seq Scan on p1_c1
484                      ->  Parallel Seq Scan on p1_c2
485                      ->  Parallel Seq Scan on p1_c3
486                      ->  Parallel Seq Scan on p1_c4
487                      ->  Parallel Seq Scan on p1_c1_c1
488                      ->  Parallel Seq Scan on p1_c1_c2
489                      ->  Parallel Seq Scan on p1_c3_c1
490                      ->  Parallel Seq Scan on p1_c3_c2
491 (25 rows)
492
493 -- seqscan doesn't harm parallelism
494 /*+Parallel(p1 8 hard) SeqScan(p1) */
495 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
496 LOG:  pg_hint_plan:
497 used hint:
498 SeqScan(p1)
499 Parallel(p1 8 hard)
500 not used hint:
501 duplication hint:
502 error hint:
503
504                    QUERY PLAN                    
505 -------------------------------------------------
506  Gather
507    Workers Planned: 8
508    ->  Hash Join
509          Hash Cond: (p1.id = p2.id)
510          ->  Append
511                ->  Parallel Seq Scan on p1
512                ->  Parallel Seq Scan on p1_c1
513                ->  Parallel Seq Scan on p1_c2
514                ->  Parallel Seq Scan on p1_c3
515                ->  Parallel Seq Scan on p1_c4
516                ->  Parallel Seq Scan on p1_c1_c1
517                ->  Parallel Seq Scan on p1_c1_c2
518                ->  Parallel Seq Scan on p1_c3_c1
519                ->  Parallel Seq Scan on p1_c3_c2
520          ->  Hash
521                ->  Append
522                      ->  Seq Scan on p2
523                      ->  Seq Scan on p2_c1
524                      ->  Seq Scan on p2_c2
525                      ->  Seq Scan on p2_c3
526                      ->  Seq Scan on p2_c4
527                      ->  Seq Scan on p2_c1_c1
528                      ->  Seq Scan on p2_c1_c2
529                      ->  Seq Scan on p2_c3_c1
530                      ->  Seq Scan on p2_c3_c2
531 (25 rows)
532
533 -- we don't have parallel over index scans so far
534 /*+Parallel(p1 8 hard) IndexScan(p1) */
535 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
536 LOG:  pg_hint_plan:
537 used hint:
538 IndexScan(p1)
539 Parallel(p1 8 hard)
540 not used hint:
541 duplication hint:
542 error hint:
543
544                        QUERY PLAN                       
545 --------------------------------------------------------
546  Hash Join
547    Hash Cond: (p1.id = p2.id)
548    ->  Append
549          ->  Index Scan using p1_pkey on p1
550          ->  Index Scan using p1_c1_pkey on p1_c1
551          ->  Index Scan using p1_c2_pkey on p1_c2
552          ->  Index Scan using p1_c3_pkey on p1_c3
553          ->  Index Scan using p1_c4_pkey on p1_c4
554          ->  Index Scan using p1_c1_c1_pkey on p1_c1_c1
555          ->  Index Scan using p1_c1_c2_pkey on p1_c1_c2
556          ->  Index Scan using p1_c3_c1_pkey on p1_c3_c1
557          ->  Index Scan using p1_c3_c2_pkey on p1_c3_c2
558    ->  Hash
559          ->  Append
560                ->  Seq Scan on p2
561                ->  Seq Scan on p2_c1
562                ->  Seq Scan on p2_c2
563                ->  Seq Scan on p2_c3
564                ->  Seq Scan on p2_c4
565                ->  Seq Scan on p2_c1_c1
566                ->  Seq Scan on p2_c1_c2
567                ->  Seq Scan on p2_c3_c1
568                ->  Seq Scan on p2_c3_c2
569 (23 rows)
570
571 -- This hint doesn't turn on parallel, so the Parallel hint is ignored
572 show max_parallel_workers_per_gather;
573  max_parallel_workers_per_gather 
574 ---------------------------------
575  0
576 (1 row)
577
578 /*+Parallel(p1 0 hard) IndexScan(p1) */
579 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
580 LOG:  pg_hint_plan:
581 used hint:
582 IndexScan(p1)
583 not used hint:
584 Parallel(p1 0 hard)
585 duplication hint:
586 error hint:
587
588                        QUERY PLAN                       
589 --------------------------------------------------------
590  Hash Join
591    Hash Cond: (p1.id = p2.id)
592    ->  Append
593          ->  Index Scan using p1_pkey on p1
594          ->  Index Scan using p1_c1_pkey on p1_c1
595          ->  Index Scan using p1_c2_pkey on p1_c2
596          ->  Index Scan using p1_c3_pkey on p1_c3
597          ->  Index Scan using p1_c4_pkey on p1_c4
598          ->  Index Scan using p1_c1_c1_pkey on p1_c1_c1
599          ->  Index Scan using p1_c1_c2_pkey on p1_c1_c2
600          ->  Index Scan using p1_c3_c1_pkey on p1_c3_c1
601          ->  Index Scan using p1_c3_c2_pkey on p1_c3_c2
602    ->  Hash
603          ->  Append
604                ->  Seq Scan on p2
605                ->  Seq Scan on p2_c1
606                ->  Seq Scan on p2_c2
607                ->  Seq Scan on p2_c3
608                ->  Seq Scan on p2_c4
609                ->  Seq Scan on p2_c1_c1
610                ->  Seq Scan on p2_c1_c2
611                ->  Seq Scan on p2_c3_c1
612                ->  Seq Scan on p2_c3_c2
613 (23 rows)
614
615 -- Parallel on UNION
616 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
617          QUERY PLAN         
618 ----------------------------
619  Append
620    ->  Seq Scan on p1
621    ->  Seq Scan on p1_c1
622    ->  Seq Scan on p1_c2
623    ->  Seq Scan on p1_c3
624    ->  Seq Scan on p1_c4
625    ->  Seq Scan on p1_c1_c1
626    ->  Seq Scan on p1_c1_c2
627    ->  Seq Scan on p1_c3_c1
628    ->  Seq Scan on p1_c3_c2
629    ->  Seq Scan on p2
630    ->  Seq Scan on p2_c1
631    ->  Seq Scan on p2_c2
632    ->  Seq Scan on p2_c3
633    ->  Seq Scan on p2_c4
634    ->  Seq Scan on p2_c1_c1
635    ->  Seq Scan on p2_c1_c2
636    ->  Seq Scan on p2_c3_c1
637    ->  Seq Scan on p2_c3_c2
638 (19 rows)
639
640 -- parallel hinting on any relation enables parallel
641 SET parallel_setup_cost to 0;
642 SET parallel_tuple_cost to 0;
643 SET min_parallel_relation_size to 0;
644 SET max_parallel_workers_per_gather to 0;
645 /*+Parallel(p1 8) */
646 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
647 LOG:  pg_hint_plan:
648 used hint:
649 Parallel(p1 8 soft)
650 not used hint:
651 duplication hint:
652 error hint:
653
654                 QUERY PLAN                 
655 -------------------------------------------
656  Gather
657    Workers Planned: 1
658    ->  Append
659          ->  Parallel Seq Scan on p1
660          ->  Parallel Seq Scan on p1_c1
661          ->  Parallel Seq Scan on p1_c2
662          ->  Parallel Seq Scan on p1_c3
663          ->  Parallel Seq Scan on p1_c4
664          ->  Parallel Seq Scan on p1_c1_c1
665          ->  Parallel Seq Scan on p1_c1_c2
666          ->  Parallel Seq Scan on p1_c3_c1
667          ->  Parallel Seq Scan on p1_c3_c2
668          ->  Parallel Seq Scan on p2
669          ->  Parallel Seq Scan on p2_c1
670          ->  Parallel Seq Scan on p2_c2
671          ->  Parallel Seq Scan on p2_c3
672          ->  Parallel Seq Scan on p2_c4
673          ->  Parallel Seq Scan on p2_c1_c1
674          ->  Parallel Seq Scan on p2_c1_c2
675          ->  Parallel Seq Scan on p2_c3_c1
676          ->  Parallel Seq Scan on p2_c3_c2
677 (21 rows)
678
679 -- set hint does the same thing
680 /*+Set(max_parallel_workers_per_gather 1)*/
681 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
682 LOG:  pg_hint_plan:
683 used hint:
684 Set(max_parallel_workers_per_gather 1)
685 not used hint:
686 duplication hint:
687 error hint:
688
689                 QUERY PLAN                 
690 -------------------------------------------
691  Gather
692    Workers Planned: 1
693    ->  Append
694          ->  Parallel Seq Scan on p1
695          ->  Parallel Seq Scan on p1_c1
696          ->  Parallel Seq Scan on p1_c2
697          ->  Parallel Seq Scan on p1_c3
698          ->  Parallel Seq Scan on p1_c4
699          ->  Parallel Seq Scan on p1_c1_c1
700          ->  Parallel Seq Scan on p1_c1_c2
701          ->  Parallel Seq Scan on p1_c3_c1
702          ->  Parallel Seq Scan on p1_c3_c2
703          ->  Parallel Seq Scan on p2
704          ->  Parallel Seq Scan on p2_c1
705          ->  Parallel Seq Scan on p2_c2
706          ->  Parallel Seq Scan on p2_c3
707          ->  Parallel Seq Scan on p2_c4
708          ->  Parallel Seq Scan on p2_c1_c1
709          ->  Parallel Seq Scan on p2_c1_c2
710          ->  Parallel Seq Scan on p2_c3_c1
711          ->  Parallel Seq Scan on p2_c3_c2
712 (21 rows)
713
714 -- applies largest number of workers on merged parallel paths
715 SET parallel_setup_cost to DEFAULT;
716 SET parallel_tuple_cost to DEFAULT;
717 SET min_parallel_relation_size to DEFAULT;
718 SET max_parallel_workers_per_gather to 8;
719 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
720 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
721 LOG:  pg_hint_plan:
722 used hint:
723 Parallel(p1 5 hard)
724 Parallel(p2 6 hard)
725 not used hint:
726 duplication hint:
727 error hint:
728
729                 QUERY PLAN                 
730 -------------------------------------------
731  Gather
732    Workers Planned: 6
733    ->  Append
734          ->  Parallel Seq Scan on p1
735          ->  Parallel Seq Scan on p1_c1
736          ->  Parallel Seq Scan on p1_c2
737          ->  Parallel Seq Scan on p1_c3
738          ->  Parallel Seq Scan on p1_c4
739          ->  Parallel Seq Scan on p1_c1_c1
740          ->  Parallel Seq Scan on p1_c1_c2
741          ->  Parallel Seq Scan on p1_c3_c1
742          ->  Parallel Seq Scan on p1_c3_c2
743          ->  Parallel Seq Scan on p2
744          ->  Parallel Seq Scan on p2_c1
745          ->  Parallel Seq Scan on p2_c2
746          ->  Parallel Seq Scan on p2_c3
747          ->  Parallel Seq Scan on p2_c4
748          ->  Parallel Seq Scan on p2_c1_c1
749          ->  Parallel Seq Scan on p2_c1_c2
750          ->  Parallel Seq Scan on p2_c3_c1
751          ->  Parallel Seq Scan on p2_c3_c2
752 (21 rows)
753
754 -- num of workers of non-hinted relations should be default value
755 SET parallel_setup_cost to 0;
756 SET parallel_tuple_cost to 0;
757 SET min_parallel_relation_size to 0;
758 SET max_parallel_workers_per_gather to 3;
759 SET enable_indexscan to false;
760 /*+Parallel(p1 8 hard) */
761 EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
762 LOG:  pg_hint_plan:
763 used hint:
764 Parallel(p1 8 hard)
765 not used hint:
766 duplication hint:
767 error hint:
768
769                       QUERY PLAN                       
770 -------------------------------------------------------
771  Hash Join
772    Hash Cond: (t1.id = p1.id)
773    ->  Gather
774          Workers Planned: 3
775          ->  Parallel Seq Scan on t1
776    ->  Hash
777          ->  Gather
778                Workers Planned: 8
779                ->  Append
780                      ->  Parallel Seq Scan on p1
781                      ->  Parallel Seq Scan on p1_c1
782                      ->  Parallel Seq Scan on p1_c2
783                      ->  Parallel Seq Scan on p1_c3
784                      ->  Parallel Seq Scan on p1_c4
785                      ->  Parallel Seq Scan on p1_c1_c1
786                      ->  Parallel Seq Scan on p1_c1_c2
787                      ->  Parallel Seq Scan on p1_c3_c1
788                      ->  Parallel Seq Scan on p1_c3_c2
789 (18 rows)
790
791 -- Negative hint
792 SET enable_indexscan to DEFAULT;
793 SET parallel_setup_cost to 0;
794 SET parallel_tuple_cost to 0;
795 SET min_parallel_relation_size to 0;
796 SET max_parallel_workers_per_gather to 5;
797 EXPLAIN (COSTS false) SELECT * FROM p1;
798                 QUERY PLAN                 
799 -------------------------------------------
800  Gather
801    Workers Planned: 1
802    ->  Append
803          ->  Parallel Seq Scan on p1
804          ->  Parallel Seq Scan on p1_c1
805          ->  Parallel Seq Scan on p1_c2
806          ->  Parallel Seq Scan on p1_c3
807          ->  Parallel Seq Scan on p1_c4
808          ->  Parallel Seq Scan on p1_c1_c1
809          ->  Parallel Seq Scan on p1_c1_c2
810          ->  Parallel Seq Scan on p1_c3_c1
811          ->  Parallel Seq Scan on p1_c3_c2
812 (12 rows)
813
814 /*+Parallel(p1 0 hard)*/
815 EXPLAIN (COSTS false) SELECT * FROM p1;
816 LOG:  pg_hint_plan:
817 used hint:
818 Parallel(p1 0 hard)
819 not used hint:
820 duplication hint:
821 error hint:
822
823          QUERY PLAN         
824 ----------------------------
825  Append
826    ->  Seq Scan on p1
827    ->  Seq Scan on p1_c1
828    ->  Seq Scan on p1_c2
829    ->  Seq Scan on p1_c3
830    ->  Seq Scan on p1_c4
831    ->  Seq Scan on p1_c1_c1
832    ->  Seq Scan on p1_c1_c2
833    ->  Seq Scan on p1_c3_c1
834    ->  Seq Scan on p1_c3_c2
835 (10 rows)
836
837 -- Errors
838 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
839    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
840 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
841 INFO:  pg_hint_plan: hint syntax error at or near "100x"
842 DETAIL:  number of workers must be a number: Parallel
843 INFO:  pg_hint_plan: hint syntax error at or near "-1000"
844 DETAIL:  number of workers must be positive: Parallel
845 INFO:  pg_hint_plan: hint syntax error at or near "1000000"
846 DETAIL:  number of workers = 1000000 is larger than max_worker_processes(8): Parallel
847 INFO:  pg_hint_plan: hint syntax error at or near "hoge"
848 DETAIL:  enforcement must be soft or hard: Parallel
849 INFO:  pg_hint_plan: hint syntax error at or near ")"
850 DETAIL:  wrong number of arguments (1): Parallel
851 INFO:  pg_hint_plan: hint syntax error at or near ")"
852 DETAIL:  wrong number of arguments (4): Parallel
853 LOG:  pg_hint_plan:
854 used hint:
855 not used hint:
856 duplication hint:
857 error hint:
858 Parallel(p1 100x hard)
859 Parallel(p1 -1000 hard)
860 Parallel(p1 1000000 hard)
861 Parallel(p1 8 soft)
862 Parallel()
863 Parallel()
864
865                 QUERY PLAN                 
866 -------------------------------------------
867  Gather
868    Workers Planned: 1
869    ->  Append
870          ->  Parallel Seq Scan on p1
871          ->  Parallel Seq Scan on p1_c1
872          ->  Parallel Seq Scan on p1_c2
873          ->  Parallel Seq Scan on p1_c3
874          ->  Parallel Seq Scan on p1_c4
875          ->  Parallel Seq Scan on p1_c1_c1
876          ->  Parallel Seq Scan on p1_c1_c2
877          ->  Parallel Seq Scan on p1_c3_c1
878          ->  Parallel Seq Scan on p1_c3_c2
879          ->  Parallel Seq Scan on p2
880          ->  Parallel Seq Scan on p2_c1
881          ->  Parallel Seq Scan on p2_c2
882          ->  Parallel Seq Scan on p2_c3
883          ->  Parallel Seq Scan on p2_c4
884          ->  Parallel Seq Scan on p2_c1_c1
885          ->  Parallel Seq Scan on p2_c1_c2
886          ->  Parallel Seq Scan on p2_c3_c1
887          ->  Parallel Seq Scan on p2_c3_c2
888 (21 rows)
889
890 -- Hints on unhintable relations are just ignored
891 /*+Parallel(p1 5 hard) Parallel(s1 3 hard) IndexScan(ft1) SeqScan(cte1)
892   TidScan(fs1) IndexScan(t) IndexScan(*VALUES*) */
893 EXPLAIN (COSTS false) SELECT id FROM p1_c1_c1 as s1 TABLESAMPLE SYSTEM(10)
894  UNION ALL
895 SELECT id FROM ft1
896  UNION ALL
897 (WITH cte1 AS (SELECT id FROM p1 WHERE id % 2 = 0) SELECT id FROM cte1)
898  UNION ALL
899 SELECT userid FROM pg_stat_statements fs1
900  UNION ALL
901 SELECT x FROM (VALUES (1), (2), (3)) t(x);
902 LOG:  pg_hint_plan:
903 used hint:
904 Parallel(p1 5 hard)
905 not used hint:
906 IndexScan(*VALUES*)
907 SeqScan(cte1)
908 TidScan(fs1)
909 IndexScan(ft1)
910 IndexScan(t)
911 Parallel(s1 3 hard)
912 duplication hint:
913 error hint:
914
915                                           QUERY PLAN                                           
916 -----------------------------------------------------------------------------------------------
917  Append
918    ->  Result
919          ->  Append
920                ->  Sample Scan on p1_c1_c1 s1
921                      Sampling: system ('10'::real)
922                ->  Foreign Scan on ft1
923                      Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv
924                ->  CTE Scan on cte1
925                      CTE cte1
926                        ->  Gather
927                              Workers Planned: 5
928                              ->  Append
929                                    ->  Parallel Seq Scan on p1
930                                          Filter: ((id % 2) = 0)
931                                    ->  Parallel Seq Scan on p1_c1
932                                          Filter: ((id % 2) = 0)
933                                    ->  Parallel Seq Scan on p1_c2
934                                          Filter: ((id % 2) = 0)
935                                    ->  Parallel Seq Scan on p1_c3
936                                          Filter: ((id % 2) = 0)
937                                    ->  Parallel Seq Scan on p1_c4
938                                          Filter: ((id % 2) = 0)
939                                    ->  Parallel Seq Scan on p1_c1_c1
940                                          Filter: ((id % 2) = 0)
941                                    ->  Parallel Seq Scan on p1_c1_c2
942                                          Filter: ((id % 2) = 0)
943                                    ->  Parallel Seq Scan on p1_c3_c1
944                                          Filter: ((id % 2) = 0)
945                                    ->  Parallel Seq Scan on p1_c3_c2
946                                          Filter: ((id % 2) = 0)
947    ->  Function Scan on pg_stat_statements
948    ->  Subquery Scan on "*SELECT* 5"
949          ->  Values Scan on "*VALUES*"
950 (33 rows)
951
952 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
953 SELECT pg_reload_conf();
954  pg_reload_conf 
955 ----------------
956  t
957 (1 row)
958