@@ -15,6 +15,7 @@ SELECT create_hash_partitions('rowmarks.first', 'id', 5);
15
15
5
16
16
(1 row)
17
17
18
+ VACUUM ANALYZE;
18
19
/* Not partitioned */
19
20
SELECT * FROM rowmarks.second ORDER BY id FOR UPDATE;
20
21
id
@@ -173,34 +174,75 @@ FOR SHARE;
173
174
6
174
175
(1 row)
175
176
177
+ /* JOIN (plan) */
178
+ EXPLAIN (COSTS OFF)
179
+ SELECT * FROM rowmarks.first
180
+ JOIN rowmarks.second USING(id)
181
+ ORDER BY id
182
+ FOR UPDATE;
183
+ QUERY PLAN
184
+ ---------------------------------------------------
185
+ LockRows
186
+ -> Sort
187
+ Sort Key: first_0.id
188
+ -> Hash Join
189
+ Hash Cond: (first_0.id = second.id)
190
+ -> Append
191
+ -> Seq Scan on first_0
192
+ -> Seq Scan on first_1
193
+ -> Seq Scan on first_2
194
+ -> Seq Scan on first_3
195
+ -> Seq Scan on first_4
196
+ -> Hash
197
+ -> Seq Scan on second
198
+ (13 rows)
199
+
200
+ /* JOIN (execution) */
201
+ SELECT * FROM rowmarks.first
202
+ JOIN rowmarks.second USING(id)
203
+ ORDER BY id
204
+ FOR UPDATE;
205
+ id
206
+ ----
207
+ 1
208
+ 2
209
+ 3
210
+ 4
211
+ 5
212
+ 6
213
+ 7
214
+ 8
215
+ 9
216
+ 10
217
+ (10 rows)
218
+
176
219
/* Check updates (plan) */
177
220
SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
178
221
SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
179
222
EXPLAIN (COSTS OFF)
180
223
UPDATE rowmarks.second SET id = 2
181
224
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182
- QUERY PLAN
183
- ---------------------------------------------
225
+ QUERY PLAN
226
+ ---------------------------------------
184
227
Update on second
185
228
-> Nested Loop Semi Join
186
229
-> Seq Scan on second
187
230
Filter: (id = 1)
188
- -> Materialize
189
- -> Append
190
- -> Seq Scan on first_0
191
- Filter: (id = 1)
192
- (8 rows)
231
+ -> Append
232
+ -> Seq Scan on first_0
233
+ Filter: (id = 1)
234
+ (7 rows)
193
235
194
236
EXPLAIN (COSTS OFF)
195
237
UPDATE rowmarks.second SET id = 2
196
238
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
197
239
QUERY PLAN
198
240
-----------------------------------------------
199
241
Update on second
200
- -> Nested Loop
242
+ -> Nested Loop Semi Join
201
243
Join Filter: (second.id = first_0.id)
202
- -> HashAggregate
203
- Group Key: first_0.id
244
+ -> Seq Scan on second
245
+ -> Materialize
204
246
-> Append
205
247
-> Seq Scan on first_0
206
248
Filter: (id < 1)
@@ -212,9 +254,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
212
254
Filter: (id < 1)
213
255
-> Seq Scan on first_4
214
256
Filter: (id < 1)
215
- -> Materialize
216
- -> Seq Scan on second
217
- (18 rows)
257
+ (16 rows)
218
258
219
259
EXPLAIN (COSTS OFF)
220
260
UPDATE rowmarks.second SET id = 2
@@ -237,17 +277,16 @@ EXPLAIN (COSTS OFF)
237
277
UPDATE rowmarks.second SET id = 2
238
278
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
239
279
RETURNING *, tableoid::regclass;
240
- QUERY PLAN
241
- ---------------------------------------------
280
+ QUERY PLAN
281
+ ---------------------------------------
242
282
Update on second
243
283
-> Nested Loop Semi Join
244
284
-> Seq Scan on second
245
285
Filter: (id = 1)
246
- -> Materialize
247
- -> Append
248
- -> Seq Scan on first_0
249
- Filter: (id = 1)
250
- (8 rows)
286
+ -> Append
287
+ -> Seq Scan on first_0
288
+ Filter: (id = 1)
289
+ (7 rows)
251
290
252
291
SET enable_hashjoin = t;
253
292
SET enable_mergejoin = t;
@@ -267,28 +306,27 @@ SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
267
306
EXPLAIN (COSTS OFF)
268
307
DELETE FROM rowmarks.second
269
308
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
270
- QUERY PLAN
271
- ---------------------------------------------
309
+ QUERY PLAN
310
+ ---------------------------------------
272
311
Delete on second
273
312
-> Nested Loop Semi Join
274
313
-> Seq Scan on second
275
314
Filter: (id = 1)
276
- -> Materialize
277
- -> Append
278
- -> Seq Scan on first_0
279
- Filter: (id = 1)
280
- (8 rows)
315
+ -> Append
316
+ -> Seq Scan on first_0
317
+ Filter: (id = 1)
318
+ (7 rows)
281
319
282
320
EXPLAIN (COSTS OFF)
283
321
DELETE FROM rowmarks.second
284
322
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
285
323
QUERY PLAN
286
324
-----------------------------------------------
287
325
Delete on second
288
- -> Nested Loop
326
+ -> Nested Loop Semi Join
289
327
Join Filter: (second.id = first_0.id)
290
- -> HashAggregate
291
- Group Key: first_0.id
328
+ -> Seq Scan on second
329
+ -> Materialize
292
330
-> Append
293
331
-> Seq Scan on first_0
294
332
Filter: (id < 1)
@@ -300,9 +338,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
300
338
Filter: (id < 1)
301
339
-> Seq Scan on first_4
302
340
Filter: (id < 1)
303
- -> Materialize
304
- -> Seq Scan on second
305
- (18 rows)
341
+ (16 rows)
306
342
307
343
EXPLAIN (COSTS OFF)
308
344
DELETE FROM rowmarks.second
0 commit comments