PostgreSQL 16 に関する技術情報

このページでは PostgreSQL 16(2023/9/14リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン16 の新機能については「PostgreSQL 16 検証報告」も参照してください。

バージョン16の主要な拡張

PostgreSQL 16 の主な拡張点としては以下があります。

  • パラレルクエリ対応追加
  • 同時データ投入の性能向上
  • SIMD CPUアクセラレータ対応
  • SQL/JSON 対応
  • 整数リテラル表現の追加
  • ICU照合順序の拡張
  • スタンバイ上でのパブリケーション
  • トランザクションの並列適用
  • 双方向ロジカルレプリケーション
  • libpqロードバランス
  • psqlで拡張プロトコル対応
  • pg_dump圧縮オプション追加
  • ページ凍結の改善
  • VACUUMリングバッファ指定
  • Mesonビルド

バージョン16への移行/互換性のない変更点

  1. PL/pgSQL のバウンドカーソル変数の割り当て規則が変更されました。 (Tom Lane) (16)
  2. これまでは、そのような変数の文字列値は、カーソルの割り当て時に変数名と一致するように設定されていて、それがポータル名として使われました。この動作はポータル名の衝突を招きやすい問題がありました。

    これからは、カーソル変数の文字列値(とカーソルのポータル名)は、変数名とは一致しない値が カーソルの OPEN時に設定されます。従来の動作を再現するには、OPENする前にカーソル変数に使用したいポータル名を代入してください。

    (従来の振る舞いを再現する関数定義例)
    CREATE FUNCTION f_get_opened_cur() RETURNS refcursor LANGUAGE plpgsql AS $$
    DECLARE
      c1 CURSOR FOR SELECT tablename FROM pg_tables;
    BEGIN
      c1 := 'c1'; -- この代入を加えると従来動作と同じになる
      OPEN c1;
      RETURN c1;
    END; $$;
    
  3. 主キーむけに NULLS NOT DISTINCT のインデックスを使うことが禁止されました。 (Daniel Gustafsson) (16)
  4. これまでリストアできないダンプが生じる問題がありました。主キーには必ず NOT NULL 制約も付与されますので、NULLS NOT DISTINCT のインデックスを使いたいユースケースは無いと考えられます。

  5. REINDEX DATABASE文と reindexdbコマンドで、システムカタログのインデックスを再構築しなくなりました。 (Simon Riggs) (16)
  6. REINDEX SYSTEM文や、--systemオプションを付与した reindexdbコマンドであれば、引き続きシステムカタログのインデックスを再構築できます。

  7. 継承テーブルとパーティションテーブルにおける GENERATED 式の制限が厳格化されました。 (Amit Langote, Tom Lane) (16)
  8. 親テーブル(パーティションテーブル)と子テーブル(パーティション)の列は、生成列であるかが全て一致していなければなりません。一方で親子で生成列の式が異なることは許容されるようになりました。

  9. pg_walinspect の関数 pg_get_wal_records_info_till_end_of_wal() とpg_get_wal_stats_till_end_of_wal() が廃止されました。 (Bharath Rupireddy) (16)
  10. 引き続きサポートされる pg_get_wal_records_info() と pg_get_wal_stats() 関数のend_lsn 引数に 'FFFFFFFF/FFFFFFFF' を指定すれば、廃止された関数と同じ動作が得られます。

  11. サーバ設定変数 force_parallel_mode は debug_parallel_query に改名されました。 (David Rowley) (16)
  12. ON SELECT の "_RETURN" という名前のルールを作ることでビューを作成する方法が廃止されました。 (Tom Lane) (16)
  13. サーバ設定変数 vacuum_defer_cleanup_age が廃止されました。 (Andres Freund) (16)
  14. hot_standby_feedback とレプリケーションスロットが追加されたことで、これは不要となっていました。

  15. サーバ設定変数 promote_trigger_file が廃止されました。 (Simon Riggs) (16)
  16. これはスタンバイをプライマリに昇格させるのに使われていましたが、現在では pg_ctl promote コマンドや pg_promote() 関数でより容易に実施できます。

  17. 参照専用のサーバ設定変数 lc_collate、lc_ctype が廃止されました。 (Peter Eisentraut) (16)
  18. 照合順序とロケールはデータベースによって異なることがあるため、これらの参照専用サーバ設定変数があっても役に立っていませんでした。

  19. GRANT でロールの継承が追加されたメンバーロールのデフォルトの継承状態を制御するようになりました。 (Robert Haas) (16)
  20. 新たな GRANT ... WITH INHERIT TRUE/FALSE 句により、ロールのデフォルトの継承の動作は置き換えられます。これにより、GRANT するときにメンバーの継承状態を設定することで一部のロールだけ継承させることができます。

    これまでは、メンバーロールの継承状態はロールの INHERIT属性だけで制御されており、その変更は全てのその時点および将来のメンバーロールに影響を与えました。

  21. CREATEROLE属性の権限と他ロールを書き換えできる能力が制限されました。 (Robert Haas) (16)
  22. これまでは CREATEROLE属性のロールは、全ての非スーパーユーザロールのメンバー追加を含む多くの箇所について変更ができました。これからは変更したいロールについて ADMIN OPTION での許諾(GRANT)が必要になります。また、例えば、CREATEDB、REPLICATION、BYPASSRLS 属性を変更するには、自身もそれら属性を持っている場合に限定されるようになります。

  23. postmaster シンボリックリンクが廃止されました。 (Peter Eisentraut) (16)

変更点

サーバ

オプティマイザ
  • インクリメンタルソートが DISTINCT を含む、より多くのケースで使用可能になりました。 (David Rowley) (16)
  • ORDER BY または DISTINCT を持つ集約で、ソート済みデータを利用できるようになりました。 (David Rowley) (16)
  • 新しいサーバ設定変数 enable_presorted_aggregate を使用して、この機能を無効にできます。

  • UNION ALL の最上位ノード(すなわち Append プラン要素の上)でMemoize プラン要素を使用可能になりました。 (Richard Guo) (16)
  • 非NULL入力を内部リレーションとするアンチ結合が実行できるようになりました。 (Richard Guo) (16)
  • FULLハッシュ結合と、内部の RIGHT OUTERハッシュ結合で、並列処理が実行できるようになりました。 (Melanie Plageman, Thomas Munro) (16)
  • オプティマイザで GINインデックスアクセスのコスト見積の精度が向上しました。 (Ronan Dunklau) (16)
性能一般
  • ヒープページとインデックスページをより効率的に追加できるようになりました。 (Andres Freund) (16)
  • 並列に大量データ投入を行うときに性能向上が期待できます。

  • VACUUM処理において、凍結ではない処理(積極的な VACUUMではない場合)でも、必要に応じてページの凍結を実行するようになりました。 (Peter Geoghegan) (16)
  • これにより、テーブル全体の凍結VACUUM の必要性が低くなります。

  • RANGEモードが有効であるが不要な場合に、ウィンドウ関数が内部的により高速な ROWSモードを使用できるようになりました。 (David Rowley) (16)
  • 常に増加するウィンドウ関数 ntile()、cume_dist()、percent_rank() の最適化が可能になりました。 (David Rowley) (16)
  • 集約関数 string_agg() と array_agg() で並列処理できるようになりました。 (David Rowley) (16)
  • RANGEパーティションおよび LISTパーティションの探索が、結果をキャッシュしておくことで、性能改善されました。 (Amit Langote, Hou Zhijie, David Rowley) (16)
  • VACUUM と ANALYZE の共有バッファ使用量の制御が可能となりました。 (Melanie Plageman) (16)
  • VACUUM/ANALYZE文のオプションは「BUFFER_USAGE_LIMIT」で、vacuumdbコマンドのオプションは --buffer-usage-limit です。デフォルト値はサーバ設定変数 vacuum_buffer_usage_limit で設定され、自動VACUUM もこの設定で制御されます。

  • Windowsで「wal_sync_method=fdatasync」がサポートされました。 (Thomas Munro) (16)
  • BRINインデックスの列のみが更新される場合でも、HOT更新が利用可能となりました。 (Matthias van de Meent, Josef Simanek, Tomas Vondra) (16)
  • プロセスタイトルの更新速度が改善されました。 (David Rowley) (16)
  • xid/subxid探索と ASCII文字列検出でベクトル演算が使用できるようになりました。 (Nathan Bossart, John Naylor) (16)
  • ASCII文字列検出は COPY FROM で特に役立ちます。ベクトル演算は、一部の C 配列探索にも使用されます。

  • メモリ割り当てのオーバーヘッドが軽減されました。 (Andres Freund, David Rowley) (16)
モニタリング
  • I/O統計を追跡する pg_stat_io システムビューが追加されました。 (Melanie Plageman) (16)
  • テーブルに対する最後のシーケンシャルスキャンとインデックススキャンに関する統計情報が記録されるようになりました。 (Dave Page) (16)
  • この情報は pg_stat_*_tables およひ pg_stat_*_indexes ビューに表示されます。

  • 新しいページに移動する更新された行の発生に関する統計情報が記録されるようになりました。 (Corey Huinker) (16)
  • pg_stat_*_tablesビューの n_tup_newpage_upd 列で参照できます。

  • 投機的ロックの情報が pg_locks システムビューに追加されました。 (Masahiko Sawada, Noriyoshi Shinoda) (16)
  • トランザクションIDが transactionid 列に、投機的挿入トークンが objid 列に表示されます。

  • pg_prepared_statementsビューにプリペアド文の結果型の表示が加わりました。 (Dagfinn Ilmari Mannsaker) (16)
  • pg_stat_subscription_statsビューの stats_reset列の値を正確にするため、サブスクリプション作成時に統計エントリが作成されるようになりました。 (Andres Freund) (16)
  • 以前は、最初の統計が報告されたときにのみエントリが作成されていました。

  • pg_stat_databaseビューで表示される一時リレーション書き込みのためのI/O の集計が修正されました。 (Melanie Plageman) (16)
  • 以前は、ローカルバッファのフラッシュで書き込み I/O 時間をカウントしていませんでした。

  • セッションのサブトランザクションキャッシュを報告するpg_stat_get_backend_subxact() 関数が追加されました。 (Dilip Kumar) (16)
  • pg_stat_get_backend_idset()、pg_stat_get_backend_activity()、および、関連する関数で、不変のバックエンドID を使用するようになりました。 (Nathan Bossart) (16)
  • 以前は、セッション存続期間中にインデックス値が変更される可能性がありました。

  • pg_stat_activity などの統計情報システムビューで、特別なバックエンド型で表示するようになりました。 (Melanie Plageman) (16)
  • postgresコマンドを --singleオプションでシングルユーザモード起動すると、pg_stat_activityビューの backend_type が「standalone backend」と表示されるようになります。

  • スピンロック遅延を報告する待機イベント SpinDelay が追加されました。 (Andres Freund) (16)
  • 動的共有メモリの割り当て待機を示す新たな待機イベント DSMAllocate が追加されました。 (Thomas Munro) (16)
  • 以前は、このタイプの待機は、mmap() 割り当て待機でも使用される「DSMFillZeroWrite」として報告されていました。

  • ロジカルの walsenderプロセスのコマンドライン文字列にデータベース名が追加されました。 (Tatsuhiro Nakamori) (16)
  • チェックポイント時の LSN と REDO LSN の情報が log_checkpoints 設定によるログメッセージに追加されました。 (Bharath Rupireddy, Kyotaro Horiguchi) (16)
  • クライアント証明書のエラー時に、より詳細に報告するようになりました。 (Jacob Champion) (16)
権限
  • サブスクリプションを作成できる定義済みロール pg_create_subscription が追加されました。 (Robert Haas) (16)
  • パスワードを必要としないサブスクリプションが可能になりました。 (Robert Haas) (16)
  • これは password_required=false オプションで実現されます。

  • LOCK TABLE の権限が単純化されました。 (Jeff Davis) (16)
  • これまで、ユーザが様々なロックレベルで LOCK TABLE を実行できるためには、テーブルにそのロックレベルを要する操作の実行権限が必要でした。例えばテーブルを UPDATEできるユーザは ACCESS SHERE 以外の全てのロックレベルでロックができて、ACCESS SHERE でロックするにはテーブルを SELECTする権限が必要でした。

    これからはより上位のロックレベルでロックが取得可能であれば、より下位のロックも取得可能になります。

  • 「ADMIN OPTION」があれば「GRANT グループ名 TO ユーザ名」も「ALTER GROUP グループ名 ADD USER ユーザ名」も実行できるようになりました。 (Robert Haas) (16)
  • これまでは ALTER 文のときに実行するユーザに CREATEROLE属性が必要でした。

    (15.x 以前のバージョンでは最後の文で「ERROR:  permission denied」になる)
    db1=# CREATE ROLE foo LOGIN;
    db1=# CREATE ROLE bar LOGIN;
    db1=# CREATE ROLE grp1;
    db1=# GRANT grp1 TO foo WITH ADMIN OPTION;
    db1=# \c db1 foo
    You are now connected to database "db1" as user "foo".
    db1=> ALTER GROUP grp1 ADD USER bar;
    GRANT ROLE
    
  • GRANT で WITH ADMIN TRUE / FALSE という構文に対応しました。 (Robert Haas) (16)
  • これまでは WITH ADMIN OPTION のみに対応していました。

  • 他のロールを作成するロールは、新しいロールの権限または新しいロールに「SET ROLE」する能力を、自動的に継承できるようになりました。 (Robert Haas, Shi Yu) (16)
  • これはサーバ設定変数 createrole_self_grant で制御されます。

  • ALTER DEFAULT PRIVILEGES で、継承していないロールのデフォルト権限を変更できないようになりました。 (Robert Haas) (16)
  • これまではロールのメンバーであれば可能でしたが、これからは継承しているロールについてのみ許されます。

  • ロールのメンバー所属を付与するとき、GRANTED BY で指定するロールが適切な権限を持っていることが必要となりました。 (Robert Haas) (16)
  • これはブートストラップ以外のスーパーユーザがロールのメンバー所属を付与する場合でも必要です。

  • 非スーパーユーザが GRANTED BY を使って現在ユーザ以外を指定して権限付与ができるようになりました。 (Robert Haas) (16)
  • ただし、現在ユーザが GRANT BY 指定するユーザから与えられた十分な権限を持っていることは必要です。

  • 「GRANT ロール TO ロール」で SET ROLE を使えるかどうかを制御できるようになりました。 (Robert Haas) (16)
  • これは新たな GRANT ... SET オプションで実現します。これまではメンバー所属を付与されたロールは常に SET ROLE が可能でした。

  • 付与された権限を持つロールの依存関係を追跡するようになりました。 (Robert Haas) (16)
  • 例えば、ADMIN OPTION 削除をするとき、それを使った権限があると、削除に失敗します。CASCADE を使うと依存する権限を剥奪します。

  • GRANT のカタログレコードについて grantor の依存関係の追跡が追加されました。 (Robert Haas) (16)
  • これは pg_auth_members.grantorの値が常に有効であることを保証します。

  • システムカタログで複数のロール所属をあらわすレコードが許容されるようになりました。 (Robert Haas) (16)
  • これまでは新たな所属の付与に対して、以前の一致する所属の付与のレコードを、他の面では必ずしも一致していないものであっても、削除していました。

  • ブートストラップユーザからのスーパーユーザ権限の除去が禁止されました。 (Robert Haas) (16)
  • ダンプからそのようなユーザをリストアするときにはエラーとなります。

  • makeaclitem() が複数の権限名を受け付けるようになりました。 (Robins Tharakan) (16)
  • これまでは、SELECTなど、単一の権限名のみ受け付けました。

サーバ設定
  • Kerberos の認証情報の委任がサポートされました。 (Stephen Frost) (16)
  • これは、サーバ設定変数 gss_accept_delegation と libpq の接続パラメータ gssdelegation で有効化できます。

  • サーバ設定変数 scram_iterations でSCRAM のイテレーション回数を設定できるようになりました。 (Daniel Gustafsson) (16)
  • サーバ設定変数管理の性能が改善しました。 (Tom Lane) (16)
  • サーバ設定変数がリセットできるかについて制限を厳格化しました。 (Masahiko Sawada) (16)
  • 設定変数にリセットできないことを示す NO_RESET という属性が追加されました。これまでは、transaction_isolation のような一部の設定変数が RESET ALL の影響を受けない一方、不適切な状況で個別にリセットができました。

  • いくつかの postgresql.conf 要素が新たなカテゴリに移動しました。 (Shinya Kato) (16)
  • pg_settingsビューで表示されるカテゴリにも影響があります。「Connections and Authentication / TCP Settings」というカテゴリが追加され、tcp_keepalives_* と client_connection_check_interval がそこに移動しています。

  • 設定ファイルが 10階層を越えて再帰アクセスする(include した設定ファイルから更に include する)ことが防止されました。 (Julien Rouhaud) (16)
  • autovacuum がより高頻度に遅延設定の変更に従うようになりました。 (Melanie Plageman) (16)
  • autovacuum_vacuum_cost_delay などの設定変更について、各リレーションへの処理開始時に反映するのではなく、各ブロックへの処理ごとに反映するようになりました。

  • アーカイブステータスファイルが永続的にファイル名変更される制限が廃止されました。 (Nathan Bossart) (16)
  • これからはファイル名変更にあたりストレージ同期命令を実行しなくなります。そのため、システムクラッシュ後に既にアーカイブされたファイルについてarchive_command のコマンドが呼び出されることが発生しやすくなります。

  • archive_library と archive_command が同時に設定されることが防止されました。 (Nathan Bossart) (16)
  • これまでは archive_library が優先されていました。

  • マスタプロセス(postmaster)が子プロセスを ABORTシグナルで停止できるようになりました。 (Tom Lane) (16)
  • これによりコアダンプを子プロセスを含めて収集することができます。これは設定変数 send_abort_for_crash と send_abort_for_kill で制御されます。マスタプロセスの -T オプションは send_abort_for_crash を有効に設定するのと同じ意味になります。

  • 役に立っていない、マスタプロセス(postmaster)の -n オプションが廃止されました。 (Tom Lane) (16)
  • pg_use_reserved_connections のメンバーであるロールに対して、予約された接続枠を設けることができるようになりました。 (Nathan Bossart) (16)
  • 予約枠数はサーバ設定変数 reserved_connections で設定します。

  • Windows 10 のより新しいバージョンで huge pages が動作するようになりました。 (Thomas Munro) (16)
  • Windows 10 バージョン 1703 以降で huge_pages を有効にするために必要となる特別な処理が追加されました。

  • 開発者むけの設定 debug_io_direct が追加されました。 (Thomas Munro, Andres Freund, Bharath Rupireddy) (16)
  • これは主に開発者向けの設定ですが、本設定追加に連動して既存設定の動作変更があります。wal_sync_method=open_sync または wal_sync_method=open_datasync で、wal_level=minimal であるとき、ダイレクトI/O を使用しなくなりました。debug_io_direct=wal と指定すると、旧来通りダイレクトI/O が有効になります。

  • WALファイル名のセグメント値とタイムライン値を報告する関数 pg_split_walfile_name() が追加されました。 (Bharath Rupireddy) (16)
pg_hba.conf
  • pg_hba.conf のデータベース項目とロール項目で正規表現マッチングがサポートされました。 (Bertrand Drouvot) (16)
  • 正規表現パターンには先頭にスラッシュ(/)が付きます。 スラッシュで始まるデータベース名とロール名を pg_hba.conf で参照する場合は二重引用符で囲む必要があります。

  • pg_ident.conf のユーザ列の処理が pg_hba.conf と一致するよう改善されました。 (Jelte Fennema) (16)
  • 具体的には all、+ が付加されたロールメンバーシップ、先頭にスラッシュを使用した正規表現のサポートが追加されます。これらのパターンに一致するユーザ名は二重引用符で囲む必要があります。

  • pg_hba.conf と pg_ident.conf でファイルのインクルードができるようになりました。 (Julien Rouhaud) (16)
  • これらは include、include_if_exists、include_dir によって制御されます。 システムビュー pg_hba_file_rules、pg_ident_file_mappings にファイル名が表示されるようになりました。

  • pg_hba.conf でトークンの長さの制限が無くなりました。 (Tom Lane) (16)
  • システムビュー pg_hba_files_rules にルール番号(rule_number)とマップ番号(map_number)が追加されました。 (Julien Rouhaud) (16)
多言語対応
  • initdb で ICU を使用するときにロケールからデフォルトエンコーディングを決定するようになりました。 (Jeff Davis) (16)
  • 以前のデフォルトは常に UTF-8 でした。

  • CREATE DATABASE と CREATE COLLATION の LOCALEオプションと initdb と createdb の --localeオプションが、libc 以外の照合順序プロバイダを制御するようになりました。 (Jeff Davis) (16)
  • 以前は、libcプロバイダのみを制御していました。

  • 事前定義された照合順序として unicode と ucs_basic が追加されました。 (Peter Eisentraut) (16)
  • これは ICU サポートが有効の場合のみ機能します。

  • カスタムICU照合順序ルールを作成できるようになりました。 (Peter Eisentraut) (16)
  • これは、CREATE COLLATION の新しい RULES句と、CREATE DATABASE、createdb、initdb の新しいオプションを使用して行なわれます。

  • Windows でシステムロケールを自動的にインポートできるようになりました。 (Juan Jose Santamaria Flecha) (16)
  • 以前は、Windows 上では ICU ロケールのみインポートできました。

ロジカルレプリケーション

  • スタンバイでのロジカルデコーティングができるようになりました。 (Bertrand Drouvot, Andres Freund, Amit Khandekar) (16)
  • スナップショットの WALレコードはロジカルスロットの作成に必要ですが、スタンバイでは作成できません。遅延を回避するために、新しい関数 pg_log_standby_snapshot() により、そのようなレコードの作成が可能になりました。

  • ロジカルデコーディングのパブリッシャーが変更を転送する方法と、サブスクライバーが変更を適用する方法を制御するためのサーバ設定変数 debug_logical_replication_streaming が追加されました。 (Shi Yu) (16)
  • 論理レプリケーションの初期テーブル同期で行をバイナリ形式でコピーできるようになりました。 (Melih Mutlu) (16)
  • これはバイナリと印付けされたサブスクリプションに対してのみ可能です。

  • 論理レプリケーションのパラレル適用が可能になりました。 (Hou Zhijie, Wang Wei, Amit Kapila) (16)
  • CREATE SUBSCRIPTION の STREAMINGオプションで、パラレルワーカーによる大規模トランザクションの適用を可能にする値 parallel がサポートされました。パラレルワーカーの数は新しいサーバ変数 max_parallel_apply_workers_per_subscription で制御されます。待機イベント LogicalParallelApplyMain、LogicalParallelApplyStateChange、LogicalApplySendData も追加されましたパラレル動作を追跡するために、pg_stat_subscriptionシステムビューにleader_pid列が追加されました。

  • 主キーを使用しない論理レプリケーション適用のパフォーマンスが向上しました。 (Onder Kalaci, Amit Kapila) (16)
  • 具体的には、REPLICA IDENTITY FULL はテーブルをシーケンシャルスキャンして一致を見つけるのではなく、Btreeインデックスを使用できるようになりました。

  • 論理レプリケーションサブスクライバが、オリジンを持たない変更のみを処理できるようになりました。 (Vignesh C, Amit Kapila) (16)
  • これを使用することでレプリケーションループが回避できます。これは新しい CREATE SUBSCRIPTION ... ORIGIN オプションによって制御されます。

  • 論理レプリケーションの SELECT および DMLアクションをテーブル所有者として実行するようになりました。 (Robert Haas) (16)
  • これからは、サブスクリプションの所有者はスーパーユーザであるか、レプリケーションセット内のテーブルを所有するロールの全てに SET ROLE権限を持っている必要があります。

    これまでは、全ての操作がサブスクリプション所有者の権限で実行されていました。CREATE SUBSCRIPTION の run_as_owner オプションで以前の動作にすることもできます。

  • wal_retrieve_retry_interval 設定がサブスクリプション単位で動作するようになりました。 (Nathan Bossart) (16)
  • 以前はリトライ時間がグローバルに適用されていました。 待機イベント LogicalRepLauncherDSA と LogicalRepLauncherHash も追加されました。

ユーティリティコマンド

  • EXPLAIN のオプションとして、パラメータ化されたクエリの汎用プランを表示する GENERIC_PLAN が追加されました。 (Laurenz Albe) (16)
  • COPY FROM で列の DEFAULT に値を割り当てできるようになりました。 (Israel Barth Rubio) (16)
  • 以下のように指定すると、データファイル中の「\D」というフィールドにはテーブルの列のデフォルト値が使われます。

    COPY t83 FROM '/tmp/t83.dat' WITH (DEFAULT '\D');
    
  • 外部テーブルへの COPY で行をバッチ追加できるようになりました。 (Andrey Lepikhov, Etsuro Fujita) (16)
  • postgres_fdw オプションの batch_size で制御します。

  • CREATE TABLE で STORAGEタイプ(列の保管モード)を指定できるようになりました。 (Teodor Sigaev, Aleksander Alekseev) (16)
  • 以前は ALTER TABLE のみで制御できました。

  • 外部テーブルでの TRUNCATEトリガーがサポートされました。 (Yugo Nagata) (16)
  • VACUUM と vacuumdb で TOASTテーブルだけ処理することができるようになりました。 (Nathan Bossart) (16)
  • VACUUM で PROCESS_MAIN をオフにするか、vacuumdb で --no-process-main オプションを使用して実現できます。

  • VACUUM に凍結に関するデータベース全体の統計情報の更新を制御するオプションが追加されました。 (Tom Lane, Nathan Bossart) (16)
  • オプションは更新を全てスキップする SKIP_DATABASE_STATS と、凍結の統計情報更新のみを行う ONLY_DATABASE_STATS です。

  • REINDEX DATABASE と REINDEX SYSTEM で引数を指定しなくてもよくなりました。 (Simon Riggs) (16)
  • 以前はデータベース名を指定する必要がありました。

  • CREATE STATISTICS で統計名を省略できるようになりました。 (Simon Riggs) (16)
  • 指定されていない場合には統計名が自動で生成されます。

データ型

  • 16進数、8進数、2進数の整数リテラルを受け入れるようになりました。 (Peter Eisentraut) (16)
  • 例えば 0x42F、0o273、0b100101 などと書けます。

  • NUMERIC が任意サイズの 16進数、8進数、2進数の整数を処理できるようになりました。 (Dean Rasheed) (16)
  • これまで、これら非10進数では 8バイト整数のみがサポートされていました。

  • 数値の定数でアンダースコア(_) が書けるようになりました。 (Peter Eisentraut, Dean Rasheed) (16)
  • これにより桁数の大きい数値の可読性を改善できます。

    (アンダースコアを 3桁区切りに使う例)
    db1=# SELECT 123_456_789.012_345_678 AS num;
             num
    ---------------------
     123456789.012345678
    (1 row)
    
  • 日付時刻の入力に「+infinity」を受け付けるようになりました。 (Vik Fearing) (16)
  • これまでは同じ意味で「infinity」だけ受け入れられました。

  • 日付時刻の文字列で他のフィールドと一緒に「epoch」や「infinity」を指定することが禁止されました。 (Joseph Koshakow) (16)
  • これまでは混在指定可能で、「epoch」や「infinity」が優先して解釈されていました。

    (以下は 15.x 以前の挙動/これからはエラーになる)
    db1=# SELECT date '1995-08-06 infinity';
       date
    ----------
     infinity
    (1 row)
    
  • ドキュメント化されていない「YyearMmonthDday」形式での日付の入力が廃止されました。 (Joseph Koshakow) (16)
  • (15.x まで可能であった日付形式/これからはエラーになる)
    db1=# SELECT date 'Y2023M09D14';
        date
    ------------
     2023-09-14
    (1 row)
    
  • 型変換エラーを検査する関数 pg_input_is_valid()、pg_input_error_info() が追加されました。 (Tom Lane) (16)
  • (以下のように使用できます)
    db1=# SELECT t.*, pg_input_is_valid(val, typ), err.* FROM
            (VALUES ('3.1', 'text'), ('3.1', 'real'), ('3.1', 'int')) AS t (val, typ),
    		LATERAL pg_input_error_info(val, typ) err;
     val | typ  | pg_input_is_valid |                   message                    | detail | hint | sql_error_code
    -----+------+-------------------+----------------------------------------------+--------+------+----------------
     3.1 | text | t                 |                                              |        |      |
     3.1 | real | t                 |                                              |        |      |
     3.1 | int  | f                 | invalid input syntax for type integer: "3.1" |        |      | 22P02
    (3 rows)
    

問い合わせ

  • FROM句にある副問い合わせで別名を省略できるようになりました。 (Dean Rasheed) (16)
  • これにより「SELECT * FROM (SELECT 1 + 1) s1;」を「SELECT * FROM (SELECT 1 + 1);」と書くことができます。

  • SQL/JSON PATH で拡張された数値リテラルに対応しました。 (Peter Eisentraut) (16)
  • 例えば、16進数、8進数、2進数の整数や、数字の間にアンダースコアを書くことに対応しています。

関数

  • SQL/JSON のコンストラクタが追加されました。 (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Amit Langote) (16)
  • SQL標準に準拠した新たな関数 JSON_ARRAY()、JSON_ARRAYAGG()、JSON_OBJECT()、JSON_OBJECTAGG() が加わりました。

  • SQL/JSON のオブジェクト検査が追加されました。 (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Amit Langote, Andrew Dunstan) (16)
  • 新たな「IS JSON」述語は、JSON の値、配列、オブジェクト、スカラ、ユニークキーの検査を行います。

  • JSON の文字列解析でベクター操作を使用できるようになりました。 (John Naylor) (16)
  • これは長い JSON文字列の解析を高速化します。

  • 全文検索の検索結果の強調を行う ts_headline() 関数の処理をORおよび NOT式に対して改善しました。 (Tom Lane) (16)
  • これまでは予期せぬ結果が生じることがありました。

  • timestamptz値の加算、減算、生成を行う関数が追加されました。 (Przemyslaw Sztoch, Gurjeet Singh) (16)
  • 具体的な関数名は date_add()、date_subtract()、generate_series() です。

  • date_trunc(unit, timestamptz, time_zone) 関数が IMMUTABLE に変更されました。 (Przemyslaw Sztoch) (16)
  • これにより本関数を使って式インデックスを作成できます。

  • サーバ変数 SYSTEM_USER が追加されました。 (Bertrand Drouvot) (16)
  • 例えば、pg_ident.conf に以下のマッピング定義があって、

    # MAPNAME     SYSTEM-USERNAME       PG-USERNAME
    map1          osfoo                 pgfoo
    

    pg_hba.conf に以下のエントリがあるとして、

    # TYPE  DATABASE   USER    ADDRESS    METHOD
    local   db1        all                peer  map=map1
    

    以下のように認証方式と認証時のユーザが報告されます。

    $ psql -q -d db1 -U pgfoo
    Password for user foo:
    db1=> SELECT SYSTEM_USER;
     system_user
    -------------
     peer:osfoo
    (1 row)
    
  • 関数 array_sample()、array_shuffle() が追加されました。 (Martin Kalcher) (16)
  • それぞれ、ランダムに指定個数取り出し、ランダム並び替え、の機能を持ちます。

    db1=# SELECT array_sample('{a,b,c,d,e,f,g,h,i,j,k}'::text[], 3);
     array_sample
    --------------
     {k,i,b}
    (1 row)
    
    db1=# SELECT array_shuffle('{a,b,c,d,e,f,g,h,i,j,k}'::text[]);
          array_shuffle
    -------------------------
     {d,c,k,a,f,h,e,j,i,b,g}
    (1 row)
    
  • 集合からどれか一つの値を返す集約関数 ANY_VALUE() が追加されました。 (Vik Fearing) (16)
  • 正規分布に基づく乱数の関数 random_normal() が追加されました。 (Paul Ramsey) (16)
  • 誤差関数 erf() と相補誤差関数 erfc() が追加されました。 (Dean Rasheed) (16)
  • numeric型の power() 関数で整数指数における精度が改善されました。 (Dean Rasheed) (16)
  • XMLSERIALIZE() に出力を整形するオプション「INDENT」が追加されました。 (Jim Jones) (16)
  • pg_collation_actual_version() がデフォルトの照合順序において適切な値を返すように変更されました。 (Jeff Davis) (16)
  • これまでは NULL を返していました。

  • pg_read_file() と pg_read_binary_file() が無いファイルを無視できるようになりました。 (Kyotaro Horiguchi) (16)
  • filename と missing_ok の 2引数の呼び出しが可能になりました。これまでは 4引数の場合に限って、missiong_ok を指定できました。

  • pg_size_bytes() の単位指定にバイト単位をあらわす「B」が追加されました。 (Peter Eisentraut) (16)
  • to_reg* 関数群(to_regclass など)が OID の数値を受け付けるようになりました。 (Tom Lane) (16)

PL/pgSQL

  • PL/pgSQL で現在の関数の OID を取得できるようになりました。 (Pavel Stehule) (16)
  • 「GET DIAGNOSTICS variable = PG_ROUTINE_OID」で取得できます。

libpq

  • libpq の接続オプション require_auth が追加されました。受け入れ可能な認証方式のリストを指定するものです。 (Jacob Champion) (16)
  • これは所定の認証方式を禁止するためにも使用できます。

  • libpq で指定した複数のホストからランダムに選んで接続できるようになりました。 (Jelte Fennema) (16)
  • 接続オプションで「load_balance_hosts=random」を指定して有効化します。これはロードバランシングのために利用できます。

  • libpq の接続オプション sslcertmode が追加されました。クライアント証明書のサーバへの送信を制御します。 (Jacob Champion) (16)
  • 指定できるオプション値は disable、allow、require です。

  • libpq が証明書の検証にシステム証明書プールを利用できるようになりました。 (Jacob Champion, Thomas Habets) (16)
  • 「sslrootcert=system」で有効になります。この指定により「sslmode=verify-full」がデフォルトで有効になります。

クライアントアプリケーション

  • ECPG の変数宣言で、未予約の SQLキーワードに一致する typedef名が利用可能になりました。 (Tom Lane) (16)
  • この変更により、C の typedef 名に一致するキーワードが、後の EXEC SQL ブロックでキーワードとして処理されるのを防ぎます。

psql
  • psql が拡張テーブル形式(expandedモード)での見出し線の最大幅を制御できるようになりました。 (Platon Pronko) (16)
  • これは出力オプション xheader_width で制御します。

  • psql にロールのメンバーシップの詳細を表示する \drg コマンドが追加されました。 (Pavel Luzanov) (16)
  • これに伴い \du と \dg の出力から「Member of」列が取り除かれました。

  • psql のアクセス権限を表示するコマンドで、システムオブジェクトについて表示できるようになりました。 (Nathan Bossart) (16)
  • 具体的なコマンドオプションは \dpS と \zS です。

  • psql の \d+ で外部テーブルの子テーブルやパーティションに対して、FOREIGN 表示が加わりました。 (Ian Lawrence Barwick) (16)
  • psql の \df+ が関数のソースコードを表示しないようになりました。 (Isaac Morland) (16)
  • 関数本体(関数のソースコード)は \sf でより容易に参照できます。

  • psql が拡張問い合わせプロトコルを使って問い合わせを実行できるようになりました。 (Peter Eisentraut) (16)
  • 問い合わせに引数値を渡すには psql の新たなコマンド \bind を使用します。

  • psql の \watch で実行回数を指定できるようになりました。 (Andrey Borodin) (16)
  • \watch はオプション名で指定できるようになりました。

    (従来の指定書式:10秒ごと実行する)
    db1=# \watch 10
    
    (新たな指定書式:10秒ごと 100回だけ実行する)
    db1=# \watch interval=10 count=100
    
  • psql の \watch で不正な指定値を検知するようになりました。また、ゼロ指定を遅延なしという意味で受け入れるようになりました。 (Andrey Borodin) (16)
  • これまでは不正な指定値は 1秒間隔を指定したものとして処理されていました。

  • psqlスクリプトでシェルコマンドや問い合わせの終了ステータスを取得できるようになりました。 (Corey Huinker, Tom Lane) (16)
  • 新たな psql制御変数 SHELL_ERROR、SHELL_EXIT_CODE で実現されます。

  • 様々な SQL文について psql のタブ補完が改善されました。 (Vignesh C, Aleksander Alekseev, Dagfinn Ilmari Mannsaker, Shi Yu, Michael Paquier, Ken Kato, Peter Smith) (16)
pg_dump
  • pg_dump が子テーブルやパーティションのダンプを制御できるようになりました。 (Gilles Darold) (16)
  • 新たなオプション --table-and-children、--exclude-table-and-children、--exclude-table-data-and-children が追加されました。

  • pg_dump と pg_basebackup の Zstandard による圧縮で、longモードが使用できるようになりました。 (Justin Pryzby) (16)
  • 「--compress=zstd:long」のように指定して使用します。

  • pg_dump が LZ4 および Zstandard による圧縮に対応しました。 (Georgios Kokolatos, Justin Pryzby) (16)
  • pg_dump がより整合的な圧縮指定書式に対応しました。 (Georgios Kokolatos) (16)
  • 具体的には「--compress=gzip:5」のようなオプションに対応しました。

サーバアプリケーション

  • initdb に作成するデータベースクラスタ内の postgresql.conf に書かれるサーバ設定変数を指定するオプションが追加されました。 (Tom Lane) (16)
  • 本オプションは「-c name=value」です。これは複数回指定できます。

    (使用例)
    $ initdb -D /data/pgdata -c port=5444 -c logging_collector=on
    
  • createuserコマンドにユーザ属性を制御するオプションが追加されました。 (Shinya Kato) (16)
  • 具体的には、新たなオプションで valid until(パスワードが無効になる日時)、Bypass RLS(行単位セキュリティを無視できるか)、ロールメンバーシップを指定できます。

  • createuserコマンドの --role オプションが非推奨になりました。 (Nathan Bossart) (16)
  • このオプションは混乱を招きやすいため、新たに同じ働きをする --member-of オプションが追加されました。--role オプションも今のところ使用可能です。

  • vacuumdbコマンドで処理対象スキーマを制御できるようになりました。 (Gilles Darold) (16)
  • 新たな --schema および --exclude-schema オプションで制御されます。

  • vacuumdbコマンドの性能改善のため、VACUUM の新たなオプションを使用するようになりました。 (Tom Lane, Nathan Bossart) (16)
  • VACUUM のオプションとして SKIP_DATABASE_STATS と ONLY_DATABASE_STATS が加わりました。

  • pg_upgrade が新たなクラスタのロケールとエンコーディングを設定するようになりました。 (Jeff Davis) (16)
  • これにより新たなクラスタを同じロケールとエンコーディングの設定で作成する必要がなくなりました。

  • pg_upgrade にデフォルトの転送方式を指定する --copy オプションが追加されました。 (Peter Eisentraut) (16)
  • これまでは --link (-k) を指定しないことでコピー方式になっていました。

  • pg_basebackup が数値の圧縮オプションを受け付けるようになりました。 (Georgios Kokolatos, Michael Paquier) (16)
  • 「--compress=server-5」といった指定がサポートされます。

  • pg_basebackup で、データベースクラスタディレクトリ(PGDATA)に置かれた in-place テーブルスペースの扱いが修正されました。 (Robert Haas) (16)
  • これまでは tar形式のベースバックアップが取得できませんでした。

    なお、in-place テーブルスペースは引き続きテスト目的の位置づけであって、実運用システムむけに推奨される構成ではありません。

  • pg_waldumpコマンドにフルページのイメージをダンプするオプション --save-fullpage が追加されました。 (David Christensen) (16)
  • pg_waldumpコマンドの --timeline (-t) オプションが 16進数値を受け付けるようになりました。 (Peter Eisentraut) (16)
  • pg_verifybackupコマンドで進行状況を報告できるようになりました。 (Masahiko Sawada) (16)
  • pg_rewindコマンドがタイムライン変更を適切に追跡できるようになりました。 (Heikki Linnakangas) (16)
  • これまでは、pg_rewind がタイムライン切り替えの後であるけれどチェックポイントが実行される前のタイミングで実行されると、巻き戻しが不要であると誤った判断をするかもしれませんでした。

  • pg_receivewal と pg_recvlogical が SIGTERM で正常に終了するようになりました。 (Christoph Berg) (16)
  • このシグナルは systemd でしばしば使われます。

ソースコード

  • ICU をサポートするビルドオプションがデフォルトになりました。 (Jeff Davis) (16)
  • --with-icu フラグが削除され、--without-icu フラグが追加されました。

  • x86-64アーキテクチャで SSE2 (Streaming SIMD Extensions 2) ベクトル操作がサポートされました。 (John Naylor) (16)
  • ARMアーキテクチャで Advanced SIMD (Single Instruction Multiple Data) (NEON)命令がサポートされました。 (Nathan Bossart) (16)
  • MSVC による Windowsバイナリビルドで "RandomizedBaseAddress" (ASLR) を使用するようになりました。 (Michael Paquier) (16)
  • MinGW ビルドでは既に有効になっています。以前に Windows 8 や Server 2012 で ASLR を有効にすることでプロセス生成で問題が生じるケースがあったため、ASLR が無効化されていました。

  • 拡張ライブラリのシンボルがデフォルトでエクスポートされるのを防止しました。 (Andres Freund, Tom Lane) (16)
  • これからはコアバックエンドや他の拡張から呼び出す必要のある関数には、明示的に PGDLLEXPORT の印付けをすることが必要となります。

  • PostgreSQL を動作させる Windowsプラットフォームとして、Windows 10 以降のバージョンが必要になりました。 (Michael Paquier, Juan Jose Santamaria Flecha) (16)
  • Windows Server であれは Server 2016 以降に相当します。これまでは Windows Vista や Windows XP がサポートされていました。

  • PostgreSQL のビルドと動作に Perl バージョン 5.14 以降が必要となりました。 (John Naylor) (16)
  • PostgreSQL ビルドに Bison バージョン 2.3 以降が必要となりました。 (John Naylor) (16)
  • PostgreSQLビルドに Flex バージョン 2.5.35 以降が必要となりました。 (John Naylor) (16)
  • GSSAPI サポートのために (明示的に) MIT Kerberos が必要となりました。 (Stephen Frost) (16)
  • PostgreSQLビルドで Visual Studio 2013 のサポートが廃止されました。 (Michael Paquier) (16)
  • PostgreSQL動作プラットフォームとして HP-UX のサポートが廃止されました。 (Thomas Munro) (16)
  • PostgreSQL動作プラットフォームとして HP/Intel Itanium のサポートが廃止されました。 (Thomas Munro) (16)
  • PostgreSQL動作プラットフォームとして M68K、M88K、M32R および SuperH CPUアーキテクチャのサポートが廃止されました。 (Thomas Munro) (16)
  • libpq で SCM証明書認証のサポートが廃止されました。 (Michael Paquier) (16)
  • 本認証方式のバックエンド側でのサポートは PostgreSQL 9.1 時点で廃止されています。

  • mesonビルドシステムに対応しました。 (Andres Freund, Nazir Bilal Yavuz, Peter Eisentraut) (16)
  • 最終的には Autoconf と Windows での MSVCビルドシステムを置き換える予定です。

  • ビルドシステムから使われる opensslバイナリの位置を指定できるようになりました。 (Peter Eisentraut) (16)
  • configure や meson のオプションで指定できます。

  • 小さいセグメントファイルでテストできるビルドオプションが追加されました。 (Andres Freund) (16)
  • オプションは --with-segsize-blocks と -Dsegsize_blocks です。

  • 開発者向けツール pgindent のオプションが追加されました。 (Andrew Dunstan) (16)
  • 新たなオプションは、--show-diff、--silent-diff、--commit、--help です。--exclude オプションは複数指定できるようになりました。また、typedefファイルを明示的に指定することが必要になりました。オプション --code-base と --build は廃止されました。

  • 開発者むけツール pg_bsd_indent がソースコードのメインツリーに追加されました。 (Tom Lane) (16)
  • make_ctags と make_etags が改善されました。 (Yugo Nagata) (16)
  • 処理効率(格納バイト数の節約)のために pg_attribute システムテーブルの列が調整されました。 (Peter Eisentraut) (16)

追加モジュール

  • 拡張で提供される boolean型の列に対するインデックスの使用についてオプティマイザが改善されました。 (Zongliang Quan, Tom Lane) (16)
  • これまで boolean について本体付属の Btree および Hashインデックスに限って最適化が行われていました。

  • contrib/fuzzystrmatch で Daitch-Mokotoff Soundex がサポートされました。 (Dag Lem) (16)
  • contrib/auto_explain で SQL文のパラメータ値をログ出力できるようになりました。 (Dagfinn Ilmari Mannsaker) (16)
  • これは、サーバ側の PREPARE/EXECUTE とクライアント側での parse/bind を使う問い合わせに影響があります。ログ出力は auto_explain.log_parameter_max_length で制御されます。デフォルトは -1 で、パラメータ値は出力されません。

  • contrib/auto_explain の log_verbose モードが compute_query_id値を出力するようになりました。 (Atsushi Torikoshi) (16)
  • これまで compute_query_id が有効であっても、query ID を出力しませんでした。

  • contrib/ltree で ltreeラベルの最大長が 256 から 1000 に変更され、ラベルにハイフン(-)も使用可能になりました。 (Garen Torikian) (16)
  • contrib/pg_stat_statements がユーティリティコマンドについて定数の正規化をするようになりました。 (Michael Paquier) (16)
  • DECLARE、EXPLAIN、CREATE MATERIALIZED VIEW、CREATE TABLE AS について正規化されるようになっています。

  • contrib/pg_walinspect の関数 pg_get_wal_block_info() が WALブロック情報を報告できるようになりました。 (Michael Paquier, Melanie Plageman, Bharath Rupireddy) (16)
  • contrib/pg_walinspect の関数 pg_get_wal_records_info() と pg_get_wal_stats() が末尾 LSN の処理が変更されました。 (Bharath Rupireddy) (16)
  • これまでは存在しない WAL位置であるとエラーになりましたが、これからは存在する WAL の一番最後までと解釈されます。

  • contrib の pg_walinspect と pg_waldump で WALレコードの詳細な記述が追加されました。 (Melanie Plageman, Peter Geoghegan) (16)
  • contribg/pageinspect で複数ページの統計情報を報告する関数 bt_multi_page_stats() が追加されました。 (Hamid Akhtar) (16)
  • これは bt_page_stats() と似ていますが、ページの範囲を指定してレポートすることができます。

  • contrib/pageinspect で関数 brin_page_items() の出力に、空の範囲であるかを示す empty列が追加されました。 (Tomas Vondra) (16)
  • アーカイブモジュールがより柔軟に再設計されました。 (Nathan Bossart) (16)
  • 初期化の方法が変更されたため、以前の PostgreSQLバージョンむけに書かれたモジュールは更新する必要があります。

  • contribg/pg_stat_statements で拡張問い合わせプロトコルにおいて、行数(rows)の追跡が不正確であったものが修正されました。 (Sami Imseih) (16)
  • contrib/pg_buffercache で使用量の合計を報告する関数 pg_buffercache_usage_counts() が追加されました。 (Nathan Bossart) (16)
  • contrib/pg_buffercache でバッファの統計情報を要約して報告する関数 pg_buffercache_summary() が追加されました。 (Melih Mutlu) (16)
  • 拡張のスクリプトで、新しい構文「@extschema:referred_extension_name@」を使用して、必要とする拡張のスキーマを参照できるようになりました。 (Regina Obe) (16)
  • 拡張のコントロールファイルに no_relocate オプションを使用することで、必要とする(requires指定する)拡張に対して再配置不可であると印付けできるようになりました。 (Regina Obe) (16)
  • これにより「@extschema:referenced_extension_name@」が拡張のライフタイム中、定数として扱われるようになります。

postgres_fdw
  • contrib/postgres_fdw が並列処理でアボートできるようになりました。 (Etsuro Fujita) (16)
  • これは postgres_fdw のオプション parallel_abort で有効になります。

  • contrib/postgres_fdw による外部テーブルの ANALYZE がより効率的になりました。 (Tomas Vondra) (16)
  • postgres_fdw のオプション analyze_samplingでサンプリング方法を制御します。

  • contrib/postgres_fdw で reg* 型(regclass、regconfig など)の定数の送出を、送出可能と印付けされた組み込みオブジェクトまたは拡張モジュールを参照するものだけに限定するようになりました。 (Tom Lane) (16)
  • contrib の postgres_fdw と dblink で、接続確立中の割り込みを処理するようになりました。 (Andres Freund) (16)