@@ -15,6 +15,7 @@ SELECT create_hash_partitions('rowmarks.first', 'id', 5);
1515 5
1616(1 row)
1717
18+ VACUUM ANALYZE;
1819/* Not partitioned */
1920SELECT * FROM rowmarks.second ORDER BY id FOR UPDATE;
2021 id
@@ -173,34 +174,75 @@ FOR SHARE;
173174 6
174175(1 row)
175176
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+
176219/* Check updates (plan) */
177220SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
178221SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
179222EXPLAIN (COSTS OFF)
180223UPDATE rowmarks.second SET id = 2
181224WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182- QUERY PLAN
183- ---------------------------------------------
225+ QUERY PLAN
226+ ---------------------------------------
184227 Update on second
185228 -> Nested Loop Semi Join
186229 -> Seq Scan on second
187230 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)
193235
194236EXPLAIN (COSTS OFF)
195237UPDATE rowmarks.second SET id = 2
196238WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
197239 QUERY PLAN
198240-----------------------------------------------
199241 Update on second
200- -> Nested Loop
242+ -> Nested Loop Semi Join
201243 Join Filter: (second.id = first_0.id)
202- -> HashAggregate
203- Group Key: first_0.id
244+ -> Seq Scan on second
245+ -> Materialize
204246 -> Append
205247 -> Seq Scan on first_0
206248 Filter: (id < 1)
@@ -212,9 +254,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
212254 Filter: (id < 1)
213255 -> Seq Scan on first_4
214256 Filter: (id < 1)
215- -> Materialize
216- -> Seq Scan on second
217- (18 rows)
257+ (16 rows)
218258
219259EXPLAIN (COSTS OFF)
220260UPDATE rowmarks.second SET id = 2
@@ -237,17 +277,16 @@ EXPLAIN (COSTS OFF)
237277UPDATE rowmarks.second SET id = 2
238278WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
239279RETURNING *, tableoid::regclass;
240- QUERY PLAN
241- ---------------------------------------------
280+ QUERY PLAN
281+ ---------------------------------------
242282 Update on second
243283 -> Nested Loop Semi Join
244284 -> Seq Scan on second
245285 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)
251290
252291SET enable_hashjoin = t;
253292SET enable_mergejoin = t;
@@ -267,28 +306,27 @@ SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
267306EXPLAIN (COSTS OFF)
268307DELETE FROM rowmarks.second
269308WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
270- QUERY PLAN
271- ---------------------------------------------
309+ QUERY PLAN
310+ ---------------------------------------
272311 Delete on second
273312 -> Nested Loop Semi Join
274313 -> Seq Scan on second
275314 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)
281319
282320EXPLAIN (COSTS OFF)
283321DELETE FROM rowmarks.second
284322WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
285323 QUERY PLAN
286324-----------------------------------------------
287325 Delete on second
288- -> Nested Loop
326+ -> Nested Loop Semi Join
289327 Join Filter: (second.id = first_0.id)
290- -> HashAggregate
291- Group Key: first_0.id
328+ -> Seq Scan on second
329+ -> Materialize
292330 -> Append
293331 -> Seq Scan on first_0
294332 Filter: (id < 1)
@@ -300,9 +338,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
300338 Filter: (id < 1)
301339 -> Seq Scan on first_4
302340 Filter: (id < 1)
303- -> Materialize
304- -> Seq Scan on second
305- (18 rows)
341+ (16 rows)
306342
307343EXPLAIN (COSTS OFF)
308344DELETE FROM rowmarks.second
0 commit comments