@@ -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,90 @@ 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+
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+
176234/* Check updates (plan) */
177235SET enable_hashjoin = f;/* Hash Semi Join on 10 vs Hash Join on 9.6 */
178236SET enable_mergejoin = f;/* Merge Semi Join on 10 vs Merge Join on 9.6 */
179237EXPLAIN (COSTS OFF)
180238UPDATE rowmarks.second SET id = 2
181239WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182- QUERY PLAN
183- ---------------------------------------------
240+ QUERY PLAN
241+ ---------------------------------------
184242 Update on second
185243 -> Nested Loop Semi Join
186244 -> Seq Scan on second
187245 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)
193250
194251EXPLAIN (COSTS OFF)
195252UPDATE rowmarks.second SET id = 2
196253WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
197254 QUERY PLAN
198255-----------------------------------------------
199256 Update on second
200- -> Nested Loop
257+ -> Nested Loop Semi Join
201258 Join Filter: (second.id = first_0.id)
202- ->HashAggregate
203- Group Key: first_0.id
259+ ->Seq Scan on second
260+ -> Materialize
204261 -> Append
205262 -> Seq Scan on first_0
206263 Filter: (id < 1)
@@ -212,9 +269,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
212269 Filter: (id < 1)
213270 -> Seq Scan on first_4
214271 Filter: (id < 1)
215- -> Materialize
216- -> Seq Scan on second
217- (18 rows)
272+ (16 rows)
218273
219274EXPLAIN (COSTS OFF)
220275UPDATE rowmarks.second SET id = 2
@@ -237,17 +292,16 @@ EXPLAIN (COSTS OFF)
237292UPDATE rowmarks.second SET id = 2
238293WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
239294RETURNING *, tableoid::regclass;
240- QUERY PLAN
241- ---------------------------------------------
295+ QUERY PLAN
296+ ---------------------------------------
242297 Update on second
243298 -> Nested Loop Semi Join
244299 -> Seq Scan on second
245300 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)
251305
252306SET enable_hashjoin = t;
253307SET enable_mergejoin = t;
@@ -267,28 +321,27 @@ SET enable_mergejoin = f;/* Merge Semi Join on 10 vs Merge Join on 9.6 */
267321EXPLAIN (COSTS OFF)
268322DELETE FROM rowmarks.second
269323WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
270- QUERY PLAN
271- ---------------------------------------------
324+ QUERY PLAN
325+ ---------------------------------------
272326 Delete on second
273327 -> Nested Loop Semi Join
274328 -> Seq Scan on second
275329 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)
281334
282335EXPLAIN (COSTS OFF)
283336DELETE FROM rowmarks.second
284337WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
285338 QUERY PLAN
286339-----------------------------------------------
287340 Delete on second
288- -> Nested Loop
341+ -> Nested Loop Semi Join
289342 Join Filter: (second.id = first_0.id)
290- ->HashAggregate
291- Group Key: first_0.id
343+ ->Seq Scan on second
344+ -> Materialize
292345 -> Append
293346 -> Seq Scan on first_0
294347 Filter: (id < 1)
@@ -300,9 +353,7 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
300353 Filter: (id < 1)
301354 -> Seq Scan on first_4
302355 Filter: (id < 1)
303- -> Materialize
304- -> Seq Scan on second
305- (18 rows)
356+ (16 rows)
306357
307358EXPLAIN (COSTS OFF)
308359DELETE FROM rowmarks.second