21. 実行中クエリのプランをログに出力(※)
=# SELECT pg_log_query_plan(73953);
$ cat postgresql.log
2022-01-27 22:01:20.377 JST [73953] LOG: query plan running on backend with PID 73953 is:
Query Text: UPDATE pgbench_accounts SET abalance = abalance + -4999 WHERE aid = 948949;
Update on public.pgbench_accounts (cost=0.43..8.45 rows=0 width=0)
-> Index Scan using pgbench_accounts_pkey on public.pgbench_accounts (cost=0.43..8.45 rows=1 width=10)
Output: (abalance + '-4999'::integer), ctid
Index Cond: (pgbench_accounts.aid = 948949)
22. MERGE(※)
• 行の挿入と更新を1つの文で行う
• 条件に合わせてUPDATE、DELETE、INSERTを実行できる
• SQL:2016に準拠したMERGEコマンドが提案されている
MERGE INTO target AS t
USING source AS s
ON t.tid = s.sid
WHEN MATCHED AND t.balance > s.delta THEN
UPDATE SET balance = t.balance - s.delta
WHEN MATCHED THEN
DELETE
WHEN NOT MATCHED AND s.delta > 0 THEN
INSERT VALUES (s.sid, s.delta)
WHEN NOT MATCHED THEN
DO NOTHING;
23. MERGE(※)
=# SELECT * FROM b;
id | val
----+-----
1 | 4
2 | 2
4 | 6
(3 rows)
=# SELECT * FROM a;
id | val
----+-----
1 | 1
2 | 5
3 | 4
4 | 3
(4 rows)
=# SELECT * FROM b;
id | val
----+-----
1 | 4
2 | 5
3 | 4
4 | 6
(4 rows)
=# MERGE INTO b USING a
ON a.id = b.id
WHEN MATCHED AND a.val > b.val THEN
UPDATE SET val = a.val
WHEN NOT MATCHED THEN
INSERT VALUES (a.id, a.val);
• テーブルaを使ってテーブルbを以下のように更新する:
• IDが一致すれば、大きい方に更新(UPDATE)
• 一致するIDがなければ、aの値を挿入(INSERT)
33. 参考資料
• Who Contributed to PostgreSQL Development in 2020 and 2021?
• http://rhaas.blogspot.com/2022/01/who-contributed-to-postgresql.html
• PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライ
ン 発表資料)
• https://www.slideshare.net/nttdata-tech?
utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview