Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PostgreSQL 18 is coming soon!

PostgreSQL 18 is coming soon!

This slide introduces the development status of PostgreSQL 18 and its new features.

Avatar for nuko_yokohama

nuko_yokohama

July 05, 2025
Tweet

More Decks by nuko_yokohama

Other Decks in Technology

Transcript

  1. © 2025 NTT TechnoCross Corporation PostgreSQL 18がやってくる! Open Source Conference

    2025 Hokkaido NTTテクノクロス株式会社 原田 登志 北海道は10年ぶり 楽しみです!
  2. © 2025 NTT TechnoCross Corporation 2 自己紹介 • 名前:原田 登志

    • 別名:ぬこ@横浜(@nuko_yokohama) • 所属:NTTテクノクロス株式会社 • 仕事:PostgreSQLに関するあれこれ • 趣味:
  3. © 2025 NTT TechnoCross Corporation 3 【宣伝】弊社サービスの紹介 • NTTテクノクロス社のPostgreSQL関連サービスの紹介 •

    移行サービス • https://www.ntt-tx.co.jp/products/osscloud/service/migration/ • OracleDBからPostgreSQL(Aurora等含む)へのDB移行 • 事例1:移行フェーズ DB移行実現性検証(PoC) • 事例2:開発、移行フェーズ EC2からAurora PostgreSQLへの移行 • 定額制チケットサービス • https://www.ntt-tx.co.jp/products/osscloud/service/ticket/ • OSS製品検討の支援 • 保守サービス・トラブルシュート
  4. © 2025 NTT TechnoCross Corporation 4 目次 • PostgreSQLとは •

    PostgreSQL 18開発状況 • 主な改善項目 • 互換性に影響のある項目 • その他の改善項目 • おわりに
  5. © 2025 NTT TechnoCross Corporation 6 PostgreSQLの概要 • ORDBMS •

    オープンソース • 無料で利用可能。使いやすいBSDライセンス。 • コミュニティによる継続的開発。 • 豊富な機能 • 堅牢 • ACID準拠 • 高いパフォーマンス • 大規模データベースにも適用可能 • 複雑なクエリも扱える • 拡張性 • PostGIS等の拡張機能 • 関数・データ型・演算子・インデックス・アクセスメソッド
  6. © 2025 NTT TechnoCross Corporation 7 PostgreSQLの歴史(1/2) • 1986年:POSTGRESプロジェクト開始 •

    1995年:Postgre95誕生→PostgreSQL 1.0へ • 1997年:PostgreSQL 6.0 • 2001年:PostgreSQL 7.0(WAL) • 2005年:PostgreSQL 8.0(Windows対応) • 2010年:PostgreSQL 9.0(レプリケーション) • 2017年:PostgreSQL 10(パーティーション、ロジレプ) PostgreSQL 10から バージョン番号体 系が変わった To be continued...
  7. © 2025 NTT TechnoCross Corporation 8 PostgreSQLの歴史(2/2) • 2018年:PostgreSQL 11(JIT)

    • 2019年:PostgreSQL 12(Table Access Method) • 2020年:PostgreSQL 13(拡張統計機能) • 2021年:PostgreSQL 14(多くの性能改善) • 2022年:PostgreSQL 15(MERGE文) • 2023年:PostgreSQL 16(ロジレプの様々な改善) • 2024年:PostgreSQL 17(増分バックアップ) そして現在開発中の PostgreSQL 18へ・・・
  8. 9 © 2025 NTT TechnoCross Corporation PostgreSQL 18開発状況 • PostgreSQLの開発サイクル

    • クラウドベンダの対応時期 • 改善項目概要
  9. © 2025 NTT TechnoCross Corporation 10 PostgreSQLの開発サイクル • Commitfestで項目管理。項目の議論はMLベース。 •

    3月のCommitfest終了時のコミット済み項目→次バージョン項目 • 5月くらいにBetaリリース。(PGConf.dev前) • 9月くらいまでBetaリリースを繰り返す。 • 9月央~10月央くらいにGAリリース。 • 次々バージョンの開発は並行して進んでいく。 Release Candidate (RC) GA リリース Beta (1~4くらい) Feature Freeze Commitfest (2025-03) 3月末頃 5月頃 9月頃 9月央~10 月頃 Commitfest (2025-07~2026-03) PostgreSQL 18 PostgreSQL 19
  10. © 2025 NTT TechnoCross Corporation 11 クラウドベンダの対応 • クラウドベンダが提供するDBaaSの新バージョン対応時期 •

    目安:PostgreSQLコミュニティのGAリリースから半年~1年程度後。 • PostgreSQL 16, 17の場合 PostgreSQL 16 PostgreSQL 17 コミュニティ版 2023-09-14 2024-09-26 AWS Aurora PostgreSQL互 換 2024-01-31 2025-05-01 Azure Database for PostgreSQL 2024-11-01 2025-06-01? AlloyDB for PostgreSQL 2024-10-24 -
  11. © 2025 NTT TechnoCross Corporation 12 改善項目概要 • PostgreSQL 18リリースノート記載の項目は190(Beta1時点)

    • Optimizer, Monitoringの項目数が多め • psql, pg_dump等の身近なコマンドの改善項目もいろいろ 分類 項目数 E.1.3.1.1. Optimizer 16 E.1.3.1.2. Indexes 4 E.1.3.1.3. General Performance 5 E.1.3.1.4. Monitoring 20 E.1.3.1.5. Privileges 4 E.1.3.1.6. Server Configuration 11 E.1.3.1.7. Streaming Replication and Recovery 2 E.1.3.1.8. Logical Replication 4 E.1.3.2.1. Constraints 8 E.1.3.2.2. COPY 4 E.1.3.2.3. EXPLAIN 9 E.1.3.3. Data Types 10 E.1.3.4. Functions 10 分類 項目数 E.1.3.5. libpq 7 E.1.3.6. psql 10 E.1.3.7. Server Applications 7 E.1.3.7.1. pg_dump/pg_dumpall/pg_restore 5 E.1.3.7.2. pg_upgrade 4 E.1.3.7.3. Logical Replication Applications> 5 E.1.3.8. Source Code 23 E.1.3.9. Additional Modules 15 E.1.3.9.1. pg_stat_statements 4 E.1.3.9.2. pgcrypto 3 本セッションでは全部は 紹介しきれないので、 一部だけ紹介します
  12. 13 © 2025 NTT TechnoCross Corporation 主な改善項目 • 仮想生成列 •

    WITHOUT OVERLAPS • 統計情報のエクスポート/インポート • 非同期I/Oによる性能向上
  13. © 2025 NTT TechnoCross Corporation 14 仮想生成列 • 生成列とは指定された式の結果が返される特殊な列 •

    生成列自体はPostgreSQL 12から対応している。 • PostgreSQL 18では「仮想生成列」$1 という新しい種別の 生成列が指定可能になった。 種別 データ実体 動作 生成列 もつ データ挿入時に式を評価し、その結果を挿入 する。 検索時にその列の値を取り出す。 仮想生成列 もたない データ挿入時には何もしない。 検索時に式を評価した結果を取り出す。 $1 この訳語は自分が独自につけたもので、正式な訳語ではありません。
  14. © 2025 NTT TechnoCross Corporation 15 仮想生成列 • テーブル定義の例 CREATE

    TABLE foo ( id int primary key, data int, gc_data int GENERATED ALWAYS AS (data + 100) STORED, -- 生成列 vgc_data int GENERATED ALWAYS AS (data + 10000) VIRTUAL -- 仮想生成列 ); ¥d foo Table "public.foo" Column | Type | Collation | Nullable | Default ----------+---------+-----------+----------+----------------------------------------- id | integer | | not null | data | integer | | | gc_data | integer | | | generated always as (data + 100) stored vgc_data | integer | | | generated always as (data + 10000) Indexes: "foo_pkey" PRIMARY KEY, btree (id)
  15. © 2025 NTT TechnoCross Corporation 16 仮想生成列 • データ挿入と検索 INSERT

    INTO foo (id, data) VALUES (1, 10), (2, 20), (3, 30) ; INSERT 0 3 SELECT * FROM foo; id | data | gc_data | vgc_data ----+------+---------+---------- 1 | 10 | 110 | 10010 2 | 20 | 120 | 10020 3 | 30 | 130 | 10030 (3 rows) • gc_data列にはdata + 100 の結果が格納される • vgc_data列を検索するとそのときにdata+10000の結果が返却され る。
  16. © 2025 NTT TechnoCross Corporation 17 仮想生成列 • 仮想生成列に対する操作 •

    挿入/更新は不可 • インデックス設定は不可 • NOT NULL制約は設定可能 testdb=# INSERT INTO foo (id, data, vgc_data) VALUES (3, 30, 10030); ERROR: cannot insert a non-DEFAULT value into column "vgc_data" DETAIL: Column "vgc_data" is a generated column. CREATE INDEX vgc_data_idx ON foo USING btree (vgc_data); ERROR: indexes on virtual generated columns are not supported psqlのTAB補完では、 仮想生成列もインデックス 列の候補に上がるけど、 実行時にエラーになる。
  17. © 2025 NTT TechnoCross Corporation 18 仮想生成列 • 生成列 vs

    仮想生成列 • テーブルサイズは仮想生成列のほうが小さい • 生成後の結果をタプルに持たないから • 挿入時間は仮想生成列のほうが小さい • 生成値をタプルに持たない状態で挿入するから • 検索時間は仮想生成列のほうが大きい • 仮想生成列は検索時に生成列定義時の演算を行うから • 実験 • 仮想列の式:repeat(data, 10) • dataにmd5(clock_timestamp) • 10万件挿入/全件検索 • 3回試行した平均値 方式 サイズ (MiB) 挿入時間 (ms) 検索時間 (ms) 生成列 (STORED) 39.1 331.468 181.418 仮想生成列 (VIRTUAL) 6.5 246.206 184.371
  18. © 2025 NTT TechnoCross Corporation 19 仮想生成列(追記) • 現在コミュニティ内で、セキュリティ上の問題があるのでは、という議論 がされており、この機能がRevertされる可能性があります。

    • 今後リリースされる予定のBeta 2バージョンではこの機能がなくなっているかもしれま せん・・・。 対処案は検討中ですが、 それはBeta期間中に取り込めない、 という状況らしいです・・・
  19. © 2025 NTT TechnoCross Corporation 20 WITHOUT OVERLAPS • PostgreSQL

    18ではPrimary Key制約およびUNIQUE制約に「範囲型」を設定できるようになっ た。 • 範囲が重なる値を挿入しようとすると制約違反となる。 • この機能により“SQL:2011 application time”の一部にも対応できる。
  20. © 2025 NTT TechnoCross Corporation 21 WITHOUT OVERLAPS • 事前準備

    • contrib/btree_gist拡張機能の登録 • CREATE EXTENSION文で登録する。 • btree_gist拡張機能は、パブリッククラウドが提供しているDBaaSでも利 用可能。 • WITHOUT OVERLAPSで指定した列以外は、GiSTインデックスで等しい かどうかを比較できる任意の型を指定する。 • 通常の基本型(integerやtext等)はGiSTインデックス対応の演算子を持って ない。 • このため、範囲型+基本型の制約を定義する場合にはbtree_gist拡張機能 を追加する必要がある。
  21. © 2025 NTT TechnoCross Corporation 22 WITHOUT OVERLAPS • WITH

    OVERLAPSの使用例 • id+valid_period 2列の複合プライマリキー(foo_pk)を定義 • WITHOUT OVERLAPSを指定 CREATE TABLE foo ( id int, name text, valid_period daterange, -- PK: id(btree_gist) + valid_period) CONSTRAINT foo_pk PRIMARY KEY (id, valid_period WITHOUT OVERLAPS) ); • btree_gist拡張を登録していない場合、以下のエラーとなるので注意。 ERROR: data type integer has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type. btree_gist拡張は、AWS, Azure, GCP, OCIの各PaaS で利用可能です。
  22. © 2025 NTT TechnoCross Corporation 23 WITHOUT OVERLAPS • ①挿入の例(重なりがない例)

    $ psql -p 18001 -U postgres testdb -a -f 1_insert_table.sql -- application time test INSERT INTO foo VALUES (1, 'HQ', '[2020-01-01,9999-12-31]'), (2, 'Dev1-Team1', '[2020-04-01,2022-03-31]'), (2, 'Dev1-Team2', '[2022-04-01,2024-03-31]'), (2, 'Dev2-TeamX', '[2024-04-01,2025-03-31]'), (3, 'Human Recource', '[2020-01-01,9999-12-31]') ; INSERT 0 5 • ②挿入の例(重なりがあるため制約違反となる例) • 2022-03-31 が重なっているため制約違反となる。 $ psql -p 18001 -U postgres testdb -a -f 1_error_insert.sql -- application time test INSERT INTO foo VALUES (1, 'HQ', '[2020-01-01,9999-12-31]'), (2, 'Dev1-Team1', '[2020-04-01,2022-03-31]'), (2, 'Dev1-Team2', '[2022-03-31,2024-03-31]') ; psql:1_error_insert.sql:6: ERROR: conflicting key value violates exclusion constraint "foo_pk" DETAIL: Key (id, valid_period)=(2, [2022-03-31,2024-04-01)) conflicts with existing key (id, valid_period)=(2, [2020-04-01,2022-04-01)).
  23. © 2025 NTT TechnoCross Corporation 24 WITHOUT OVERLAPS • WITH

    OVERLAPS制約によりある時点の情報を検索する例 • 全スライドの①のデータが挿入された状態で検索する。 testdb=# TABLE foo ; id | name | valid_period ----+----------------+-------------------------- 1 | HQ | [2020-01-01,10000-01-01) 2 | Dev1-Team1 | [2020-04-01,2022-04-01) 2 | Dev1-Team2 | [2022-04-01,2024-04-01) 2 | Dev2-TeamX | [2024-04-01,2025-04-01) 3 | Human Recource | [2020-01-01,10000-01-01) (5 rows) • 範囲型の列(valid_period)に対する演算子は =, <, > ではなく、範囲 型用の演算子(@>等)を使う。 SELECT * FROM foo WHERE valid_period @> '2022-01-01'::date;
  24. © 2025 NTT TechnoCross Corporation 25 WITHOUT OVERLAPS • WITH

    OVERLAPS制約によりある時点の情報を検索する例 • 2022-01-01, 2024-01-01, 2025-01-01時点の部署名(name)を検索する。 (id=2 のnameが変わる) testdb=# SELECT * FROM foo WHERE valid_period @> '2022-01-01'::date; id | name | valid_period ----+----------------+-------------------------- 1 | HQ | [2020-01-01,10000-01-01) 2 | Dev1-Team1 | [2020-04-01,2022-04-01) 3 | Human Recource | [2020-01-01,10000-01-01) (3 rows) testdb=# SELECT * FROM foo WHERE valid_period @> '2023-01-01'::date; id | name | valid_period ----+----------------+-------------------------- 1 | HQ | [2020-01-01,10000-01-01) 2 | Dev1-Team2 | [2022-04-01,2024-04-01) 3 | Human Recource | [2020-01-01,10000-01-01) (3 rows) testdb=# SELECT * FROM foo WHERE valid_period @> '2025-01-01'::date; id | name | valid_period ----+----------------+-------------------------- 1 | HQ | [2020-01-01,10000-01-01) 2 | Dev2-TeamX | [2024-04-01,2025-04-01) 3 | Human Recource | [2020-01-01,10000-01-01) (3 rows)
  25. © 2025 NTT TechnoCross Corporation 26 統計情報のエクスポート/インポート • 統計情報 •

    テーブルに格納されたデータをサンプリングして集計した情報 • 手動でのANALYZE処理/自動ANALYZEにより更新 • プランナは統計情報を用いて実行計画を生成する • PostgreSQL 18での改善項目 • 統計情報をpg_dumpで統計情報をエクスポート可能になった。 • --statistics-only /--no-statisticsオプションの追加 • オプティマイザの統計情報を変更する関数の追加 • 追加された関数の一部は、pg_dumpで出力されるダンプファイル内で使用される。 関数名 関数の内容 ダンプファイル内 pg_restore_relation_stats テーブルレベルの統計情報を更新する。 使用される pg_clear_relation_stats テーブルレベルの統計情報を消去する。 - pg_restore_attribute_stats 列レベルの統計情報を更新する。 使用される pg_clear_attribute_stats 列レベルの統計情報を消去する -
  26. © 2025 NTT TechnoCross Corporation 27 統計情報のエクスポート/インポート • 統計情報エクスポート/インポートの手順概要 •

    スキーマ情報/データをダンプ • エクスポートしたいテーブル/列の統計情報をエクスポート • 別のデータベースにスキーマ情報/データをリストア • エクスポートした統計情報をリストア DB1 DB2 スキーマ情報 データ 統計情報 pg_dump psql --schema-only --data-only --statistics-only
  27. © 2025 NTT TechnoCross Corporation 28 統計情報のエクスポート/インポート(実行例) • 準備:エクスポート元のデータベースにpgbenchで(scale factor=10)を

    ロードしておく • エクスポート • 今回はスキーマのみ、データのみ、統計情報のみの3つのダンプファイルを作成する。 $ pg_dump testdb1 --schema-only > /tmp/schema.txt $ pg_dump testdb1 --data-only > /tmp/data.txt $ pg_dump testdb1 --statistics-only > /tmp/statistics.txt • データ用のダンプファイル(data.txt)を加工して、scale factor=1のサイズにしておく • pgbench_accountsテーブルは100万件→10万件になる。
  28. © 2025 NTT TechnoCross Corporation 29 統計情報のエクスポート/インポート(実行例) • インポート •

    まず、スキーマ情報(schema.txt)とデータ(data-small.txt)をpsqlでリストアする。 $ psql testdb2 -f /tmp/schema.txt SET (省略) ALTER TABLE $ $ psql testdb2 -f /tmp/data-small.txt SET (省略) COPY 100000 COPY 1 COPY 0 COPY 10 $
  29. © 2025 NTT TechnoCross Corporation 30 統計情報のエクスポート/インポート(実行例) • 統計情報の確認 •

    reltuplesは100000になっている。 • histogram_boundsの値域も1~100000の範囲 $ psql testdb2 -x -c "SELECT relname, reltuples FROM pg_class WHERE relname = 'pgbench_accounts';" -[ RECORD 1 ]--------------- relname | pgbench_accounts reltuples | 100000 $ psql testdb2 -t -x -c "SELECT relname, reltuples FROM pg_class WHERE relname = 'pgbench_accounts';" relname | pgbench_accounts reltuples | 100000 $ psql testdb2 -t -x -c "SELECT tablename,attname,histogram_bounds FROM pg_stats WHERE tablename = 'pgbench_accounts' and attname = 'aid';" tablename | pgbench_accounts attname | aid histogram_bounds | {4,929,1943,2997,3980,5036,6069,7132,8156,9161,10128,11110,12096,13149,14104,15141,16272,17213,18255,19307,202 61,21310,22260,23203,24204,25274,26248,27308,28337,29376,30379,31340,32361,33326,34415,35362,36267,37191,38191 ,39234,40227,41258,42192,43216,44299,45251,46294,47350,48362,49409,50387,51326,52269,53258,54214,55164,56134,5 7059,58152,59215,60207,61123,62104,63097,64109,65133,66117,67139,68086,69138,70134,70977,72063,73018,74067,750 64,76103,77074,78104,79071,80028,80982,81843,82918,83937,84948,85933,86899,87913,88927,89868,90922,91871,92928 ,93905,94975,96063,97067,98088,99054,99997}
  30. © 2025 NTT TechnoCross Corporation 31 統計情報のエクスポート/インポート(実行例) • インポート •

    この状態で統計情報をインポートし、その後で統計情報を確認 $ psql testdb2 -f /tmp/statistics.txt SET (省略) pg_restore_relation_stats --------------------------- t (1 row) pg_restore_attribute_stats ---------------------------- t (1 row) (省略) • 統計情報更新用の関数が実行されている。 • pg_restore_relation_stats • pg_restore_attribute_stats
  31. © 2025 NTT TechnoCross Corporation 32 統計情報のエクスポート/インポート(実行例) • 統計情報の再確認 •

    reltuplesは1000000(1e+06)に更新された • histogram_boundsの値域は1~1000000の範囲に更新された $ psql testdb2 -t -x -c "SELECT relname, reltuples FROM pg_class WHERE relname = 'pgbench_accounts';" relname | pgbench_accounts reltuples | 1e+06 $ psql testdb2 -t -x -c "SELECT tablename,attname,histogram_bounds FROM pg_stats WHERE tablename = 'pgbench_accounts' and attname = 'aid';" tablename | pgbench_accounts attname | aid histogram_bounds | {38,10337,20129,29386,39358,48481,59214,69052,79346,88761,98479,107708,117702,127822,137836,147963,158844,1692 42,178834,189545,200574,210989,221647,231954,241576,250643,260792,269363,278672,289339,299153,308096,318349,32 8722,338791,348032,358267,368560,378450,389041,397855,408506,418869,428467,438716,448037,458578,468248,478695, 488491,498186,508864,518843,528120,537287,546752,556754,567433,577037,587761,597113,607656,618462,628214,63734 6,646684,656770,666105,676414,687090,696984,706837,717292,727345,737152,746975,756737,766830,776913,787000,796 720,805637,816508,826214,836120,845885,856262,867036,877021,886985,897518,907534,917301,926536,937363,947757,9 58608,968711,979599,990295,999930}
  32. © 2025 NTT TechnoCross Corporation 33 非同期I/Oによる性能向上 • PostgreSQL 18からは非同期I/Oの仕組みが導入された。

    • io_methodパラメータでsync以外を指定することで非同期I/Oを実行する。 設定値 意味 worker ワーカープロセスを使って非同期I/Oを実行する。 デフォルト値。 io_uring io_uring を使って非同期 I/O を実行する。 --with-liburing / -Dliburing を使ったビルドが必要 sync 同期的に実行する。 • シーケンシャルスキャンやビットマップヒープスキャン時に非同期I/Oに よる性能向上効果が見込めるとのこと。 • ただ手元の環境では、非同期I/Oによる性能向上は未確認・・・ • 環境によってはsync(PostgreSQL 17も同様)よりもデフォルト指定のworkerのほうが 処理時間がかかるケースもあった。
  33. © 2025 NTT TechnoCross Corporation 35 項目一覧 • PostgreSQL 18の互換性に影響のある項目(8項目)

    • サーバ変数timezone_abbreviationsチェックする前に、現在のセッションのtime zone abbreviationを優先 • MD5パスワード認証の警告 →次スライドで説明 ★ • 親テーブルを継承した子テーブルを処理するようにVACUUMとANALYZEを変更 • CSVファイルを読み込むときにCOPY FROMが ¥. をファイル終了マーカーとして扱わない ようにする • UNLOGGEDパーティションテーブルを許可しない • GRANT/REVOKEにおけるRULE権限の機能しないサポートの削除 • pg_backend_memory_contexts.parent列を削除 • pg_backend_memory_contexts.levelを1ベースに変更
  34. © 2025 NTT TechnoCross Corporation 36 MD5パスワード認証の警告 • encryption_password=‘md5’ (

    デ フ ォ ル ト 値 は scram-sha-256 ) の 設 定 か つ 、 md5_password_warnings=on(デフォルト値)の状態では、PASSWORD設定時に警告を 出力するようになった。 postgres=# SHOW password_encryption ; password_encryption --------------------- md5 (1 row) postgres=# SHOW md5_password_warnings ; md5_password_warnings ----------------------- on (1 row) postgres=# postgres=# CREATE ROLE foo LOGIN PASSWORD 'foofoo'; WARNING: setting an MD5-encrypted password DETAIL: MD5 password support is deprecated and will be removed in a future release of PostgreSQL. HINT: Refer to the PostgreSQL documentation for details about migrating to another password type. CREATE ROLE postgres=# ALTER ROLE foo PASSWORD 'barbar'; WARNING: setting an MD5-encrypted password DETAIL: MD5 password support is deprecated and will be removed in a future release of PostgreSQL. HINT: Refer to the PostgreSQL documentation for details about migrating to another password type. ALTER ROLE postgres=#
  35. 37 © 2025 NTT TechnoCross Corporation その他の改善項目 • 設定パラメータの変更 •

    psqlの改善 • 接続ログ出力設定 • ローマ数字対応 • numeric型乗算性能向上 個人的に面白いと 思った改善項目も 含みます
  36. © 2025 NTT TechnoCross Corporation 38 設定パラメータの変更 • PostgreSQL 18で追加/削除されたパラメータ(1/3)

    • categoryの変更や初期設定値の差異は除く パラメータ名 種別 変更内容 autovacuum_worker_slots 追加 autovacuum ワーカープロセス用に確保するバックエンドスロットの数 を指定する。デフォルトは 16。 enable_distinct_reordering 追加 入力パスのパスキーと一致するようにDISTINCTキーを並べ替える問い合 わせプランナの機能を有効もしくは無効にする。デフォルトはon。 enable_self_join_elimination 追加 問い合わせツリーを分析し、自己結合を意味的に等価な単一スキャンに置 き換える問い合わせプランナの最適化を有効もしくは無効する。デフォル トはon。 extension_control_path 追加 エクステンションコントロールファイル(name.control)を検索するパス。 file_copy_method 追加 ファイルのコピー方法を指定する。指定できる値はCOPY(デフォルト) またはCLONE。デフォルトはCOPY。 idle_replication_slot_timeout 追加 指定時間以上アイドル状態のレプリケーション・スロットを無効にする。 デフォルトは0。0の場合、アイドル・タイムアウト無効化はしない。 • file_copy_methodの設定値。 • COPY:従来のコピー方法 • CLONE:copy_file_range (Linux、FreeBSD) または copyfile (macOS) を使ってファイルをコピーする。 大規模なデータベースのコピー時にCLONEで高速化できる可能性がある。
  37. © 2025 NTT TechnoCross Corporation 39 設定パラメータの変更 • PostgreSQL 18で追加/削除されたパラメータ(2/3)

    パラメータ名 種別 変更内容 io_max_combine_limit 追加 I/Oを結合する操作における最大のI/Oサイズを制御する、このパラメータ はユーザ設定可能なパラメータio_combine_limitを自動的に制限する。 デフォルトは128kB。 io_max_concurrency 追加 1つのプロセスが同時に実行できるI/O操作の最大数を制御する。デフォル ト設定の -1 は、shared_buffers とプロセスの最大数 (max_connections、autovacuum_worker_slots、 max_worker_processes、max_wal_senders) に基づいた数を選択する (最大64)。 io_method 追加 非同期I/Oの実行方法を選択する。 →「非同期I/Oによる性能向上」スライド参照 io_workers 追加 使用するI/Oワーカー・プロセスの数を選択する。デフォルトは 3 。 io_methodがworkerのときのみ有効。 log_connections 変更 型の変更(boolean→text)、値域の変更 →「接続ログ出力設定」スライド参照 log_lock_failure 追加 ロックの獲得に失敗したときに詳細なログ・メッセージを生成するかどう かを制御する。 PostgreSQL 18では、検索時のNOWAITによるロック失敗のみがサポー トされる。デフォルトはoff。
  38. © 2025 NTT TechnoCross Corporation 40 設定パラメータの変更 • PostgreSQL 18で追加/削除されたパラメータ(3/3)

    パラメータ名 種別 変更内容 max_active_replication_origins 追加 同時に追跡できるレプリケーション起点の数を指定し、サーバ上で作成で きる論理レプリケーションサブスクライバの数を効果的に制限する。 デフォルトは10。 md5_password_warnings 追加 MD5パスワードの非推奨に関する警告を表示するかどうかを制御する →「MD5パスワード認証の廃止」スライド参照 num_os_semaphores 追加 コネクション数 (max_connections)、autovacuum ワーカープロセス数 (autovacuum_max_workers)、WAL senderプロセス数 (max_wal_senders)、バックグラウンドプロセス数 (max_worker_processes) などに基づいて、サーバに必要なセマフォ数 を報告する。このパラメータは読み取り専用である。 oauth_validator_libraries 追加 ロードするトークン検証ライブラリを指定する ssl_ecdh_curve 削除 ssl_groupsに名称変更。 ssl_groups 追加 ssl_ecdh_curveの名前をssl_groupsに変更し、コロンで区切られた複数 のECDHカーブを指定可能にした。 ssl_tls13_ciphers 追加 コロンで区切られた複数の TLSv1.3 暗号スイートを指定可能にした。
  39. © 2025 NTT TechnoCross Corporation 41 psqlの改善 • psql:コマンドラインから使用できるPostgreSQLの標準クライアントユー ティリティ

    • GUIではなく、CUIだが機能は豊富。 • 自分もpsqlは日常的に使っている • PostgreSQL 18でも多くの改善が入っている • 名前付きプリペアドステートメントの解析、バインド、クローズ • パイプラインクエリ用バックスラッシュコマンド • psqlプロンプトにパイプライン状態を追加 • psqlプロンプトに接続サービス名を指定可能 • 全てのリストコマンドで拡張モードを使用するpsqlオプションを追加 • psqlの¥conninfoを表形式に変更 →次スライドで説明 ★ • 変数WATCH_INTERVALを追加 • 他数点あり。
  40. © 2025 NTT TechnoCross Corporation 42 psqlの改善 • ¥conninfoを表形式に変更 •

    PostgreSQL 17:1行のテキスト形式で出力 • PostgreSQL 18:表形式(psqlの拡張表示形式)で出力 postgres=# ¥conninfo You are connected to database "postgres" as user "postgres" via socket in "/tmp" at port "17001". postgres=# testdb=# ¥conninfo Connection Information Parameter | Value ----------------------+---------- Database | testdb Client User | postgres Socket Directory | /tmp Server Port | 18001 Options | Protocol Version | 3 Password Used | false GSSAPI Authenticated | false Backend PID | 11430 TLS Connection | false Superuser | on Hot Standby | off (12 rows)
  41. © 2025 NTT TechnoCross Corporation 43 接続ログ出力設定 • PostgreSQL 18では接続ログをより細かく制御可能になった。

    • 接続ログに新たな種別のログが追加された。 • log_connectionsパラメータのデータ型/値域の変更 バージョン データ型 値域 デフォルト値 PostgreSQL 17 boolean on, off, (1, 0, true, false,yes, no) off PostgreSQL 18 string (後述) (空文字列) • log_disconnectionsパラメータは変更なし • boolean型、値域はon, off
  42. © 2025 NTT TechnoCross Corporation 44 接続ログ出力設定 • PostgreSQL 18のlog_connectionsの値域は、以下の文字列をカンマリスト

    で指定する形式になった。 設定文字列 意味 (空文字列) デフォルト値。 接続に関するログを出力しない。 PostgreSQL 17までのoff(デフォルト)設定と同様の挙動になる。 receipt 受信ログ出力。 接続の受信をログに記録する。 authentication 認証ログ。 認証方式がユーザを識別するために使用した元のIDをログに記録する。 認証に失敗した場合は、この設定の値に関係なく常にログに記録される。 authorization 認可(認証成功)ログ。 認証が正常に完了したことをログに記録する。 setup_durations バックエンド起動時間ログ。 接続の確立とバックエンドの設定に費やされた時間をログに記録する。 PostgreSQL 18で新たに追加されたログ。 all すべてのオプションを指定するのと同等の便利なエイリアス。 他のオプションのリストでallを指定すると、すべての接続の側面がログに記録される。 on, off PostgreSQL 17との互換用設定。 onは、receipt, authentication,authorization の設定に相当する。
  43. © 2025 NTT TechnoCross Corporation 45 接続ログ出力設定 • log_connections=all 指定時のログ出力例

    LOG: connection received: host=[local] LOG: connection authenticated: identity="foo" method=scram-sha-256 (/tmp/pg18/pg_hba.conf:117) LOG: connection authorized: user=foo database=testdb application_name=psql LOG: connection ready: setup total=10.991 ms, fork=0.352 ms, authentication=8.419 ms • ①受信ログ:connection received: • 接続方式を出力する。 • ②認証ログ: connection authenticated: • 認証ID(ロール名)、認証方式も出力する。 • ③認可(認証成功)ログ: connection authorized: • 接続ロール名、データベース名、アプリケーション名も出力する。 • ④バックエンド起動時間ログ:connection ready: • PostgreSQL 18で追加されるログ。 • 起動までのトータルの時間、その内訳(fork時間、認証時間)も出力する。 ① ② ③ ④
  44. © 2025 NTT TechnoCross Corporation 46 ローマ数字対応 • to_number()/to_char()を用いて、ローマ数字と数値との変換 が可能になった。

    • ローマ数字を数値に変換する場合にはto_number()を使う。 • 第1引数:変換したいローマ数字文字列 • 第2引数:’RN’ または ‘FMRN’(どちらを指定しても同じ結果) • 実行例 postgres=# SELECT to_number('XIV', 'RN'); to_number ----------- 14 (1 row) postgres=# SELECT to_number('XIV', 'FMRN'); to_number ----------- 14 (1 row)
  45. © 2025 NTT TechnoCross Corporation 47 ローマ数字対応 • 数値をローマ数字に変換する場合にはto_char()を使う。 •

    第1引数:変換したい数値(値域:1~3999) • 第2引数:’RN’ または ‘FMRN’ • ‘RN’指定時は15文字右寄せの形式の文字列 • ‘FMRN’指定時は左寄せ文字列 • 実行例 postgres=# SELECT to_char(14, 'RN'); to_char ----------------- XIV (1 row) postgres=# SELECT to_char(14, 'FMRN'); to_char --------- XIV (1 row)
  46. © 2025 NTT TechnoCross Corporation 48 numeric型乗算性能向上 • numeric型の乗算時のアルゴリズムを改善した。 •

    これによりPostgreSQLのnumeric型のリグレッションテスト(numeric_big)の実行時間が大 幅に改善した、とのこと。 • 手元の環境での検証結果 • 環境:AWS EC2 (2 CPU, メモリ8GB) • numeric_big テストの実行時間(psql実行時間) バージョン 実行時間(秒) PostgreSQL 17 0.510 PostgreSQL 18 Beta1 0.344
  47. © 2025 NTT TechnoCross Corporation 49 numeric型乗算性能向上 • 手元の環境での検証結果 •

    環境:AWS EC2 (2 CPU, メモリ8GB) • random()をnumericデータ型に型変換→乗算を10万回実行 • 乗算処理の大幅な削減が確認できた。
  48. © 2025 NTT TechnoCross Corporation 51 まとめ • PostgreSQL 18は現在絶賛開発中。

    • I/O並列化による性能向上、仮想生成列・範囲型による制約等の定義機能の追加、統計情報の エクスポート/インポート等の運用機能の追加が取り込まれそう。 • 認証方式としてmd5が基本的に使用できなくなるので注意。 • Beta版をいろいろ試してバグレポ上げてみよう • (たぶん9月後半の)GAリリースをお楽しみに!
  49. © 2025 NTT TechnoCross Corporation 52 参考資料 • PostgreSQL Commitfests

    • リリースノート公開前はここから調べました • https://commitfest.postgresql.org/ • PostgreSQL 18beta1 Documentation Release note • 開発コミュニティの公式リリースノート • 個々の項目からML議論へのリンクもあります • https://www.postgresql.org/docs/18/release.html • PostgreSQL 18 新機能検証結果 (Beta 1)(篠田の虎の巻) • 18の新機能・差分が網羅的に書かれています。日本語版もあるのが嬉しい! • https://github.com/nori-shinoda/documents/blob/main/postgresql_18_beta1_new_features_ja_20250527-1.pdf