KEMBAR78
PostgreSQL 15 開発最新情報 | PDF
PostgreSQL 15 開発最新情報
PostgreSQLユーザ会
澤田 雅彦
OSC2022 Online/Osaka
2022/1/29
本講演について
• PostgreSQL 15は絶賛開発中
• いくつかの新機能を紹介しますが、正式リリースまでに変更・削除されて
いる可能性があります
PostgreSQL開発コミュニティってどんなところ?
• コアチーム(7人)
• コミュニティの方針発表、権限管理など
• コミッター(28人)
• ソースコードの変更権限がある
• コントリビューター(400人以上)
• ソースコードやドキュメントの変更、レビュー
• 日本人の貢献者は30名以上
https://www.pgcon.org/2018/schedule/attachments/497_contributing.pdf
どんな人達が開発しているの?
http://rhaas.blogspot.com/2022/01/who-contributed-to-postgresql.html
どんな人達が開発しているの?
# |  ?column?  | lines | pct_lines | commits
----+------------------------------+-------+-----------+---------
1 | Tom Lane  | 66210 |  26.09 |  438
2 | Tomas Vondra  | 15357 | 6.05 | 50
3 | Dagfinn Ilmari Mannsåker [*] | 14715 | 5.80 | 10
4 | Peter Eisentraut  | 12976 | 5.11 |  214
5 | Robert Haas | 7035 | 2.77 | 46
6 | Bruce Momjian | 7010 | 2.76 | 58
7 | Peter Geoghegan | 6889 | 2.71 | 91
8 | Amit Langote [*]  | 6859 | 2.70 | 24
9 | Heikki Linnakangas  | 6706 | 2.64 | 38
10 | Mark Dilger [*] | 6203 | 2.44 | 23
11 | David Rowley  | 5848 | 2.30 | 50
12 | Alvaro Herrera  | 5582 | 2.20 | 79
13 | Andres Freund | 5288 | 2.08 | 53
14 | Michael Paquier | 5057 | 1.99 |  127
15 | Thomas Munro  | 4356 | 1.72 | 78
16 | Peter Smith [*] | 4194 | 1.65 | 29
17 | Vignesh C [*] | 3886 | 1.53 | 19
18 | Dilip Kumar [*] | 3496 | 1.38 | 19
19 | Craig Ringer [*]  | 3070 | 1.21 |  6
20 | Masahiko Sawada [*] | 2879 | 1.13 | 32
21 | Andrew Dunstan  | 2461 | 0.97 | 48
22 | Bharath Rupireddy [*] | 2336 | 0.92 | 41
23 | Daniel Gustafsson | 2127 | 0.84 | 38
24 | Justin Pryzby [*] | 2087 | 0.82 | 51
25 | Hayato Kuroda [*] | 2080 | 0.82 |  5
26 | Ajin Cherian [*]  | 2021 | 0.80 | 10
27 | Kyotaro Horiguchi [*] | 1896 | 0.75 | 28
28 | John Naylor | 1814 | 0.71 | 20
29 | Greg Nancarrow [*]  | 1745 | 0.69 | 12
30 | Julien Rouhaud [*]  | 1707 | 0.67 | 16
どんな人達が開発しているの?
# |  ?column?  | lines | pct_lines | commits
----+------------------------------+-------+-----------+---------
1 | Tom Lane  | 66210 |  26.09 |  438
2 | Tomas Vondra  | 15357 | 6.05 | 50
3 | Dagfinn Ilmari Mannsåker [*] | 14715 | 5.80 | 10
4 | Peter Eisentraut  | 12976 | 5.11 |  214
5 | Robert Haas | 7035 | 2.77 | 46
6 | Bruce Momjian | 7010 | 2.76 | 58
7 | Peter Geoghegan | 6889 | 2.71 | 91
8 | Amit Langote [*]  | 6859 | 2.70 | 24
9 | Heikki Linnakangas  | 6706 | 2.64 | 38
10 | Mark Dilger [*] | 6203 | 2.44 | 23
11 | David Rowley  | 5848 | 2.30 | 50
12 | Alvaro Herrera  | 5582 | 2.20 | 79
13 | Andres Freund | 5288 | 2.08 | 53
14 | Michael Paquier | 5057 | 1.99 |  127
15 | Thomas Munro  | 4356 | 1.72 | 78
16 | Peter Smith [*] | 4194 | 1.65 | 29
17 | Vignesh C [*] | 3886 | 1.53 | 19
18 | Dilip Kumar [*] | 3496 | 1.38 | 19
19 | Craig Ringer [*]  | 3070 | 1.21 |  6
20 | Masahiko Sawada [*] | 2879 | 1.13 | 32
21 | Andrew Dunstan  | 2461 | 0.97 | 48
22 | Bharath Rupireddy [*] | 2336 | 0.92 | 41
23 | Daniel Gustafsson | 2127 | 0.84 | 38
24 | Justin Pryzby [*] | 2087 | 0.82 | 51
25 | Hayato Kuroda [*] | 2080 | 0.82 |  5
26 | Ajin Cherian [*]  | 2021 | 0.80 | 10
27 | Kyotaro Horiguchi [*] | 1896 | 0.75 | 28
28 | John Naylor | 1814 | 0.71 | 20
29 | Greg Nancarrow [*]  | 1745 | 0.69 | 12
30 | Julien Rouhaud [*]  | 1707 | 0.67 | 16
どんな人達が開発しているの?
• 182名の開発者がコードコントリビューション
• 13人が全体の66%、35人が全体の90%の新しいコードを書いている
http://rhaas.blogspot.com/2022/01/who-contributed-to-postgresql.html
どんな人達が開発しているの?
https://www.slideshare.net/nttdata-tech/postgresql-development-community-activities-2021-pgunconf30-nttdata
PostgreSQLの開発スケジュール
• 毎年9、10月に新しいメジャーバージョンをリリース
• メジャーバージョン:v14 → v15。新機能あり。
• マイナーバージョン:v14.1 → v14.2。バグ修正。
• Commit Fest (CF)
• 2ヶ月に1回、パッチを集中的にレビューする月間
• Commit Festアプリにパッチを登録する
• コミュニティにロードマップはない
PostgreSQLの開発スケジュール
2021 2022
6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10
v14 Release
v15 Development Cycle
v15 Release
V16 Dev. cycle
CF CF CF CF CF Beta/RC
PostgreSQL 15
新機能(かもしれない)紹介
(※)がついている機能は提案はされているが未コミットの機能
ロジカル(論理)レプリケーションの改善
• データの変更を他のPostgreSQLサーバに伝搬する
• 伝搬されるデータは、データに対する論理的な変更:テーブルAに(1,
Bob )をINSERTした
• フィジカル(物理)レプリケーションはDBの物理的な変更内容を伝搬す
る:テーブルAの8番ブロックの13オフセットに長さ10のタプルを追加
• メジャーバージョンが異なるサーバにも送信可能
• 特定のテーブルのみ、特定の操作のみ、を送信することが可能
ロジカルレプリケーションの改善
• 複製するテーブルをスキーマ単位で指定可能
• 2相コミット対応
• 発生したエラーをビューで見れる
• 管理者権限不要になった
• 特定の変更をスキップできる(※)
• 列のフィルタリング(※)
• 行のフィルタリング(※)
• レプリケーションスロットのレプリケーション(※)
pg_basebackupの改善
• 物理バックアップが取得できる機能
• 大きなリファクタリングが入った
• サーバ上にバックアップを作成できる
• サーバ側でのバックアップ圧縮に対応
• これまではクライアント側では圧縮可能
CIサポート
• Cirrus-CIの設定ファイルがリポジトリに入った
• コミット毎にLinux, macOS, FreeBSD, Windowsにてテストが走る
• 開発者もCirrus-CIを有効にすることで、自分が書いたコードをテストす
ることが可能
CIサポート
https://cirrus-ci.com/build/5526044831645696
他のCI
• Build Farm
• PostgreSQLコミュニティが管理しているCI環境
• 登録されたサーバに対してテストが走る
• コミットされたコードが対象(バックブランチも含む)
• https://buildfarm.postgresql.org/cgi-bin/show_status.pl
• PostgreSQL Patch Tester
• CFに登録されたパッチが対象
• http://cfbot.cputube.org/
その他の機能
• regexp_count(), regexp_instr(), regexp_like(), regexp_substr()がサポート
• log_destination = jsonlog
• 9.2以前のpg_dump/psql/pg_upgradeのサポートを廃止
• Index Vacuumの進 表示(※)
• 実行中のクエリのプランをログに出力(※)
• MERGE(※)
log_destination=jsonlog
$ cat data/log/postgresql-2022-01-27_212808.json
{"timestamp":"2022-01-27 21:28:08.400
JST","pid":72314,"session_id":"61f28fd8.11a7a","line_num":1,"session_start":"2022-01-27 21:28:08
JST","txid":0,"error_severity":"LOG","message":"ending log output to stderr","hint":"Future log
output will goto log destination "jsonlog".","backend_type":"postmaster","query_id":0}
{"timestamp":"2022-01-27 21:28:08.400
JST","pid":72314,"session_id":"61f28fd8.11a7a","line_num":2,"session_start":"2022-01-27 21:28:08
JST","txid":0,"error_severity":"LOG","message":"starting PostgreSQL 15devel on x86_64-apple-
darwin19.6.0, compiled by Apple clang version 12.0.0 (clang-1200.0.32.29), 64-
bit","backend_type":"postmaster","query_id":0}
{"timestamp":"2022-01-27 21:28:08.403
JST","pid":72314,"session_id":"61f28fd8.11a7a","line_num":3,"session_start":"2022-01-27 21:28:08
JST","txid":0,"error_severity":"LOG","message":"listening on IPv6 address "::1", port
5432","backend_type":"postmaster","query_id":0}
{"timestamp":"2022-01-27 21:28:08.403
JST","pid":72314,"session_id":"61f28fd8.11a7a","line_num":4,"session_start":"2022-01-27 21:28:08
JST","txid":0,"error_severity":"LOG","message":"listening on IPv4 address "127.0.0.1", port
5432","backend_type":"postmaster","query_id":0}
Index Vacuumの進 レポート(※)
• Vacuum全体の進 はpg_stat_progress_vacuumビューで確認可能
• ただしIndex Vacuumについての詳細がない、という点を改善するための機能
Table Scan
Index Vacuum
1
Index Vacuum
2
Index Vacuum
3
Table Vacuum Cleanup
-[ RECORD 1 ]------+--------------
pid | 39040
datid | 5
datname | postgres
relid | 16384
phase | scanning heap
heap_blks_total | 7928
heap_blks_scanned | 7687
heap_blks_vacuumed | 0
index_vacuum_count | 0
max_dead_tuples | 2307048
num_dead_tuples | 0
実行中クエリのプランをログに出力(※)
=# 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)
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;
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)
PostgreSQL 16以降に
提案されている機能
Async I/O (AIO)
• 非同期I/Oを使うようにする機能
• io_uring, posix aioなど様々な方法に対応している
• Linux, FreeBSD, macOS, Windowsに対応するように作られている
• 開発リポジトリ
• https://github.com/anarazel/postgres/tree/aio
その他の機能
• Global Index
• パーティション・テーブル全体に対するインデックス
• パーティション・キー以外に一意インデックスが貼れたりする
• VACUUMも要改善
• 透過的暗号化
• サーバ側、クライアント側の両方が提案されている
最新情報を知るには?
どこで開発情報を知れるのか?
• pgsql-hackersメーリングリストを読む
• コミットログを眺める
• CFエントリを眺める
• postgrseql-jp slackやTwitterで聞いてみる
• PGConに参加する
PostgreSQLアンカンファレンス
• 毎月オンラインで開催
• PostgreSQLのことなら何でも
OK
• 次回は2/22(火) 20:30
• 「PostgreSQL アンカンファレ
ンス」で検索
PostgreSQLの開発に興味が出てきた?
• 開発コミュニティへの参加するた
めの方法が詳しく紹介されていま
す
• パッチの適用、ビルド、メールを
書く上での注意などが詳しく紹介
されています
https://www.slideshare.net/nttdata-tech/postgresql-global-development-group-postgresql-conference-japan-2021-nttdata
おわりに
• PostgreSQL開発コミュニティやPostgreSQL15の最新開発情報をお届け
ましました
• 3月末にFeature Freezeになる予定
• 本日紹介した機能は正式リリースまで変更・削除される可能性があります
• 改善のご要望もお待ちしています!
Thank you!!
masahiko_sawada
参考資料
• 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

PostgreSQL 15 開発最新情報