実行中クエリのプランをログに出力(※) =# 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)
参考資料 • Who Contributedto 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