OSDN Git Service

Support PostgreSQL 10 beta 1 step 2/2
[pghintplan/pg_hint_plan.git] / sql / ut-W.sql
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
7
8 CREATE TABLE s1.tl (a int);
9 INSERT INTO s1.tl (SELECT a FROM generate_series(0, 100000) a);
10
11 -- Queries on ordinary tables with default setting
12 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
13
14 SET parallel_setup_cost to 0;
15 SET parallel_tuple_cost to 0;
16 SET min_parallel_table_scan_size to 0;
17 SET min_parallel_index_scan_size to 0;
18 SET max_parallel_workers_per_gather to DEFAULT;
19
20 /*+Parallel(t1 8)*/
21 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
22
23 /*+Parallel(t1 8 soft)*/
24 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
25
26 /*+Parallel(t1 8 hard)*/
27 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
28
29 -- Queries on inheritance tables
30 SET parallel_setup_cost to 0;
31 SET parallel_tuple_cost to 0;
32 SET min_parallel_table_scan_size to 0;
33 SET min_parallel_index_scan_size to 0;
34 /*+Parallel(p1 8)*/
35 EXPLAIN (COSTS false) SELECT * FROM p1;
36 SET parallel_setup_cost to DEFAULT;
37 SET parallel_tuple_cost to DEFAULT;
38 SET min_parallel_table_scan_size to DEFAULT;
39 SET min_parallel_index_scan_size to DEFAULT;
40
41 /*+Parallel(p1 8 hard)*/
42 EXPLAIN (COSTS false) SELECT * FROM p1;
43
44 -- hinting on children makes the whole inheritance parallel
45 /*+Parallel(p1_c1 8 hard)*/
46 EXPLAIN (COSTS false) SELECT * FROM p1;
47
48
49 -- Joins
50 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
51
52 /*+Parallel(p1_c1_c1 8 hard)*/
53 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
54
55 SET parallel_setup_cost to 0;
56 SET parallel_tuple_cost to 0;
57 SET min_parallel_table_scan_size to 0;
58 SET min_parallel_index_scan_size to 0;
59
60 /*+Parallel(p1_c1_c1 8 soft) Parallel(p2_c1_c1 0)*/
61 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
62
63 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 0)*/
64 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
65
66 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 8 hard)*/
67 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
68
69
70 -- Joins on inheritance tables
71 SET parallel_setup_cost to 0;
72 SET parallel_tuple_cost to 0;
73 SET min_parallel_table_scan_size to 0;
74 SET min_parallel_index_scan_size to 0;
75 /*+Parallel(p1 8)*/
76 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
77
78 /*+Parallel(p1 8)Parallel(p2 0)*/
79 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
80
81 SET parallel_setup_cost to DEFAULT;
82 SET parallel_tuple_cost to DEFAULT;
83 SET min_parallel_table_scan_size to DEFAULT;
84 SET min_parallel_index_scan_size to DEFAULT;
85
86 /*+Parallel(p2 8 soft)*/
87 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
88
89 /*+Parallel(p2 8 hard)*/
90 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
91
92 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
93 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
94
95
96 -- Mixture with a scan hint
97 -- p1 can be parallel
98 /*+Parallel(p1 8 hard) IndexScan(p2) */
99 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
100
101 -- Parallel sequential scan
102 /*+Parallel(p1 8 hard) SeqScan(p1) */
103 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
104
105 -- Parallel index scan
106 /*+Parallel(p1 8 hard) IndexScan(p1) */
107 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
108
109 -- This hint doesn't turn on parallel, so the Parallel hint is ignored
110 set max_parallel_workers_per_gather TO 0;
111 /*+Parallel(p1 0 hard) IndexScan(p1) */
112 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
113
114
115 -- Parallel on UNION
116 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
117
118 -- parallel hinting on any relation enables parallel
119 SET parallel_setup_cost to 0;
120 SET parallel_tuple_cost to 0;
121 SET min_parallel_table_scan_size to 0;
122 SET min_parallel_index_scan_size to 0;
123 SET max_parallel_workers_per_gather to 0;
124
125 /*+Parallel(p1 8) */
126 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
127
128 -- set hint does the same thing
129 /*+Set(max_parallel_workers_per_gather 1)*/
130 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
131
132 -- applies largest number of workers on merged parallel paths
133 SET parallel_setup_cost to DEFAULT;
134 SET parallel_tuple_cost to DEFAULT;
135 SET min_parallel_table_scan_size to DEFAULT;
136 SET min_parallel_index_scan_size to DEFAULT;
137 SET max_parallel_workers_per_gather to 8;
138 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
139 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
140
141
142 -- num of workers of non-hinted relations should be default value
143 SET parallel_setup_cost to 0;
144 SET parallel_tuple_cost to 0;
145 SET min_parallel_table_scan_size to 0;
146 SET min_parallel_index_scan_size to 0;
147 SET max_parallel_workers_per_gather to 3;
148 SET enable_indexscan to false;
149
150 /*+Parallel(p1 8 hard) */
151 EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
152
153 -- Negative hint
154 SET enable_indexscan to DEFAULT;
155 SET parallel_setup_cost to 0;
156 SET parallel_tuple_cost to 0;
157 SET min_parallel_table_scan_size to 0;
158 SET min_parallel_index_scan_size to 0;
159 SET max_parallel_workers_per_gather to 5;
160 EXPLAIN (COSTS false) SELECT * FROM p1;
161
162 /*+Parallel(p1 0 hard)*/
163 EXPLAIN (COSTS false) SELECT * FROM p1;
164
165 -- Errors
166 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
167    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
168 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
169
170 -- Hints on unhintable relations are just ignored
171 /*+Parallel(p1 5 hard) Parallel(s1 3 hard) IndexScan(ft1) SeqScan(cte1)
172   TidScan(fs1) IndexScan(t) IndexScan(*VALUES*) */
173 EXPLAIN (COSTS false) SELECT id FROM p1_c1_c1 as s1 TABLESAMPLE SYSTEM(10)
174  UNION ALL
175 SELECT id FROM ft1
176  UNION ALL
177 (WITH cte1 AS (SELECT id FROM p1 WHERE id % 2 = 0) SELECT id FROM cte1)
178  UNION ALL
179 SELECT userid FROM pg_stat_statements fs1
180  UNION ALL
181 SELECT x FROM (VALUES (1), (2), (3)) t(x);
182
183
184 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
185 SELECT pg_reload_conf();