@@ -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,90 @@ 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
+
219
+ /* ONLY (plan) */
220
+ EXPLAIN (COSTS OFF)
221
+ SELECT * FROM ONLY rowmarks.first FOR SHARE;
222
+ QUERY PLAN
223
+ -------------------------
224
+ LockRows
225
+ -> Seq Scan on first
226
+ (2 rows)
227
+
228
+ /* ONLY (execution) */
229
+ SELECT * FROM ONLY rowmarks.first FOR SHARE;
230
+ id
231
+ ----
232
+ (0 rows)
233
+
176
234
/* Check updates (plan) */
177
235
SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
178
236
SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
179
237
EXPLAIN (COSTS OFF)
180
238
UPDATE rowmarks.second SET id = 2
181
239
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182
- QUERY PLAN
183
- ---------------------------------------------
240
+ QUERY PLAN
241
+ ---------------------------------------
184
242
Update on second
185
243
-> Nested Loop Semi Join
186
244
-> Seq Scan on second
187
245
Filter: (id = 1)
188
- -> Materialize
189
- -> Append
190
- -> Seq Scan on first_0
191
- Filter: (id = 1)
192
- (8 rows)
246
+ -> Append
247
+ -> Seq Scan on first_0
248
+ Filter: (id = 1)
249
+ (7 rows)
193
250
194
251
EXPLAIN (COSTS OFF)
195
252
UPDATE rowmarks.second SET id = 2
196
253
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
197
254
QUERY PLAN
198
255
-----------------------------------------------
199
256
Update on second
200
- -> Nested Loop
257
+ -> Nested Loop Semi Join
201
258
Join Filter: (second.id = first_0.id)
202
- -> HashAggregate
203
- Group Key: first_0.id
259
+ -> Seq Scan on second
260
+ -> Materialize
204
261
-> Append
205
262
-> Seq Scan on first_0
206
263
Filter: (id < 1)
@@ -212,9 +269,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
212
269
Filter: (id < 1)
213
270
-> Seq Scan on first_4
214
271
Filter: (id < 1)
215
- -> Materialize
216
- -> Seq Scan on second
217
- (18 rows)
272
+ (16 rows)
218
273
219
274
EXPLAIN (COSTS OFF)
220
275
UPDATE rowmarks.second SET id = 2
@@ -237,17 +292,16 @@ EXPLAIN (COSTS OFF)
237
292
UPDATE rowmarks.second SET id = 2
238
293
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
239
294
RETURNING *, tableoid::regclass;
240
- QUERY PLAN
241
- ---------------------------------------------
295
+ QUERY PLAN
296
+ ---------------------------------------
242
297
Update on second
243
298
-> Nested Loop Semi Join
244
299
-> Seq Scan on second
245
300
Filter: (id = 1)
246
- -> Materialize
247
- -> Append
248
- -> Seq Scan on first_0
249
- Filter: (id = 1)
250
- (8 rows)
301
+ -> Append
302
+ -> Seq Scan on first_0
303
+ Filter: (id = 1)
304
+ (7 rows)
251
305
252
306
SET enable_hashjoin = t;
253
307
SET enable_mergejoin = t;
@@ -267,28 +321,27 @@ SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
267
321
EXPLAIN (COSTS OFF)
268
322
DELETE FROM rowmarks.second
269
323
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
270
- QUERY PLAN
271
- ---------------------------------------------
324
+ QUERY PLAN
325
+ ---------------------------------------
272
326
Delete on second
273
327
-> Nested Loop Semi Join
274
328
-> Seq Scan on second
275
329
Filter: (id = 1)
276
- -> Materialize
277
- -> Append
278
- -> Seq Scan on first_0
279
- Filter: (id = 1)
280
- (8 rows)
330
+ -> Append
331
+ -> Seq Scan on first_0
332
+ Filter: (id = 1)
333
+ (7 rows)
281
334
282
335
EXPLAIN (COSTS OFF)
283
336
DELETE FROM rowmarks.second
284
337
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
285
338
QUERY PLAN
286
339
-----------------------------------------------
287
340
Delete on second
288
- -> Nested Loop
341
+ -> Nested Loop Semi Join
289
342
Join Filter: (second.id = first_0.id)
290
- -> HashAggregate
291
- Group Key: first_0.id
343
+ -> Seq Scan on second
344
+ -> Materialize
292
345
-> Append
293
346
-> Seq Scan on first_0
294
347
Filter: (id < 1)
@@ -300,9 +353,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
300
353
Filter: (id < 1)
301
354
-> Seq Scan on first_4
302
355
Filter: (id < 1)
303
- -> Materialize
304
- -> Seq Scan on second
305
- (18 rows)
356
+ (16 rows)
306
357
307
358
EXPLAIN (COSTS OFF)
308
359
DELETE FROM rowmarks.second
0 commit comments