OSDN Git Service

f309235e43bfc3806b3c28bbfd93d20ca6f242c7
[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 /*+Parallel(t1 4 hard) */ /* to be gather merge*/
30 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ORDER BY s1.t1.c1 LIMIT 4;
31
32 -- Queries on inheritance tables
33 SET parallel_setup_cost to 0;
34 SET parallel_tuple_cost to 0;
35 SET min_parallel_table_scan_size to 0;
36 SET min_parallel_index_scan_size to 0;
37 SET enable_parallel_append to false;
38 /*+Parallel(p1 8)*/
39 EXPLAIN (COSTS false) SELECT * FROM p1;
40 SET enable_parallel_append to true;
41 /*+Parallel(p1 8)*/
42 EXPLAIN (COSTS false) SELECT * FROM p1;
43
44 SET parallel_setup_cost to DEFAULT;
45 SET parallel_tuple_cost to DEFAULT;
46 SET min_parallel_table_scan_size to DEFAULT;
47 SET min_parallel_index_scan_size to DEFAULT;
48
49 SET enable_parallel_append to false;
50 /*+Parallel(p1 8 hard)*/
51 EXPLAIN (COSTS false) SELECT * FROM p1;
52
53 SET enable_parallel_append to true;
54 /*+Parallel(p1 8 hard)*/
55 EXPLAIN (COSTS false) SELECT * FROM p1;
56
57 -- hinting on children doesn't work (changed as of pg_hint_plan 10)
58 SET enable_parallel_append to false;
59 /*+Parallel(p1_c1 8 hard)*/
60 EXPLAIN (COSTS false) SELECT * FROM p1;
61 SET enable_parallel_append to true;
62 /*+Parallel(p1_c1 8 hard)*/
63 EXPLAIN (COSTS false) SELECT * FROM p1;
64
65
66 -- Joins
67 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
68
69 /*+Parallel(p1_c1_c1 8 hard)*/
70 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
71
72 SET parallel_setup_cost to 0;
73 SET parallel_tuple_cost to 0;
74 SET min_parallel_table_scan_size to 0;
75 SET min_parallel_index_scan_size to 0;
76
77 /*+Parallel(p1_c1_c1 8 soft) Parallel(p2_c1_c1 0)*/
78 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
79
80 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 0)*/
81 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
82
83 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 8 hard)*/
84 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
85
86
87 -- Joins on inheritance tables
88 SET parallel_setup_cost to 0;
89 SET parallel_tuple_cost to 0;
90 SET min_parallel_table_scan_size to 0;
91 SET min_parallel_index_scan_size to 0;
92 SET enable_parallel_append to false;
93 /*+Parallel(p1 8)*/
94 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
95 SET enable_parallel_append to true;
96 /*+Parallel(p1 8)*/
97 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
98
99 SET enable_parallel_append to false;
100 /*+Parallel(p1 8)Parallel(p2 0)*/
101 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
102 SET enable_parallel_append to true;
103 /*+Parallel(p1 8)Parallel(p2 0)*/
104 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
105
106 SET parallel_setup_cost to DEFAULT;
107 SET parallel_tuple_cost to DEFAULT;
108 SET min_parallel_table_scan_size to DEFAULT;
109 SET min_parallel_index_scan_size to DEFAULT;
110
111 /*+Parallel(p2 8 soft)*/
112 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
113
114 /*+Parallel(p2 8 hard)*/
115 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
116
117 -- Number of workers results to the largest number
118 SET enable_parallel_append to false;
119 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
120 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
121 SET enable_parallel_append to true;
122 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
123 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
124
125
126 -- Mixture with scan hints
127 -- p1 can be parallel
128 SET enable_parallel_append to false;
129 /*+Parallel(p1 8 hard) IndexScan(p2) */
130 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
131 SET enable_parallel_append to true;
132 /*+Parallel(p1 8 hard) IndexScan(p2) */
133 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
134
135 -- Parallel sequential scan
136 SET enable_parallel_append to false;
137 /*+Parallel(p1 8 hard) SeqScan(p1) */
138 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
139 SET enable_parallel_append to true;
140 /*+Parallel(p1 8 hard) SeqScan(p1) */
141 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
142
143 -- Parallel index scan
144 SET enable_parallel_append to false;
145 /*+Parallel(p1 8 hard) IndexScan(p1) */
146 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
147 SET enable_parallel_append to true;
148 /*+Parallel(p1 8 hard) IndexScan(p1) */
149 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
150
151 -- This hint doesn't turn on parallel, so the Parallel hint is ignored
152 set max_parallel_workers_per_gather TO 0;
153 /*+Parallel(p1 0 hard) IndexScan(p1) */
154 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
155
156
157 -- Parallel on UNION
158 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
159
160 -- parallel hinting on any relation enables parallel
161 SET parallel_setup_cost to 0;
162 SET parallel_tuple_cost to 0;
163 SET min_parallel_table_scan_size to 0;
164 SET min_parallel_index_scan_size to 0;
165 SET max_parallel_workers_per_gather to 0;
166
167 /*+Parallel(p1 8) */
168 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
169
170 -- set hint has the same effect
171 /*+Set(max_parallel_workers_per_gather 1)*/
172 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
173
174 -- applies largest number of workers on merged parallel paths
175 SET parallel_setup_cost to DEFAULT;
176 SET parallel_tuple_cost to DEFAULT;
177 SET min_parallel_table_scan_size to DEFAULT;
178 SET min_parallel_index_scan_size to DEFAULT;
179 SET max_parallel_workers_per_gather to 8;
180 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
181 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
182
183
184 -- Negative hints
185 SET enable_indexscan to DEFAULT;
186 SET parallel_setup_cost to 0;
187 SET parallel_tuple_cost to 0;
188 SET min_parallel_table_scan_size to 0;
189 SET min_parallel_index_scan_size to 0;
190 SET max_parallel_workers_per_gather to 5;
191 EXPLAIN (COSTS false) SELECT * FROM p1;
192
193 SET enable_parallel_append to false;
194 /*+Parallel(p1 0 hard)*/
195 EXPLAIN (COSTS false) SELECT * FROM p1;
196 SET enable_parallel_append to true;
197 /*+Parallel(p1 0 hard)*/
198 EXPLAIN (COSTS false) SELECT * FROM p1;
199
200 -- Errors
201 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
202    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
203 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
204
205 -- Hints on unhintable relations are just ignored
206 /*+Parallel(p1 5 hard) Parallel(s1 3 hard) IndexScan(ft1) SeqScan(cte1)
207   TidScan(fs1) IndexScan(t) IndexScan(*VALUES*) */
208 EXPLAIN (COSTS false) SELECT id FROM p1_c1_c1 as s1 TABLESAMPLE SYSTEM(10)
209  UNION ALL
210 SELECT id FROM ft1
211  UNION ALL
212 (WITH cte1 AS (SELECT id FROM p1 WHERE id % 2 = 0) SELECT id FROM cte1)
213  UNION ALL
214 SELECT userid FROM pg_stat_statements fs1
215  UNION ALL
216 SELECT x FROM (VALUES (1), (2), (3)) t(x);
217
218
219 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
220 SELECT pg_reload_conf();