OSDN Git Service

Support PostgreSQL 10 beta 1 step 2/2
[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 -- Parallel sequential scan
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 -- Parallel index scan
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  Gather
551    Workers Planned: 8
552    ->  Hash Join
553          Hash Cond: (p1.id = p2.id)
554          ->  Append
555                ->  Parallel Index Scan using p1_pkey on p1
556                ->  Parallel Index Scan using p1_c1_pkey on p1_c1
557                ->  Parallel Index Scan using p1_c2_pkey on p1_c2
558                ->  Parallel Index Scan using p1_c3_pkey on p1_c3
559                ->  Parallel Index Scan using p1_c4_pkey on p1_c4
560                ->  Parallel Index Scan using p1_c1_c1_pkey on p1_c1_c1
561                ->  Parallel Index Scan using p1_c1_c2_pkey on p1_c1_c2
562                ->  Parallel Index Scan using p1_c3_c1_pkey on p1_c3_c1
563                ->  Parallel Index Scan using p1_c3_c2_pkey on p1_c3_c2
564          ->  Hash
565                ->  Append
566                      ->  Seq Scan on p2
567                      ->  Seq Scan on p2_c1
568                      ->  Seq Scan on p2_c2
569                      ->  Seq Scan on p2_c3
570                      ->  Seq Scan on p2_c4
571                      ->  Seq Scan on p2_c1_c1
572                      ->  Seq Scan on p2_c1_c2
573                      ->  Seq Scan on p2_c3_c1
574                      ->  Seq Scan on p2_c3_c2
575 (25 rows)
576
577 -- This hint doesn't turn on parallel, so the Parallel hint is ignored
578 set max_parallel_workers_per_gather TO 0;
579 /*+Parallel(p1 0 hard) IndexScan(p1) */
580 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
581 LOG:  pg_hint_plan:
582 used hint:
583 IndexScan(p1)
584 not used hint:
585 Parallel(p1 0 hard)
586 duplication hint:
587 error hint:
588
589                        QUERY PLAN                       
590 --------------------------------------------------------
591  Hash Join
592    Hash Cond: (p1.id = p2.id)
593    ->  Append
594          ->  Index Scan using p1_pkey on p1
595          ->  Index Scan using p1_c1_pkey on p1_c1
596          ->  Index Scan using p1_c2_pkey on p1_c2
597          ->  Index Scan using p1_c3_pkey on p1_c3
598          ->  Index Scan using p1_c4_pkey on p1_c4
599          ->  Index Scan using p1_c1_c1_pkey on p1_c1_c1
600          ->  Index Scan using p1_c1_c2_pkey on p1_c1_c2
601          ->  Index Scan using p1_c3_c1_pkey on p1_c3_c1
602          ->  Index Scan using p1_c3_c2_pkey on p1_c3_c2
603    ->  Hash
604          ->  Append
605                ->  Seq Scan on p2
606                ->  Seq Scan on p2_c1
607                ->  Seq Scan on p2_c2
608                ->  Seq Scan on p2_c3
609                ->  Seq Scan on p2_c4
610                ->  Seq Scan on p2_c1_c1
611                ->  Seq Scan on p2_c1_c2
612                ->  Seq Scan on p2_c3_c1
613                ->  Seq Scan on p2_c3_c2
614 (23 rows)
615
616 -- Parallel on UNION
617 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
618          QUERY PLAN         
619 ----------------------------
620  Append
621    ->  Seq Scan on p1
622    ->  Seq Scan on p1_c1
623    ->  Seq Scan on p1_c2
624    ->  Seq Scan on p1_c3
625    ->  Seq Scan on p1_c4
626    ->  Seq Scan on p1_c1_c1
627    ->  Seq Scan on p1_c1_c2
628    ->  Seq Scan on p1_c3_c1
629    ->  Seq Scan on p1_c3_c2
630    ->  Seq Scan on p2
631    ->  Seq Scan on p2_c1
632    ->  Seq Scan on p2_c2
633    ->  Seq Scan on p2_c3
634    ->  Seq Scan on p2_c4
635    ->  Seq Scan on p2_c1_c1
636    ->  Seq Scan on p2_c1_c2
637    ->  Seq Scan on p2_c3_c1
638    ->  Seq Scan on p2_c3_c2
639 (19 rows)
640
641 -- parallel hinting on any relation enables parallel
642 SET parallel_setup_cost to 0;
643 SET parallel_tuple_cost to 0;
644 SET min_parallel_table_scan_size to 0;
645 SET min_parallel_index_scan_size to 0;
646 SET max_parallel_workers_per_gather to 0;
647 /*+Parallel(p1 8) */
648 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
649 LOG:  pg_hint_plan:
650 used hint:
651 Parallel(p1 8 soft)
652 not used hint:
653 duplication hint:
654 error hint:
655
656                 QUERY PLAN                 
657 -------------------------------------------
658  Gather
659    Workers Planned: 1
660    ->  Append
661          ->  Parallel Seq Scan on p1
662          ->  Parallel Seq Scan on p1_c1
663          ->  Parallel Seq Scan on p1_c2
664          ->  Parallel Seq Scan on p1_c3
665          ->  Parallel Seq Scan on p1_c4
666          ->  Parallel Seq Scan on p1_c1_c1
667          ->  Parallel Seq Scan on p1_c1_c2
668          ->  Parallel Seq Scan on p1_c3_c1
669          ->  Parallel Seq Scan on p1_c3_c2
670          ->  Parallel Seq Scan on p2
671          ->  Parallel Seq Scan on p2_c1
672          ->  Parallel Seq Scan on p2_c2
673          ->  Parallel Seq Scan on p2_c3
674          ->  Parallel Seq Scan on p2_c4
675          ->  Parallel Seq Scan on p2_c1_c1
676          ->  Parallel Seq Scan on p2_c1_c2
677          ->  Parallel Seq Scan on p2_c3_c1
678          ->  Parallel Seq Scan on p2_c3_c2
679 (21 rows)
680
681 -- set hint does the same thing
682 /*+Set(max_parallel_workers_per_gather 1)*/
683 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
684 LOG:  pg_hint_plan:
685 used hint:
686 Set(max_parallel_workers_per_gather 1)
687 not used hint:
688 duplication hint:
689 error hint:
690
691                 QUERY PLAN                 
692 -------------------------------------------
693  Gather
694    Workers Planned: 1
695    ->  Append
696          ->  Parallel Seq Scan on p1
697          ->  Parallel Seq Scan on p1_c1
698          ->  Parallel Seq Scan on p1_c2
699          ->  Parallel Seq Scan on p1_c3
700          ->  Parallel Seq Scan on p1_c4
701          ->  Parallel Seq Scan on p1_c1_c1
702          ->  Parallel Seq Scan on p1_c1_c2
703          ->  Parallel Seq Scan on p1_c3_c1
704          ->  Parallel Seq Scan on p1_c3_c2
705          ->  Parallel Seq Scan on p2
706          ->  Parallel Seq Scan on p2_c1
707          ->  Parallel Seq Scan on p2_c2
708          ->  Parallel Seq Scan on p2_c3
709          ->  Parallel Seq Scan on p2_c4
710          ->  Parallel Seq Scan on p2_c1_c1
711          ->  Parallel Seq Scan on p2_c1_c2
712          ->  Parallel Seq Scan on p2_c3_c1
713          ->  Parallel Seq Scan on p2_c3_c2
714 (21 rows)
715
716 -- applies largest number of workers on merged parallel paths
717 SET parallel_setup_cost to DEFAULT;
718 SET parallel_tuple_cost to DEFAULT;
719 SET min_parallel_table_scan_size to DEFAULT;
720 SET min_parallel_index_scan_size to DEFAULT;
721 SET max_parallel_workers_per_gather to 8;
722 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
723 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
724 LOG:  pg_hint_plan:
725 used hint:
726 Parallel(p1 5 hard)
727 Parallel(p2 6 hard)
728 not used hint:
729 duplication hint:
730 error hint:
731
732                 QUERY PLAN                 
733 -------------------------------------------
734  Gather
735    Workers Planned: 6
736    ->  Append
737          ->  Parallel Seq Scan on p1
738          ->  Parallel Seq Scan on p1_c1
739          ->  Parallel Seq Scan on p1_c2
740          ->  Parallel Seq Scan on p1_c3
741          ->  Parallel Seq Scan on p1_c4
742          ->  Parallel Seq Scan on p1_c1_c1
743          ->  Parallel Seq Scan on p1_c1_c2
744          ->  Parallel Seq Scan on p1_c3_c1
745          ->  Parallel Seq Scan on p1_c3_c2
746          ->  Parallel Seq Scan on p2
747          ->  Parallel Seq Scan on p2_c1
748          ->  Parallel Seq Scan on p2_c2
749          ->  Parallel Seq Scan on p2_c3
750          ->  Parallel Seq Scan on p2_c4
751          ->  Parallel Seq Scan on p2_c1_c1
752          ->  Parallel Seq Scan on p2_c1_c2
753          ->  Parallel Seq Scan on p2_c3_c1
754          ->  Parallel Seq Scan on p2_c3_c2
755 (21 rows)
756
757 -- num of workers of non-hinted relations should be default value
758 SET parallel_setup_cost to 0;
759 SET parallel_tuple_cost to 0;
760 SET min_parallel_table_scan_size to 0;
761 SET min_parallel_index_scan_size to 0;
762 SET max_parallel_workers_per_gather to 3;
763 SET enable_indexscan to false;
764 /*+Parallel(p1 8 hard) */
765 EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
766 LOG:  pg_hint_plan:
767 used hint:
768 Parallel(p1 8 hard)
769 not used hint:
770 duplication hint:
771 error hint:
772
773                       QUERY PLAN                       
774 -------------------------------------------------------
775  Hash Join
776    Hash Cond: (t1.id = p1.id)
777    ->  Gather
778          Workers Planned: 3
779          ->  Parallel Seq Scan on t1
780    ->  Hash
781          ->  Gather
782                Workers Planned: 8
783                ->  Append
784                      ->  Parallel Seq Scan on p1
785                      ->  Parallel Seq Scan on p1_c1
786                      ->  Parallel Seq Scan on p1_c2
787                      ->  Parallel Seq Scan on p1_c3
788                      ->  Parallel Seq Scan on p1_c4
789                      ->  Parallel Seq Scan on p1_c1_c1
790                      ->  Parallel Seq Scan on p1_c1_c2
791                      ->  Parallel Seq Scan on p1_c3_c1
792                      ->  Parallel Seq Scan on p1_c3_c2
793 (18 rows)
794
795 -- Negative hint
796 SET enable_indexscan to DEFAULT;
797 SET parallel_setup_cost to 0;
798 SET parallel_tuple_cost to 0;
799 SET min_parallel_table_scan_size to 0;
800 SET min_parallel_index_scan_size to 0;
801 SET max_parallel_workers_per_gather to 5;
802 EXPLAIN (COSTS false) SELECT * FROM p1;
803                 QUERY PLAN                 
804 -------------------------------------------
805  Gather
806    Workers Planned: 1
807    ->  Append
808          ->  Parallel Seq Scan on p1
809          ->  Parallel Seq Scan on p1_c1
810          ->  Parallel Seq Scan on p1_c2
811          ->  Parallel Seq Scan on p1_c3
812          ->  Parallel Seq Scan on p1_c4
813          ->  Parallel Seq Scan on p1_c1_c1
814          ->  Parallel Seq Scan on p1_c1_c2
815          ->  Parallel Seq Scan on p1_c3_c1
816          ->  Parallel Seq Scan on p1_c3_c2
817 (12 rows)
818
819 /*+Parallel(p1 0 hard)*/
820 EXPLAIN (COSTS false) SELECT * FROM p1;
821 LOG:  pg_hint_plan:
822 used hint:
823 Parallel(p1 0 hard)
824 not used hint:
825 duplication hint:
826 error hint:
827
828          QUERY PLAN         
829 ----------------------------
830  Append
831    ->  Seq Scan on p1
832    ->  Seq Scan on p1_c1
833    ->  Seq Scan on p1_c2
834    ->  Seq Scan on p1_c3
835    ->  Seq Scan on p1_c4
836    ->  Seq Scan on p1_c1_c1
837    ->  Seq Scan on p1_c1_c2
838    ->  Seq Scan on p1_c3_c1
839    ->  Seq Scan on p1_c3_c2
840 (10 rows)
841
842 -- Errors
843 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
844    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
845 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
846 INFO:  pg_hint_plan: hint syntax error at or near "100x"
847 DETAIL:  number of workers must be a number: Parallel
848 INFO:  pg_hint_plan: hint syntax error at or near "-1000"
849 DETAIL:  number of workers must be positive: Parallel
850 INFO:  pg_hint_plan: hint syntax error at or near "1000000"
851 DETAIL:  number of workers = 1000000 is larger than max_worker_processes(8): Parallel
852 INFO:  pg_hint_plan: hint syntax error at or near "hoge"
853 DETAIL:  enforcement must be soft or hard: Parallel
854 INFO:  pg_hint_plan: hint syntax error at or near ")"
855 DETAIL:  wrong number of arguments (1): Parallel
856 INFO:  pg_hint_plan: hint syntax error at or near ")"
857 DETAIL:  wrong number of arguments (4): Parallel
858 LOG:  pg_hint_plan:
859 used hint:
860 not used hint:
861 duplication hint:
862 error hint:
863 Parallel(p1 100x hard)
864 Parallel(p1 -1000 hard)
865 Parallel(p1 1000000 hard)
866 Parallel(p1 8 soft)
867 Parallel()
868 Parallel()
869
870                 QUERY PLAN                 
871 -------------------------------------------
872  Gather
873    Workers Planned: 1
874    ->  Append
875          ->  Parallel Seq Scan on p1
876          ->  Parallel Seq Scan on p1_c1
877          ->  Parallel Seq Scan on p1_c2
878          ->  Parallel Seq Scan on p1_c3
879          ->  Parallel Seq Scan on p1_c4
880          ->  Parallel Seq Scan on p1_c1_c1
881          ->  Parallel Seq Scan on p1_c1_c2
882          ->  Parallel Seq Scan on p1_c3_c1
883          ->  Parallel Seq Scan on p1_c3_c2
884          ->  Parallel Seq Scan on p2
885          ->  Parallel Seq Scan on p2_c1
886          ->  Parallel Seq Scan on p2_c2
887          ->  Parallel Seq Scan on p2_c3
888          ->  Parallel Seq Scan on p2_c4
889          ->  Parallel Seq Scan on p2_c1_c1
890          ->  Parallel Seq Scan on p2_c1_c2
891          ->  Parallel Seq Scan on p2_c3_c1
892          ->  Parallel Seq Scan on p2_c3_c2
893 (21 rows)
894
895 -- Hints on unhintable relations are just ignored
896 /*+Parallel(p1 5 hard) Parallel(s1 3 hard) IndexScan(ft1) SeqScan(cte1)
897   TidScan(fs1) IndexScan(t) IndexScan(*VALUES*) */
898 EXPLAIN (COSTS false) SELECT id FROM p1_c1_c1 as s1 TABLESAMPLE SYSTEM(10)
899  UNION ALL
900 SELECT id FROM ft1
901  UNION ALL
902 (WITH cte1 AS (SELECT id FROM p1 WHERE id % 2 = 0) SELECT id FROM cte1)
903  UNION ALL
904 SELECT userid FROM pg_stat_statements fs1
905  UNION ALL
906 SELECT x FROM (VALUES (1), (2), (3)) t(x);
907 LOG:  pg_hint_plan:
908 used hint:
909 Parallel(p1 5 hard)
910 not used hint:
911 IndexScan(*VALUES*)
912 SeqScan(cte1)
913 TidScan(fs1)
914 IndexScan(ft1)
915 IndexScan(t)
916 Parallel(s1 3 hard)
917 duplication hint:
918 error hint:
919
920                                           QUERY PLAN                                           
921 -----------------------------------------------------------------------------------------------
922  Append
923    ->  Result
924          ->  Append
925                ->  Sample Scan on p1_c1_c1 s1
926                      Sampling: system ('10'::real)
927                ->  Foreign Scan on ft1
928                      Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv
929                ->  CTE Scan on cte1
930                      CTE cte1
931                        ->  Gather
932                              Workers Planned: 5
933                              ->  Append
934                                    ->  Parallel Seq Scan on p1
935                                          Filter: ((id % 2) = 0)
936                                    ->  Parallel Seq Scan on p1_c1
937                                          Filter: ((id % 2) = 0)
938                                    ->  Parallel Seq Scan on p1_c2
939                                          Filter: ((id % 2) = 0)
940                                    ->  Parallel Seq Scan on p1_c3
941                                          Filter: ((id % 2) = 0)
942                                    ->  Parallel Seq Scan on p1_c4
943                                          Filter: ((id % 2) = 0)
944                                    ->  Parallel Seq Scan on p1_c1_c1
945                                          Filter: ((id % 2) = 0)
946                                    ->  Parallel Seq Scan on p1_c1_c2
947                                          Filter: ((id % 2) = 0)
948                                    ->  Parallel Seq Scan on p1_c3_c1
949                                          Filter: ((id % 2) = 0)
950                                    ->  Parallel Seq Scan on p1_c3_c2
951                                          Filter: ((id % 2) = 0)
952    ->  Function Scan on pg_stat_statements
953    ->  Subquery Scan on "*SELECT* 5"
954          ->  Values Scan on "*VALUES*"
955 (33 rows)
956
957 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
958 SELECT pg_reload_conf();
959  pg_reload_conf 
960 ----------------
961  t
962 (1 row)
963