OSDN Git Service

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