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 開発最新情報