このページでは PostgreSQL 18(2025/9/25リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン18 の新機能については「PostgreSQL 18 検証報告」も参照してください。
バージョン18の主要な拡張
PostgreSQL 18 の主な拡張点としては以下があります。
- 非同期 I/O
- B-tree インデックスのスキップスキャン
- プランナ改善(WHERE 句内に OR 条件がある場合の最適化、ほか)
- GIN インデックスの並列作成
- 大量のテーブルアクセス時のロック処理の改善
- 組み込み照合順序 pg_unicode_fast
- メジャーバージョンアップ時のプランナ統計情報の移行・チェック処理の並列化オプション/–swap オプションの追加
- 仮想生成列の追加
- 更新系 DML の RETURNING 句へ OLD, NEW の追加
- UUID v7 関数の追加
- 非決定論的な照合順序利用時のLIKE句のサポート
- CASEFOLD 関数の追加
- 各種制約の追加(WITHOUT OVERLAPS、ほか)
- ラージオブジェクトに対するデフォルト権限設定のサポート
- TLS v1.3 暗号スイートの追加
- postgres_fdw、dblink への SCRAM 認証のパススルーオプションの追加
- プランナ統計情報のダンプ/リストア
- EXPLAIN 文の強化
- pg_stat_all_tables への VACUUM、ANALYZE 総実行時間の追加
- 接続単位での I/O・WAL 利用量の取得
- 論理レプリケーション時の書き込み衝突の情報詳細化
バージョン18への移行/互換性のない変更点
- initdbがデフォルトでチェックサム有効になりました。 (Greg Sabino Mullane) (18)
- タイムゾーン省略形(GMT、JSTなど)の処理が変更されました。 (Tom Lane) (18)
- MD5による認証およびパスワード格納の方式が非推奨になりました。 (Nathan Bossart) (18)
- VACUUMとANALYZEが継承子テーブルを処理するようになりました。 (Michael Harris) (18)
- CSVファイルを読むときに、COPY FROM が「\.」をファイル終端マーカーと扱わないようになりました。 (Daniel Verite, Tom Lane) (18)
- UNLOGGEDパーティションテーブルが禁止されました。 (Michael Paquier) (18)
- AFTERトリガを、トリガイベントがキューに入った時点で有効なロールで、実行するようになりました。 (Laurenz Albe) (18)
- GRANT/REVOKEコマンドで RULE権限が廃止されました。 (Fujii Masao) (18)
- システムビューpg_backend_memory_contextsのparent列が削除されました。 (Melih Mutlu) (18)
- システムビューpg_backend_memory_contextsのlevel列と、pg_log_backend_memory_contexts() 関数で、番号が1から始まるようになりました。 (Melih Mutlu, Atsushi Torikoshi, David Rowley, Fujii Masao) (18)
- 全文検索で設定ファイルや辞書ファイルを読むときに、常にlibc を使うのではなく、データベースクラスタのデフォルトの照合順序プロバイダを使うようになりました。 (Peter Eisentraut) (18)
これを無効にするための新たなオプション --no-data-checksums が追加されました。pg_upgrade を使う場合に、新旧データベースクラスタでチェックサムの有無を一致させるため、チェックサム無効の旧データベースクラスタに本オプションを指定する必要があります。
日付時刻データの処理に際して、timezone_abbreviations設定よりも、IANA時間帯データベース(tzdata)に基づく現在セッションのタイムゾーンの省略形を優先するようになりました。これまでは timezone_abbreviations設定を優先して、解釈が行なわれていました。
タイムゾーン省略形を含んだ日付時刻をあらわす文字列を読み込ませるときに、バージョン間で結果の差異が発生する可能性があります。
(実行例)
17.x では「ERROR: invalid input syntax for type timestamp with time zone」となる
db1=# SET timezone TO 'Asia/Tokyo';
db1=# SELECT 'Wed Jan 01 00:00:00 1000 LMT'::timestamptz;
timestamptz
------------------------------
1000-01-01 00:00:00+09:18:59
(1 row)
md5方式はバージョン18.x 時点では使用可能ですが、今後のメジャーバージョンで廃止される予定です。
md5方式を使う場合、CREATE ROLEやALTER ROLE などのコマンドでWARNING が出力されるようになります。これは新たな設定項目md5_password_warningsをoff にすることで抑止できます。
新たなオプションONLYを使うと従来の動作(子テーブルについては処理しない)にできます。
psqlでSTDINからCSVファイルを読むときには、引続きファイル終端マーカー(EOFマーカー)として扱います。以前のバージョンのpsqlからPostgreSQL 18のサーバに接続して「\copy」を実行するときに非互換の問題に遭遇するかもしれません。
加えて、本バージョンから「\.」を単独行として書くことが必須となりました。以前は行末に書く方法が認められていました。
以前は ALTER TABLE SET [UN]LOGGED を実行できましたが何の効果もありませんでした。パーティションテーブル(親テーブル)自体はデータを持ちませんし、パーティション(子テーブル)が自動でUNLOGGEDになることもありませんでした。
これからはパーティションテーブルをUNLOGGEDにするコマンドはエラーになります。パーティションをUNLOGGEDにすることは引続き可能です。
これまでは、トリガ実行時(例えばCOMMIT時)に有効なロールで実行されました。特に、トリガイベント発生時とトリガ実行時の間でロールの変更が有る場合に、振る舞いが変わります。
機能としてはPostgreSQL 8.2の時点で無効になっていて、RULE権限をGRANT/REVOKEしても何の効果もありませんでした。テーブルにRULE を付与できるのは所有者とスーパーユーザのみです。
pg_backend_memory_contextsに親コンテキストの連なりを示すpath列が加わったため、これは不要になりました。
これまでは0から始まる番号でした。
libc以外の照合順序プロバイダ(icu やbuiltin)をデフォルトとしているデータベースクラスタでは、いくつかの全文検索の関数とpg_trgm拡張でLC_CTYPEによる文字の処理が変わってきます。
pg_upgradeで本バージョンにアップグレードする場合、全文検索やpg_trgmに関するインデックスは、バージョンアップ後に全て再作成することが推奨されます。
変更点
サーバ
オプティマイザ
- 不要なテーブルの自己結合が自動的に除去されるようになりました。 (Andrey Lepikhov, Alexander Kuzmenkov, Alexander Korotkov, Alena Rybakina) (18)
- WHERE句における一部のIN (VALUES ...)を、オプティマイザがより適切な統計情報を活用できるようにx = ANY...へ変換するようになりました。 (Alena Rybakina, Andrei Lepikhov) (18)
- OR句が配列に変換され、インデックス処理が高速化されるようになりました。 (Alexander Korotkov, Andrey Lepikhov) (18)
- INTERSECT、EXCEPT、ウィンドウ集約関数、ビューの列の別名の処理がそれぞれ高速化されました。 (Tom Lane, David Rowley) (18)
- SELECT DISTINCTにおいて、ソート処理を回避するためにキーの順序が内部的に並び替えられるようになりました。 (Richard Guo) (18)
- 他の列に関数的に従属する列は、GROUP BY句から自動的に除外されるようになりました。 (Zhang Mingli, Jian He, David Rowley) (18)
- GROUPING SETSの一部のHAVING句が、WHERE句にプッシュダウンされるようになりました。 (Richard Guo) (18)
- generate_series()におけるnumeric型やtimestamp型の値に対する行数の見積もりが改善されました。 (David Rowley, Song Jinzhou) (18)
- オプティマイザがRight Semi Joinプランを使用できるようになりました。 (Richard Guo) (18)
- マージ結合でインクリメンタルソートが使用できるようになりました。 (Richard Guo) (18)
- 多数のパーティションにアクセスする問合せの実行プラン作成において、効率が改善されました。 (Ashutosh Bapat, Yuya Watari, David Rowley) (18)
- より多くのケースでパーティション単位の結合ができるようになりました。また、メモリ使用量も削減されました。 (Richard Guo, Tom Lane, Ashutosh Bapat) (18)
- パーティションテーブルへの問合せで、プラン作成時のコスト推定が改善されました。 (Nikita Malakhov, Andrei Lepikhov) (18)
- SQL言語の関数のプランキャッシュが改善されました。 (Alexander Pyhalov, Tom Lane) (18)
- プランナで機能無効化の処理が改善されました。 (Robert Haas) (18)
この最適化は、設定パラメータenable_self_join_eliminationを使用して無効にすることができます。
この変換は特定の条件(定数値で構成され、1列のみを含む VALUES リストなど)に該当する場合に限り適用されます。
(実行例)
db1=# CREATE TABLE tbl (a INT);
db1=# INSERT INTO tbl VALUES (2);
db1=# EXPLAIN SELECT * FROM tbl WHERE a IN (VALUES (1), (2), (3));
QUERY PLAN
-----------------------------------------------------
Seq Scan on tbl (cost=0.00..45.06 rows=38 width=4)
Filter: (a = ANY ('{1,2,3}'::integer[]))
(2 rows)
この最適化は、enable_distinct_reorderingを使って無効にすることもできます。
GROUP BY句に、あるテーブルの一意インデックスを構成するすべての列と、それ以外の列が含まれている場合、その「それ以外の列」は冗長とみなされ、グルーピングの対象から除外されるようになりました。この動作は、これまでも 遅延不可な主キーに対しては適用されていましたが、今回からより広く適用されるようになりました。
これにより、より早い段階での行のフィルタリングが可能になりました。また、本リリースではGROUPING SETSを使用した一部のクエリで、以前は誤った結果が返されることがありましたが、修正されました。特に、GROUPING SETSとDISTINCT ONの併用、あるいはORDER BYとの併用において、NULLの扱いに起因する誤った結果が発生していた問題が解消されています。
(実行例) (17.xでは以下) db1=# SELECT DISTINCT ON (a, b) a, b FROM (VALUES (1, 1), (2, 2)) AS t(a, b) WHERE a = b GROUP BY GROUPING SETS ((a, b), (a)); a | b ---+--- 1 | 1 2 | 2 (2 rows) (18では以下) a | b ---+--- 1 | 1 1 | 2 | 2 2 | (4 rows) (17.xでは以下。ORDER BYでNULLを含む列の扱いが不十分で、誤った順序が返される) db1=# SELECT a, b FROM (VALUES (1, 1),(2, 2)) AS t(a, b) WHERE a = b GROUP BY CUBE (a, (a, b)) ORDER BY b, a; a | b ---+--- 1 | 1 1 | 1 1 | 2 | 2 2 | 2 2 | | (7 rows) (18では以下) a | b ---+--- 1 | 1 1 | 1 2 | 2 2 | 2 1 | 2 | | (7 rows)
§ §これまでtimestamp型やnumeric型では、たとえ入力が定数であっても常にデフォルトの1000行と見積もられていましたが、本リリース以降は入力値に基づいて実際の行数を正確に推定できるようになりました。
セミジョインは、少なくとも1件の一致が存在するかどうかを判定する目的で使用されます。
これまではプラン作成に際して同値クラスの導出句が線形探索されており、対象のテーブル数やパーティション数が多い問合せでプラン作成時間が増大しました。
探索にハッシュテーブルを利用する等の高速化が適用されました。
これまでは、パーティション単位の結合(partitionwise join)を使用できるかどうかの判断が、問合せで明示的に記述された結合条件に基づいて行われていて、実際は可能であるのに適用されないことがありました。これからは、同値クラスに基づき判断されます。
また、パーティションの組み合わせごとの結合で確保されるメモリを各結合の完了後に解放するようになりました。
結果として、これまでよりもIndex Scan、および、パラメータ化Nested Loopが選択されやすくなっています。
これまでは、SQL関数内で作成した実行プランは問合せが終了すると全て破棄されていました。今回の変更で、SQL関数に対してもPostgreSQLのプランキャッシュ基盤を利用できるようになりました。
付随して、SQL関数の戻り値は関数内の最後の文によって生成されるという規則が厳格化されました。これまでは最後のSQL文が「DO INSTEAD NOTHING」で実行されなかった場合に手前の問い合わせ結果が返されることがありましたが、この挙動は廃止されました。
db1=# CREATE TEMP TABLE t14 (x int); -- 関数定義用に1回だけ事前作成
db1=# CREATE FUNCTION f14() RETURNS void LANGUAGE SQL AS $$
CREATE TEMP TABLE IF NOT EXISTS t14 (x int);
INSERT INTO t14 VALUES (1); $$;
(→ この関数はバージョン17.x以前だと実行できない)
また、下記のように関数内でDDL(データ定義言語)を実行すると、関数内の後続のSQL文に反映されるようになりました。
enable_seqscanなど、実行プランで特定方式を有効/無効化する設定パラメータ群は、これまでは無効化する方式のプランノードに大きなコスト値(100億)を加算して、選択されないようにしていました。
本改善でコスト値を加えるのではなく無効であることを別途管理するようになりました。これにより巨大なコスト値が生じる実行プランでも無効化指定が確実に働きます。
インデックス
- btreeインデックスのスキップスキャンに対応しました。 (Peter Geoghegan) (18)
- パーティションキーやマテリアライズドビューの同時リフレッシュ用に、btree以外のアクセスメソッドのユニークインデックスが使用可能になりました。 (Mark Dilger) (18)
- GINインデックスの並列作成が可能になりました。 (Tomas Vondra, Matthias van de Meent) (18)
- GiSTおよびbtreeインデックスアクセスメソッドにソートサポート関数が追加されて、範囲型に対するインデックス作成が高速化されました。 (Bernd Helmle) (18)
スキップスキャンは、複数列のインデックスを範囲検索する際に、範囲全体のリーフページを走査するのではなく、不要な領域を飛ばして効率的に検索する手法です。
これにより、インデックスに含まれる最初の方の列に検索条件がなくて、以降の列に有用な検索条件がある場合に、インデックスが使われやすくなります。
引続き、使用するインデックスタイプは等価性(「=」演算子)をサポートしていなければなりません。
17.xまでは並列作成に対応していたのはbtreeとBRINインデックスのみでした。
特に範囲型へのGiSTインデックス作成で性能向上が期待できます。
性能一般
- 非同期I/Oサブシステムが追加されました。 (Andres Freund, Thomas Munro, Nazir Bilal Yavuz, Melanie Plageman) (18)
- 多数のリレーションにアクセスするクエリのロック性能が改善されました。 (Tomas Vondra) (18)
- ハッシュ結合とGROUP BYのパフォーマンスが向上され、メモリ使用量が削減されました。 (David Rowley, Jeff Davis) (18)
- 通常のVACUUMでもすべてが可視なページ上のタプルをFREEZEできるようなりました。 (Melanie Plageman) (18)
- VACUUMコマンド実行時のファイルの末尾切り詰めを制御するサーバ変数vacuum_truncateが追加されました。 (Nathan Bossart, Gurjeet Singh) (18)
- effective_io_concurrencyとmaintenance_io_concurrencyのデフォルト値が16 に引き上げられました。 (Melanie Plageman) (18)
これにより、バックエンドは複数の読み取り要求をキューにまとめて処理できるようになり、シーケンシャルスキャン、ビットマップヒープスキャン、バキューム処理などがより効率的に実行できます。この機能は新たな設定パラメータio_methodによりデフォルトで有効化されており、制御用にio_combine_limitおよびio_max_combine_limitが追加されました。
また、fadvise()システムコールをサポートしないシステムであってもeffective_io_concurrencyやmaintenance_io_concurrencyに0より大きい値を設定して効果を得ることができるようになりました。
新たなシステムビューpg_aiosから非同期I/Oに使用されているファイルハンドルの状況を確認できます。
PostgreSQLではテーブル等を参照するだけで最も弱いACCESS SHAREテーブルロックが発生します。このような弱いロックを簡易的に高速に行う仕組みがこれまでも用意されていましたが、1つのセッションにつき固定的に16個の要素(テーブルやインデックス)しか扱えませんでした。そのため、多数のテーブルにアクセスする問い合わせは、ロック処理が負担になっていました。典型的には大きなパーティションテーブルへの問い合わせが該当します。PostgreSQL 18 から、この上限数が固定的なものではなくなり、設定max_locks_per_transactionで与えられるようになりました。
加えて、EXCEPT演算子でのハッシュセット処理や、サブプラン値のハッシュ検索もパフォーマンスが向上されました。
この変更により、 後続のテーブル全体へのFREEZEの作業を軽減できます。FREEZEの積極度は、設定パラメータvacuum_max_eager_freeze_failure_rateによって制御できます。この設定はサーバ全体またはテーブル単位で指定できます。
従来は同名のパラメータで切り詰めを行うかをストレージレベルでのみ制御可能でしたが、vacuum_truncateの設定でVACUUM実行時に切り詰めるか否かを指定できるようになりました。
従来のデフォルト値では現代のハードウェアにおけるI/O並列性を十分に活かせませんでした。今回の変更により、クエリやメンテナンス作業が利用可能なI/O並列度をより効果的に活用できるようになりました。
モニタリング
- サーバ変数log_connectionsのログの粒度を指定できるようになりました。 (Melanie Plageman) (18)
- log_connectionsに接続段階の処理時間を報告するオプションが追加されました。 (Melanie Plageman) (18)
- log_line_prefixにクライアントIPアドレスを出力できる%Lエスケープが追加されました。 (Greg Sabino Mullane) (18)
- ロック取得失敗をログに出力するサーバ変数log_lock_failuresが追加されました。 (Yuki Seino, Fujii Masao) (18)
- pg_stat_all_tablesにVACUUM/ANALYZEの実行時間を報告するカラムが追加されました。 (Sami Imseih) (18)
- VACUUMとANALYZEに遅延時間を報告する機能が追加されました。 (Bertrand Drouvot, Nathan Bossart) (18)
- ANALYZE VERBOSEの出力にWAL、CPU使用、平均読み書きレート(MB/s)の統計が追加されました。 (Anthonin Bonnefoy) (18)
- VACUUM/ANALYZE (VERBOSE)と自動バキュームのログ出力に、WALバッファがいっぱいになった回数も記録されるようになりました。 (Bertrand Drouvot) (18)
- バックエンドごとのI/O統計のレポート機能が追加されました。 (Bertrand Drouvot) (18)
- pg_stat_ioビューにI/Oアクティビティをバイト単位で報告する列が追加されました。 (Nazir Bilal Yavuz) (18)
- pg_stat_ioビューの出力にWALのI/Oアクティビティについての行が追加されました。 (Nazir Bilal Yavuz, Bertrand Drouvot, Michael Paquier) (18)
- 設定パラメータtrack_wal_io_timingで制御する、WAL I/O所要時間の追跡を参照できる場所がpg_stat_walビューからpg_stat_ioビューに変更されました。 (Bertrand Drouvot) (18)
- pg_stat_walビューからwal_write、wal_sync、wal_write_time、wal_sync_time列が削除されました。 (Bertrand Drouvot) (18)
- バックエンドごとのWAL統計を返すpg_stat_get_backend_wal()関数が追加されました。 (Bertrand Drouvot) (18)
- PGDATA/pg_wal/summariesディレクトリの内容を具体的に一覧表示するpg_ls_summariesdir()関数が追加されました。 (Yushi Ogiwara) (18)
- pg_stat_checkpointerビューに、実際に実行したチェックポイントの回数を示すnum_done列が追加されました。 (Anton A. Melnikov) (18)
- pg_stat_checkpointerビューに、SLRUバッファの書き込み回数を示すslru_written列が追加されました。 (Nitin Jadhav) (18)
- pg_stat_databaseビューに、並列クエリのワーカーの情報を示す列が追加されました。 (Benoit Lobreau) (18)
- クエリIDの計算時、定数リスト内のすべての値ではなく、先頭と末尾の定数のみを考慮するようになりました。 (Dmitry Dolgov, Sami Imseih) (18)
- クエリIDの計算方法が調整され、同じリレーション名を使用するクエリは、スキーマが異なっても同一クエリのグループとして扱われるようになりました。 (Michael Paquier, Sami Imseih) (18)
- pg_backend_memory_contextsビューにtype列が追加されました。 (David Rowley) (18)
- pg_backend_memory_contextsビューにpath列が追加されました。 (Melih Mutlu) (18)
従来はboolean値で接続ログの有無のみを制御していましたが、今回の変更により、より詳細なログ出力の粒度を指定できるようになりました。従来のboolean値も引き続きサポートされます。
今回の変更により、log_connectionsに新しいオプションsetup_durationsが追加され、クライアント接続の各段階で要した時間をログ出力できるようになりました。接続処理の性能やタイミングを詳細に把握可能になりました。
SELECT...NOWAITがロック取得に失敗した場合の情報をログに出力できるようになりました。これにより、ロック失敗の原因を把握しやすくなりました。
pg_stat_all_tablesおよびその派生ビューが修正され、手動および自動のVACUUMとANALYZEに費やされた時間を表示できるようになりました。
(追加されたカラムの一覧) - total_vacuum_time - total_autovacuum_time - total_analyze_time - total_autoanalyze_time
この情報は、サーバログ、システムビューpg_stat_progress_vacuumおよびpg_stat_progress_analyze、VERBOSEモード時のVACUUMとANALYZEの出力にあらわれます。これを報告させるには設定パラメータtrack_cost_delay_timingを有効にします。
(出力例 - 特に追加された部分) db1=# ANALYZE VERBOSE t32; (中略) INFO: finished analyzing table "db1.public.t32" avg read rate: 26.042 MB/s, avg write rate: 15.625 MB/s buffer usage: 169 hits, 10 reads, 6 dirtied WAL usage: 7 records, 5 full page images, 30023 bytes, 0 buffers full system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
統計はpg_stat_get_backend_io()経由でアクセス可能です。バックエンドごとのI/O統計はpg_stat_reset_backend_stats()でクリア可能です。
追加された列は read_bytes、write_bytes、extend_bytesです。常にBLCKSZに等しかったop_bytes列は削除されました。
これにはWAL receiverのアクティビティと、その書き込みに対する待機イベントも含まれます。
この統計はpg_stat_reset_backend_stats()関数でクリアできます。
上記のPGDATAはデータベースクラスタディレクトリを意味します。
既存のnum_timedおよびnum_requested列は、実際に実行したものだけでなくスキップされたチェックポイントもカウントしています。追加したnum_doneではスキップされたものはカウントせず、実行したチェックポイントのみカウントします。
また、チェックポイント完了時に出力されるサーバログのメッセージも変更され、共有バッファとSLRUバッファの書き込み件数がそれぞれ個別に報告されるようになりました。なお、以前のpg_stat_checkpointerビューでは、チェックポイント完了時に出力されるサーバログとは異なる数のバッファ書き込みを出力することがありましたが、これはpg_stat_checkpointerビューはSLRUバッファの書き込みをカウントしていないためでした。
新たに追加された列は、起動する予定だった並列ワーカー数を示すparallel_workers_to_launchと、実際に起動された並列ワーカー数を示すparallel_workers_launchedです。
クエリIDは例えば、pg_stat_statementsで利用されます。以前はリストの要素数が違うと異なるクエリIDが割り当てられていましたが、通常同じIDが割り当てられることが望ましいため、今回の変更が加わりました。
異なるスキーマにある同名テーブルが異なる列を持つ場合であっても、クエリが同じであれば同一クエリのグループとして扱われます。
以前はクエリIDの計算にOID(オブジェクト識別子)を利用していましたが、これにより例えば同名のテーブルの作成と削除を繰り返して使用した場合にも、それらのテーブルに対する同じクエリにそれぞれ別のクエリIDが割り振られていました。これは通常ユーザが期待する動作ではなかったため、この調整が加わりました。
これにより、メモリコンテキストの親子関係が正確に把握できるようになりました。
権限
- データベースのアクセス権限の詳細を取得する関数pg_get_acl()が追加されました。 (Joel Jacobson) (18)
- ラージオブジェクトの権限を確認する関数has_largeobject_privilege()が追加されました。 (Yugo Nagata) (18)
- ALTER DEFAULT PRIVILEGES文でラージオブジェクトのデフォルト権限を設定できるようになりました。 (Takatsuka Haruka, Yugo Nagata, Laurenz Albe) (18)
- ロールpg_signal_autovacuum_workerが追加されました。 (Kirill Reshke) (18)
この関数は、カタログを参照せずに、データベースオブジェクトの権限を確認する際に有用です。
これまでもGRANT文、REVOKE文で権限指定ができましたが、ラージオブジェクト1個ごとに行う必要がありました。
スーパーユーザー権限を持たないユーザーでも、このロールがあれば自動バキュームを実行するプロセスにシグナルを送信することができるようになりました。
サーバ設定
- OAuth認証方式をサポートしました。 (Jacob Champion, Daniel Gustafsson, Thomas Munro) (18)
- サーバ変数ssl_tls13_ciphersを追加し、コロンで区切られた複数のTLSv1.3暗号スイートを指定できるようになりました。 (Erica Zhang, Daniel Gustafsson) (18)
- サーバ変数ssl_groupsのデフォルトにCurve25519を含むように変更しました。 (Daniel Gustafsson, Jacob Champion) (18)
- サーバ変数ssl_ecdh_curveの名前をssl_groupsに変更し、コロンで区切られた複数のECDH曲線を指定できるようになりました。 (Erica Zhang, Daniel Gustafsson) (18)
- クエリのキャンセル要求を256ビットのキーで実行可能になりました。 (Heikki Linnakangas, Jelte Fennema-Nio) (18)
- サーバ変数autovacuum_worker_slotsが追加され、自動バキュームを実行するバックグラウンドプロセスの最大数を指定できるようになりました。 (Nathan Bossart) (18)
- 自動バキュームのトリガとなるデッドタプルの固定数を指定できるようになりました。 (Nathan Bossart, Frédéric Yhuel) (18)
- サーバ変数max_files_per_processがカウントする対象プロセスが変更され、バックエンドプロセスによって開かれたファイルのみを制限するようになりました。 (Andres Freund) (18)
- 必要なセマフォの数を報告するサーバ変数num_os_semaphoresが追加されました。 (Nathan Bossart) (18)
- 新たな設定パラメータextension_control_pathが追加されました。これにより拡張のコントロールファイル(.control)を置くパスを複数指定できます。 (Peter Eisentraut, Matheus Alcantara) (18)
これにより、pg_hba.confにoauth認証方式、libpq APIのOAuthオプション、トークン検証ライブラリをロードするためのサーバ変数oauth_validator_libraries、そしてコンパイル時に必要なライブラリを追加するためのconfigureコマンドのフラグ--with-libcurl が追加されました。
以前の変数名も引き続き機能します。
これによりブルートフォース攻撃が成功する可能性が低くなりました。256ビットのキーは、サーバとクライアントが、このリリースで導入された、ワイヤプロトコルバージョン3.2 をサポートしている場合にのみ可能です。それ以外の場合は、従来どおり4バイトのキーが利用されます。
この変数が導入されたことで、autovacuum_max_workersをサーバを再起動せずに、この最大数まで変更できます。
サーバ変数はautovacuum_vacuum_max_thresholdです。autovacuum_vacuum_threshold、autovacuum_vacuum_scale_factorを利用した従来の閾値設定では、行数の多いテーブルのバキューム頻度が低くなる問題がありましたが、この変数により改善が見込めます。引き続きパーセンテージ指定もトリガに使用できます。
以前は、postmasterによって開かれたファイルもこの制限にカウントされていました。
max_connectionsなどの設定値に基づいて必要なセマフォの数を計算します。これにより必要なOSの設定値を簡単に把握することが可能になりました。以前は、ドキュメントに記載の式を利用する必要がありましたが、新しくセマフォが必要なコンポーネントが追加された場合などにドキュメントの更新がされていない場合などがあり、ドキュメントに従っても必要数を正しく計算できないことがありました。
ストリーミングレプリケーションとリカバリ
- 新たな設定パラメータidle_replication_slot_timeoutでアクティブでないレプリケーションスロットを自動的に無効化できるようになりました。 (Nisha Moond, Bharath Rupireddy) (18)
- 設定パラメータmax_active_replication_originsが追加されました。有効なレプリケーションオリジンの最大数を制御します。 (Euler Taveira) (18)
タイムアウトになったレプリケーションスロットは、pg_replication_slotビューでwal_statusが「lost」になってWALの保持が行なわれなくなり、invalidation_reasonに「idle_timeout」と理由が示されます。
これまではmax_replication_slots設定で最大数が規定されていましたが、バージョン18からレプリケーションスロットの最大数とは別個に設定できるようになりました。
論理レプリケーション
- 論理レプリケーションで生成列の値を送出できるようになりました。 (Shubham Khanna, Vignesh C, Zhijie Hou, Shlok Kyal, Peter Smith) (18)
- CREATE SUBSCRIPTIONのstreamingオプションのデフォルトがoffからparallelに変更されました。 (Vignesh C) (18)
- ALTER SUBSCRIPTIONがレプリケーションスロットの2相コミット動作を変更できるようになりました。 (Hayato Kuroda, Ajin Cherian, Amit Kapila, Zhijie Hou) (18)
- 論理レプリケーションの変更を適用するときのコンフリクトをログ記録するようになりました。 (Zhijie Hou, Nisha Moond) (18)
パブリケーションで列リストが指定されている場合には指定すれば生成列もレプリケーションされます。列リストが指定されていない場合に生成列を含めるかどうかは、パブリケーションの新たなオプションpublish_generated_columnsの指定に従います。なお、これらに対応するのはSTORED生成列のみで、仮想生成列(VIRTUAL生成列)は対象外です。
これまでは、論理レプリケーションでパブリッシャ側からの生成列の送出はサポートされておらず、サブスクライバ側で元となる列から計算させる構成にする必要がありました。
これまではCREATE SUBSCRIPTIONでtwo_phaseオプションを指定できましたが、後からは変更できませんでした。
また、pg_stat_subscription_statsビューの新たな列でも種別ごとにコンフリクト発生回数が報告されるようになりました。「confl_insert_exists」など、コンフリクトの種類ごとに「confl_」で始まる列がいくつか追加されています。
ユーティリティコマンド
- 仮想生成列(VIRTUAL生成列)がサポートされました。こちらが生成列のデフォルトになります。 (Peter Eisentraut, Jian He, Richard Guo, Dean Rasheed) (18)
- DMLコマンドのRETURNING句で「OLD」と「NEW」がサポートされました。 (Dean Rasheed) (18)
- ローカルデータベース上の既存テーブルをLIKE句で指定して、外部テーブルを作成できるようになりました。 (Zhang Mingli) (18)
- 非決定論的(deterministic = false)な照合順序において、LIKE演算子が利用可能になりました。 (Peter Eisentraut) (18)
- 非決定論的(deterministic = false)な照合順序において、テキスト位置検索関数が利用可能になりました。 (Peter Eisentraut) (18)
- 組み込みの照合順序プロバイダにロケール「PG_UNICODE_FAST」が追加されました。 (Jeff Davis) (18)
- VACUUMとANALYZEがパーティションテーブルをパーティション(子テーブル)抜きに処理できるようになりました。 (Michael Harris) (18)
- リレーション毎、および、列毎にプランナ統計を変更する関数が追加されました。 (Corey Huinker) (18)
- ファイルコピーの方法を指定する設定パラメータfile_copy_methodが追加されました。 (Nazir Bilal Yavuz) (18)
仮想生成列は、その列が読まれたときに値を計算して生成します。列の値がテーブルのデータとして書き込まれることはありません。生成した値を書き込む動作をさせるには「STORED」オプションを指定してください。
これまではRETURNING句は、INSERTとUPDATEに対しては新たな値のみを、DELETEに対しては古い値のみを、MERGEに対しては処理内容に応じた値を返していました。
新たなRETURNING句では、特別な別名OLD、NEWを用いて明示的に新旧の値を返すようになりました。識別子の衝突を避けるため、OLD、NEWの別名を変更することもできます。
(例)
db1=# UPDATE t1 SET v = 'A' WHERE id <= 3 RETURNING WITH (OLD AS o, NEW AS n)
o.id AS old_id, o.v AS old_v, n.id AS new_id, AS n.v new_v;
old_id | old_v | new_id | new_v
--------+----------------------------------+--------+-------
1 | c4ca4238a0b923820dcc509a6f75849b | 1 | A
2 | c81e728d9d4c2f636f067f89cc14862c | 2 | A
3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 | 3 | A
(3 rows)
これまではCREATE FOREIGN TABLEにLIKE句は使用できませんでした。リモートデータベースにpublic.t1があり、同定義のテーブルpublic.t1がローカルデータベースにあるとき、以下のように外部テーブルを作成できます。
db2=# CREATE FOREIGN TABLE ft1 ( LIKE public.t1 )
SERVER sv1_db1 OPTIONS ( table_name 't1', schema_name 'public');
これまでは「ERROR: nondeterministic collations are not supported for ...」というエラーが出ていました。利用可能になった関数は以下の通りです。
position() strpos() replace() split_part() string_to_array() string_to_table()
このロケールに対応する照合順序「pg_unicode_fast」は、ASCII以外の大文字小文字マッピングをサポートする一方、ソートは自然言語の辞書順ではなくコードポイント順です。
(initdbでこれを指定するときの例) $ initdb --locale-provider=builtin --builtin-locale=PG_UNICODE_FAST -E UTF8 -D $PGDATA
新たなオプションONLYを指定して、そのような動作にすることができます。autovacuumはパーティション(子テーブル)のみを処理対象とするため、パーティションテーブル(親テーブル)だけに追加でANALYZEを行いたい場合に便利です。
ONLYでパーティションテーブルのみの VACUUM を指定した場合、何もしないという動作になります。
追加された関数は以下の通りです。これらはプランナ統計情報のダンプ・リストアで使われます。
pg_restore_relation_stats() pg_restore_attribute_stats() pg_clear_relation_stats() pg_clear_attribute_stats()
この設定値は「CREATE DATABASE ... STRATEGY=FILE_COPY」コマンドと、「ALTER DATABASE ... SET TABLESPACE ...」コマンドで、ファイルをコピーするときの動作に影響します。OSが対応していれば、デフォルトのCOPYに替えてCLONEを指定することで高速化が狙えます。
制約
- 範囲型や多重範囲型の列に対して、重なりを持たないという条件を、主キー制約、ユニークキー制約、外部キー制約に指定できるようになりました。 (Paul A. Jungwirth) (18)
- チェック制約と外部キー制約で「NOT ENFORCED」を指定できるようになりました。 (Amul Sul) (18)
- 主キーと外部キーの関係において、両方とも決定論的照合順序であるか、同一の非決定論的照合順序であることが必要になりました。 (Peter Eisentraut) (18)
- 「NOT NULL」指定がシステムテーブルpg_constraintに格納されるようになりました。 (Alvaro Herrera, Bernd Helmle) (18)
- ALTER TABLEでNOT NULL制約をNOT VALIDで作成して、データの検査を先送りできるようになりました。 (Rushabh Lathia, Jian He) (18)
- 継承親テーブルのNOT NULL制約が継承対象かどうかを指定できるようになりました。 (Suraj Kharage, Alvaro Herrera) (18)
- パーティションテーブルで外部キー制約をNOT VALIDで設定できるようになりました。 (Amul Sul) (18)
- パーティションテーブルにALTER TABLE .. DROP CONSTRAINT ..で制約を除去するときに、ONLYを指定できるようになりました。 (Alvaro Herrera) (18)
これは「PRIMARY KEY」と「UNIQUE」に対しては新たな「WITHOUT OVERLAPS」句で、外部キー制約に対しては新たな「PERIOD」句で、指定します。いずれも対象とできるのは制約の最後の列です。
(外部キー制約の例)
db1=# CREATE EXTENSION btree_gist;
db1=# CREATE TABLE t77m (cid int, age_r int4range,
PRIMARY KEY (cid, age_r WITHOUT OVERLAPS));
db1=# CREATE TABLE t77t (id int PRIMARY KEY, cid int, age_r int4range,
FOREIGN KEY (cid, PERIOD age_r) REFERENCES t77m (cid, PERIOD age_r));
db1=# INSERT INTO t77m VALUES (1, '[0,6)'), (2, '[6,12)'), (3, '[12,)');
db1=# INSERT INTO t77t VALUES (100, 3, '[12,)'); -- 範囲が一致している場合
db1=# INSERT INTO t77t VALUES (101, 2, '[9,11)'); -- 範囲内に収まっている場合
db1=# INSERT INTO t77t VALUES (102, 1, '[,10)'); -- 範囲をはみ出している場合
ERROR: insert or update on table "t77t" violates foreign key constraint "t77t_cid_age_r_fkey"
DETAIL: Key (cid, age_r)=(1, (,10)) is not present in table "t77m".
対応して、システムテーブルpg_constraintにconenforced列が加わりました。「NOT ENFORCED」であると制約が働かない動作になります。
非互換の変更点と言えます。pg_dumpによるダンプのリストア(これはpg_upgrade内でも使われます)は、この条件を満たさないと失敗します。対処にはデータベースの定義変更が必要となります。
これからはNOT NULL制約が制約名を持つようになります。加えて、外部テーブルにもNOT NULL制約を指定できるようになりました。さらに、NOT NULL制約を新たなオプション「NO INHERIT」により、継承子テーブルで継承しないように指定できるようになりました。
構文は下記になります。
ALTER TABLE ... ALTER CONSTRAINT ... [NO] INHERIT
(以下を実行すると、t84p1にはNOT NULL制約が残ります) db1=# CREATE TABLE t84 (id int, c text NOT NULL) PARTITION BY RANGE (id); db1=# CREATE TABLE t84p1 PARTITION OF t84 FOR VALUES FROM (1) TO (101); db1=# ALTER TABLE ONLY t84 DROP CONSTRAINT "t84_c_not_null";
COPY
- COPY FROMで「REJECT_LIMIT」を指定できるようになりました。これで許容できるエラーの最大数を指定できます。 (Atsushi Torikoshi) (18)
- COPY TOでマテリアライズドビューからコピーできるようになりました。 (Jian He) (18)
- COPY FROMの「LOG_VERBOSITY」オプションの値に「silent」が追加されました。 (Atsushi Torikoshi) (18)
- 外部テーブルに対するCOPY FREEZEが使用できなくなりました。 (Nathan Bossart) (18)
これは「ON_ERROR = 'ignore'」の場合に使用できます。
「ON_ERROR = 'ignore'」のとき、この値が指定されていると、エラーとなった入力行数をログ出力しません。
これまではエラーにはなりませんが「FREEZE」指定は無視されていました。これからはエラーになります。
EXPLAIN
- EXPLAINでANALYZEオプションを指定した場合、BUFFERSオプションも自動的に有効化されるようになりました。 (Guillaume Lelarge, David Rowley) (18)
- EXPLAINのWALオプション指定時の出力内容に、WALバッファが一杯になった回数が追加されました。 (Bertrand Drouvot) (18)
- EXPLAIN ANALYZEで、各インデックススキャンノードのインデックス参照回数が表示されるようになりました。 (Peter Geoghegan) (18)
- EXPLAINで行数が小数まで出力されるようになりました。 (Ibrar Ahmed, Ilia Evdokimov, Robert Haas) (18)
- EXPLAIN ANALYZEがプランノード「Material」と「Window Aggregate」、共通テーブル式(WITH句)などについて、内部で使用するタプルストアのメモリ使用量やディスクに書き出しの有無を報告するようになりました。 (David Rowley, Tatsuo Ishii) (18)
- EXPLAINがプランノード「WindowAgg」について、ウィンドウ定義の詳細を報告するようになりました。 (Tom Lane) (18)
- EXPLAIN ANALYZEがプランノード「Parallel Bitmap Heap Scan」について、パラレルワーカーのキャッシュ統計を報告するようになりました。 (David Geier, Heikki Linnakangas, Donghang Lin, Alena Rybakina, David Rowley) (18)
- EXPLAIN ANALYZEで無効にされたプランノードタイプが出力されるようになりました。 (Robert Haas, David Rowley, Laurenz Albe) (18)
(出力例)
db1=# CREATE TABLE t90 (c text);
db1=# EXPLAIN (ANALYZE, WAL, COSTS off, BUFFERS off, TIMING off)
INSERT INTO t90 SELECT md5(g::text) FROM generate_series(1, 300000) g;
QUERY PLAN
--------------------------------------------------------------------------
Insert on t90 (actual rows=0.00 loops=1)
WAL: records=300000 bytes=26400000 buffers full=689
-> Function Scan on generate_series g (actual rows=300000.00 loops=1)
Planning Time: 0.085 ms
Execution Time: 1953.013 ms
(5 rows)
loopsを伴う場合、1回あたりの行数を出力しますので小数も必要でした。たとえば、4回の繰り返しで合計11行を取得したなら「(actual rows=2.75 loops=4)」と出力されます。これまでは「(actual rows=3 loops=4)」となっていました。
(実行例 - Window:の行が本バージョンから追加された)
db1=# CREATE TABLE t94 (id int, score float4);
db1=# INSERT INTO t94 SELECT g, random() FROM generate_series(1, 100) g;
db1=# explain SELECT id, avg(score) OVER w1 FROM t94
WINDOW w1 AS (ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
QUERY PLAN
--------------------------------------------------------------------------------------------
WindowAgg (cost=5.36..7.07 rows=100 width=12)
Window: w1 AS (ORDER BY id ROWS BETWEEN '1'::bigint PRECEDING AND '1'::bigint FOLLOWING)
-> Sort (cost=5.32..5.57 rows=100 width=8)
Sort Key: id
-> Seq Scan on t94 (cost=0.00..2.00 rows=100 width=8)
(5 rows)
(出力例 - 各ワーカーで「exact」と「lossy」のページ数が報告される)
db1=# explain (analyze, buffers off, costs off, timing off)
SELECT id FROM t95 WHERE c1 <= 2 AND c2 <= 2 AND c3 <= 2;
QUERY PLAN
-----------------------------------------------------------------------------
Gather (actual rows=11107.00 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Bitmap Heap Scan on t95 (actual rows=3702.33 loops=3)
Recheck Cond: (c3 <= 2)
Rows Removed by Index Recheck: 235532
Filter: ((c1 <= 2) AND (c2 <= 2))
Rows Removed by Filter: 55121
Heap Blocks: exact=381 lossy=1707
Worker 0: Heap Blocks: exact=203 lossy=1830
Worker 1: Heap Blocks: exact=184 lossy=1101
-> Bitmap Index Scan on t95_c3_idx (actual rows=176471.00 loops=1)
Index Cond: (c3 <= 2)
Index Searches: 1
Planning Time: 0.339 ms
Execution Time: 155.347 ms
(16 rows)
以下のように設定で無効化されたプランノードタイプが、他に手段がないために選択された場合に「Disabled: true」が出力されます。
db1=# CREATE TABLE t96 (id int);
db1=# SET enable_seqscan TO off;
db1=# explain SELECT id FROM t96;
QUERY PLAN
-------------------------------------------------------
Seq Scan on t96 (cost=0.00..35.50 rows=2550 width=4)
Disabled: true
(2 rows)
データ型
- Unicodeの完全な大文字小文字のマッピングと変換がサポートされました。 (Jeff Davis) (18)
- jsonbの「null」値を「NULL」としてスカラー型にキャストできるようになりました。 (Tom Lane) (18)
- json_strip_nulls()およびjsonb_strip_nulls()関数に、配列内のnull要素も削除できるオプションパラメータが追加されました。 (Florents Tselai) (18)
- 配列を最初の次元でソートする関数array_sort()が追加されました。 (Junwang Zhao, Jian He) (18)
- 配列の第1次元を反転する関数array_reverse()が追加されました。 (Aleksander Alekseev) (18)
- bytea型のバイト列を反転する関数reverse()が追加されました。 (Aleksander Alekseev) (18)
- 整数型とbytea型の間でのキャストを許可するようになりました。 (Aleksander Alekseev) (18)
- UnicodeデータのバージョンがUnicode 16.0.0に更新されました。 (Peter Eisentraut) (18)
- エストニア語の全文検索におけるステミング機能が追加されました。 (Tom Lane) (18)
- XMLのエラーコードがSQL標準により近づくよう改善されました。 (Tom Lane) (18)
タイトルケースやその他の条件に応じたマッピング(文字の出現位置による違い)、単一文字から複数文字へマッピングへの対応が加わりました。
これまではエラーになりました。
(バージョン18の動作例) db1=# SELECT 'null'::jsonb::int; int4 ------ (1 row) (バージョン17.xまでは以下のエラーになる) ERROR: cannot cast jsonb null to type integer
(使用例)
db1=# SELECT array_sort('{{2,3,5},{1,2,3},{2,3,4},{1,10,5}}'::int[]);
array_sort
------------------------------------
{{1,2,3},{1,10,5},{2,3,4},{2,3,5}}
(1 row)
(実行例)
db1=# SELECT array_reverse(ARRAY[[1,2],[3,4],[5,6]]);
array_reverse
---------------------
{{5,6},{3,4},{1,2}}
(1 row)
バイト列の順序を反転することで、ビッグエンディアンとリトルエンディアン変換を行うケースなどで役立ちます。
(実行例)
db1=# SELECT reverse('\xA1B2C3'::bytea);
reverse
----------
\xc3b2a1
(1 row)
整数値は2の補数表現のbytea値として保存されます。
(実行例) db1=# SELECT 1234::bytea; bytea ------------ \x000004d2 (1 row) db1=# SELECT '\x000004d2'::bytea::int4; int4 ------ 1234 (1 row)
これらのエラーはSQLSTATEを通じて報告されます。
関数
- casefold()関数が追加され、より高度な大文字/小文字を区別しない照合が可能になりました。 (Jeff Davis) (18)
- 配列型や複合型に対しても、MIN()/MAX()集約関数を使用できるようになりました。 (Aleksander Alekseev, Marat Buharov) (18)
- EXTRACT()関数にWEEKオプションが追加されました。 (Tom Lane) (18)
- 負の値に対するEXTRACT(QUARTER ...)の出力が改善されました。 (Tom Lane) (18)
- 関数to_number()でローマ数字がサポートされました。 (Hunaid Sohail) (18)
- UUIDバージョン7を生成する関数uuidv7()が追加されました。 (Andrey Borodin) (18)
- CRC(巡回冗長検査)の値を計算する関数crc32()、crc32c()が追加されました。 (Aleksander Alekseev) (18)
- 算術関数としてガンマ関数gamma()、対数ガンマ関数lgamma()が追加されました。 (Dean Rasheed) (18)
- PL/pgSQLで、名前付きカーソル引数に「=>」構文が使用可能となりました。 (Pavel Stehule) (18)
- 正規表現関数で名前付き引数が使用可能になりました。 (Jian He) (18)
これにより、1文字が複数の大文字/小文字に対応する場合や、変換によって文字数が変わる場合でも、より正確な比較ができるようになりました。
(実行例)
db1=# SELECT EXTRACT(WEEK FROM interval '2 weeks'),
EXTRACT(WEEK FROM interval '-15 days'),
EXTRACT(WEEK FROM date '2025-1-27');
extract | extract | extract
---------+---------+---------
2 | -2 | 5
(1 row)
以前からQUARTERオプションはintervalでも使えていましたが、負のintervalに対しては奇妙な結果を返していました。
(実行例)
db1=# SELECT EXTRACT(QUARTER FROM interval '10 months'),
EXTRACT(QUARTER FROM interval '-10 months');
extract | extract
---------+---------
4 | -4
(1 row)
(PG17以前だと奇妙な結果が返ってくる)
db1=# SELECT EXTRACT(QUARTER FROM INTERVAL '10 months'),
EXTRACT(QUARTER FROM INTERVAL '-10 months');
extract | extract
---------+---------
4 | -2
(1 row)
(使用例)
db1=# SELECT to_number('XVIII', 'RN');
to_number
-----------
18
(1 row)
このUUID値は時間的にソート可能で、生成順の並びになります。
また、UUIDバージョン4を生成する関数gen_random_uuid()の別名として、関数uuidv4()も追加されました。
これまでは「:=」のみが使用可能でした。
「OPEN cur1 (p1 => 'A', p2 => 123);」や「FOR rec IN cur2(a1 => 't') LOOP」などと記述できます。
対象は以下の関数です。
regexp_match() regexp_matches() regexp_like() regexp_replace() regexp_count() regexp_instr() regexp_substr() regexp_split_to_table() regexp_split_to_array()
以下のように使用できます。
db1=# SELECT regexp_replace(string=>'hello world', pattern=>'o', replacement=>'0', flags=>'g'); regexp_replace ---------------- hell0 w0rld (1 row)
libpq
- マイナーバージョンを含む完全なプロトコルバージョン番号を報告する関数PQfullProtocolVersion()が追加されました。 (Jacob Champion, Jelte Fennema-Nio) (18)
- 接続で使用するプロトコルバージョンの範囲を指定する、libpqの接続パラメータと環境変数が追加されました。 (Jelte Fennema-Nio) (18)
- search_pathの変更をクライアントに報告するようになりました。 (Alexander Kukushkin, Jelte Fennema-Nio, Tomas Vondra) (18)
- PQtrace()で認証処理を含む全てのメッセージタイプを出力するようになりました。 (Jelte Fennema-Nio) (18)
- SSL鍵についてのログを出力させる、libpq接続パラメータsslkeylogfileが追加されました。 (Abhishek Chanda, Daniel Gustafsson) (18)
- いくつかのlibpq関数をシグネチャにint64_tを使うように修正しました。 (Thomas Munro) (18)
追加されたパラメータはmin_protocol_versionとmax_protocol_version、環境変数はPGMINPROTOCOLVERSIONとPGMAXPROTOCOLVERSIONです。
これらは非推奨となっているpg_int64を使っていました。
psql
- psqlで名前付きプリペアドステートメントのパース、バインド、クローズができるようになりました。 (Anthonin Bonnefoy, Michael Paquier) (18)
- psql のメタコマンド(バックスラッシュコマンド)でパイプライン問合せの発行が可能になりました。 (Anthonin Bonnefoy) (18)
- パイプライン状態をpsqlのプロンプトに付加できるようになりました。また、新たな変数で状態を確認できるようになりました。 (Anthonin Bonnefoy) (18)
- 接続サービス名をpsqlプロンプトに付加できるようになり、また、psql変数から参照可能になりました。 (Michael Banck) (18)
- psqlの一覧出力する全てのメタコマンドに、拡張表示モードを使うようにするオプション「x」が追加されました。 (Dean Rasheed) (18)
- psqlのメタコマンド\conninfoの出力が、1行の文字列ではなく表形式になり、より多くの情報を含むようになりました。 (Alvaro Herrera, Maiquel Grassi, Hunaid Sohail) (18)
- psqlのメタコマンド\df+、\do+、\dAo+、\dC+で関数のLEAKPROOF属性を出力に含めるようになりました。 (Yugo Nagata) (18)
- psqlのメタコマンド「\dP+」で、パーティションテーブルの詳細情報としてアクセスメソッドを出力するようになりました。 (Justin Pryzby) (18)
- psqlの拡張機能の一覧を出力するメタコマンドである\dxの出力にdefault_version列が追加されました。 (Magnus Hagander) (18)
- \watchのデフォルトの待機時間を設定するためのpsql変数WATCH_INTERVALが追加されました。 (Daniel Gustafsson) (18)
新たなメタコマンド「\parse」「\bind_named」「\close_prepared」でこれを行うことができます。
(実行例)
db1=# SELECT $1 + 1, $2 || 'X' \parse ps1
db1=# \bind_named ps1 100 'ABC' \g
?column? | ?column?
----------+----------
101 | ABCX
(1 row)
db1=# \close_prepared ps1
そのために以下のメタコマンドが追加されました。
\startpipeline \syncpipeline \sendpipeline \endpipeline \flushrequest \flush \getresults
新たなプロンプト文字は「%P」で、新たなpsql変数は「PIPELINE_SYNC_COUNT」、「PIPELINE_COMMAND_COUNT」、「PIPELINE_RESULT_COUNT」です。
新たなプロンプト文字は「%s」で、新たなpsql変数は「SERVICE」です。
以下のように使用します。
db1=# \du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
foo |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
db1=# \dux
List of roles
-[ RECORD 1 ]----------------------------------------------------------
Role name | foo
Attributes |
-[ RECORD 2 ]----------------------------------------------------------
Role name | postgres
Attributes | Superuser, Create role, Create DB, Replication, Bypass RLS
ただし、「\dx」は「インストールされている拡張一覧」の意味になるため、「\d」には付加できません。
db1=# \conninfo
Connection Information
Parameter | Value
----------------------+----------
Database | db1
Client User | postgres
Socket Directory | /tmp
Server Port | 5432
Options |
Protocol Version | 3.0
Password Used | false
GSSAPI Authenticated | false
Backend PID | 340367
SSL Connection | false
Superuser | on
Hot Standby | off
(12 rows)
サーバアプリケーション
- initdbの動作が変更され、デフォルトでデータチェックサムが有効化されるようになりました。 (Greg Sabino Mullane) (18)
- initdbに新たなオプション--no-sync-data-filesが追加され、ヒープファイルやインデックスファイルの同期(sync)を行わないようにすることが可能になりました。 (Nathan Bossart) (18)
- vacuumdbにオプション--missing-stats-onlyが追加され、統計情報のうち、まだ収集されていないものだけを収集することが可能になりました。 (Corey Huinker, Nathan Bossart) (18)
- pg_combinebackupにオプション-k/--linkが追加され、ハードリンクを有効にすることが可能になりました。 (Israel Barth Rubio, Robert Haas) (18)
- pg_verifybackupにtarフォーマットのバックアップを検証できる機能が追加されました。 (Amul Sul) (18)
- pg_rewindの--source-serverオプションでデータベース名が指定されている場合、そのデータベース名が--write-recovery-confの出力に使用されるようになりました。 (Masahiko Sawada) (18)
- pg_resetwalにオプション--char-signednessが追加され、デフォルトのcharの符号性を変更できるようになりました。 (Masahiko Sawada) (18)
新たに追加されたオプション--no-data-checksumsを指定することで、チェックサムを無効にすることができます。
このオプションは、同期をinitdbとは別の処理で実施するPostgreSQLのツールの内部で利用することを想定して追加されています。従来の--no-syncオプションも引き続き使用可能で、こちらはすべてのファイルの同期を行わないようにします。
このオプションはスーパーユーザーのみが実行でき、--analyze-onlyまたは--analyze-in-stagesオプションと併せて使用する必要があります。主にpg_upgrade実行後に不足している統計情報を補完する用途を想定して導入されました。
ただし、ハードリンクできるのは一部のファイルに限られており、生成されたバックアップをそれぞれ独立して使用する予定がある場合には、このオプションの使用は推奨されません。
このオプションは、入力ディレクトリが復元後に削除される一時的なステージング領域である場合に特に有効で、ファイルのコピーを省略して高速化が図れます。しかし、ハードリンクにより出力先の変更が入力ディレクトリにも影響するため、入力ディレクトリを再利用する可能性がある場合は危険であり、使用時には警告が表示されます。
この機能は圧縮されたtarフォーマットのバックアップにも対応しています。ただし、WALの検証にはpg_waldumpを使用している関係で、WALがtarファイル内に格納されている場合はまだ検証できません。そのため、WALの検証をスキップする-nオプションを必ず指定する必要があります。
これにより、sync_replication_slotsが有効な環境でも、リワインド後のサーバが手動で設定ファイルを修正することなくプライマリサーバへ接続できるようになります。
このオプションは、pg_upgrade内部での利用を想定しており、手動での操作は想定していません。
pg_dump
- pg_dumpに統計情報をダンプするための--statisticsオプションが追加されました。 (Jeff Davis) (18)
- pg_dump、pg_dumpallにオプション--sequence-dataが追加されました。--no-dataなどシーケンスデータを除外するオプションが指定されている場合でも、シーケンスデータをダンプできます。 (Nathan Bossart) (18)
- pg_dump、pg_dumpall、pg_restoreにオプション--statistics-only、--no-statistics、--no-data、--no-schemaが追加されました。 (Corey Huinker, Jeff Davis) (18)
- pg_dump、pg_dumpall、pg_restoreにオプション--no-policiesが追加されました。このオプションで行レベルのセキュリティポリシー処理を無効にします。 (Nikolay Samokhvalov) (18)
これは異なるポリシーを持つシステムに移行する場合に便利です。
pg_upgrade
- pg_upgrade でメジャーバージョンアップする際にプランナ統計情報を移行できるようになりました。ただし、拡張統計情報は移行されません。 (Corey Huinker, Jeff Davis, Nathan Bossart) (18)
- pg_upgradeの--jobsオプションで並列実行数を指定することで、複数のデータベースを同時に処理できるようになりました。 (Nathan Bossart) (18)
- pg_upgradeにオプション--swapが追加されました。 (Nathan Bossart) (18)
- pg_upgradeにオプション--set-char-signednessが追加されました。このオプションで新しいクラスタのデフォルトのchar型の符号つき/符号なし(signed/unsigned)を設定できます。 (Masahiko Sawada) (18)
統計情報を移行しない場合は、--no-statistics オプションを指定します。
このオプションでディレクトリ全体を入れ替えるので、大量にDB オブジェクトがある環境では従来の--copyや--link、--cloneオプションを使うよりも高速になることがあります。
これはPostgreSQL 18より前のクラスタのデフォルトのCPU符号が新しいクラスタと一致しない場合に対応できます。
論理レプリケーション
- pg_createsubscriberにオプション--allが追加されました。このオプションで全てのデータベースの論理レプリカが作成されます。 (Shubham Khanna) (18)
- pg_createsubscriberにオプション--cleanが追加されました。このオプションで現在はパブリケーションのみが削除できます。 (Shubham Khanna) (18)
- pg_createsubscriberにオプション--enable-two-phaseが追加されました。このオプションでサブスクリプションの二相コミットを有効にします。 (Shubham Khanna) (18)
- pg_recvlogicalに--enable-failoverオプションが追加され、フェイルオーバースロットを指定できるようになりました。 (Hayato Kuroda) (18)
- pg_recvlogicalの--drop-slotオプションが、--dbnameを指定しなくても動作するようになりました。 (Hayato Kuroda) (18)
これにより、pg_recvlogicalがフェイルオーバーオプションを有効にした状態で論理レプリケーションスロットを作成できるようになりました。本オプションは--create-slotオプションと一緒に使用します。
また、--two-phaseの同義語として--enable-two-phaseオプションが追加され、--two-phaseは非推奨となりました。
ソースコード
- インジェクションポイントの読み込みと実行が分離されました。 (Michael Paquier, Heikki Linnakangas) (18)
- インジェクションポイントで実行時引数がサポートされました。 (Michael Paquier) (18)
- IS_INJECTION_POINT_ATTACHED()マクロが追加されました。 (Heikki Linnakangas) (18)
- SIMD(Single Instruction Multiple Data)を使用することで、長いJSON文字列の処理性能が向上しました。 (David Rowley) (18)
- x86のAVX-512命令を使用することで、CRC32C計算が高速化されました。 (Raghuveer Devulapalli, Paul Amonson) (18)
- popcount(整数のビットカウント)に対して、ARMのNeonおよびSVE CPU命令が追加されました。 (Chiranmoy Bhattacharya, Devanga Susmitha, Rama Malladi) (18)
- numeric型の乗算および除算の処理速度が向上しました。 (Joel Jacobson, Dean Rasheed) (18)
- configureオプションにNUMA対応を有効にする--with-libnumaが追加されました。 (Jakub Wartak, Bertrand Drouvot) (18)
- 非常に大きな式インデックスを可能にするために、システムテーブルpg_indexにTOASTテーブルが追加されました。 (Nathan Bossart) (18)
- システムテーブルpg_attributeから、attcacheoff列が削除されました。 (David Rowley) (18)
- システムテーブルpg_classから、relallfrozen列が追加されました。 (Melanie Plageman) (18)
- インデックスアクセスメソッドのAPIルーチンに、amgettreeheight、amconsistentequality、amconsistentorderingが追加されました。 (Mark Dilger) (18)
- GiSTのサポート関数stratnum()が追加されました。 (Paul A. Jungwirth) (18)
- ビルドにおける「char」のデフォルトのCPU符号属性(signedかunsigned)が、コントロールデータに記録され、pg_controldataコマンドで出力されるようになりました。 (Masahiko Sawada) (18)
- plpythonでPythonの「Limited API」のサポートが追加されました。 (Peter Eisentraut) (18)
- サポートされるPythonの最小バージョンが3.6.8に変更されました。 (Jacob Champion) (18)
- OpenSSL 1.1.1より古いバージョンがサポートされなくなりました。 (Daniel Gustafsson) (18)
- LLVMを有効するために、LLVMバージョン14以降が必要となりました。 (Thomas Munro) (18)
- 拡張が自分自身の名前とバージョンを報告できるように、PG_MODULE_MAGIC_EXTマクロが追加されました。 (Andrei Lepikhov) (18)
- SPI_connect()/SPI_connect_ext()は常に成功(SPI_OK_CONNECT)を返すことが、文書化されました。 (Stepan Neretin) (18)
- APIおよびABI互換性に関するドキュメントのセクションが追加されました。 (David Wheeler, Peter Eisentraut) (18)
- ドキュメントでWindows上のMesonビルドが実験的という扱いではなくなりました。 (Aleksander Alekseev) (18)
- configureオプションの「--disable-spinlocks」と「--disable-atomics」が削除されました。 (Thomas Munro) (18)
- HPPA/PA-RISCアーキテクチャのサポートが削除されました。 (Tom Lane) (18)
INJECTION_POINT_LOAD()マクロで、インジェクションポイントを作成するけれど実行しない、ということができるようになりました。作成したインジェクションポイントはINJECTION_POINT_CACHED()マクロで実行できます。
この分離は、メモリ割り当て不能なクリティカルセクションにインジェクションポイントを付加するときに有用です。
これにより、通常のソースコード内でインジェクションポイントがアタッチされているかを検査するコードが書けます。
特に、長いテキストプロパティを持つJSONオブジェクトで効果的です。
NUMA対応状況は関数pg_numa_available()で確認できます。NUMA対応が有効である場合、システムビューpg_shmem_allocations_numaとpg_buffercache_numaで共有メモリのNUMAノード間での分布状況を確認できます。
amgettreeheightが新規追加で、amconsistentequalityとamconsistentorderingはamcancrosscompareを分割改名したものです。
Python 3.x のバージョン不一致によって発生する問題の防止に役立ちます。
この情報は新たなpg_get_loaded_modules()関数を介して参照できます。
エラーは常にereport()を介して報告されます。
32ビットのアトミック操作は必須となりました。
追加モジュール
- 論理スナップショットを検査するpg_logicalinspect拡張が追加されました。 (Bertrand Drouvot) (18)
- EXPLAIN出力に詳細デバッグ情報等を追加するpg_overexplain拡張が追加されました。 (Robert Haas) (18)
- postgres_fdwでpostgres_fdw_get_connections()関数の出力列が追加されました。 (Hayato Kuroda, Sagar Dilip Shedge) (18)
- クライアントからのSCRAM認証をpostgres-fdwサーバに渡せるようになりました。 (Matheus Alcantara, Peter Eisentraut) (18)
- クライアントからのSCRAM認証をdblinkに渡せるようになりました。 (Matheus Alcantara) (18)
- file_fdwにon_errorオプションとlog_verbosityオプションが追加されました。 (Atsushi Torikoshi) (18)
- file_fdwがスキップできるエラー行の上限数を制御するREJECT_LIMITオプションが追加されました。 (Atsushi Torikoshi) (18)
- passwordcheckモジュールにパスワードの最小の長さを指定できるmin_password_lengthパラメータが追加されました。 (Emanuele Musella, Maurizio Boriani) (18)
- pgbenchの結果出力で、失敗・試行・スキップしたトランザクションも報告するようになりました。 (Yugo Nagata) (18)
- isn拡張に無効な検査数字の受け入れを制御するサーバ変数weakが追加されました。 (Viktor Holmberg) (18)
- btree_gist拡張のソートサポートが有効になり、Gistインデックスの構築が高速に行えるようになりました。 (Bernd Helmle, Andrey Borodin) (18)
- amcheckモジュールにGINインデックスの整合性を検証する関数gin_index_check()が追加され、親子関係の一貫性と木構造のバランスをチェックできるようになりました。 (Grigory Kryachko, Heikki Linnakangas, Andrey Borodin) (18)
- 未固定の共有バッファを追い出す関数pg_buffercache_evict_relation()と関数pg_buffercache_evict_all()が追加されました。 (Nazir Bilal Yavuz) (18)
- 拡張モジュールが独自のEXPLAINオプションを登録・管理できるようにする機能が追加されました。 (Robert Haas, Sami Imseih) (18)
- 拡張機能がサーバの累積統計情報APIを利用できるようになりました。 (Michael Paquier) (18)
論理レプリケーション等で使われる$PGDATA/pg_logical/snapshots/以下の.snapファイルについて、情報を得る関数が提供されます。
新しい出力列は以下の4つです。
used_in_xact 現在のトランザクションで使用されているか closed 接続が閉じられているか user_name ユーザ名 remote_backend_pid リモートのバックエンドプロセスのPID
これにより、postgres_fdwの認証情報をデータベースに格納しなくて済みます。これはuse_scram_passthrough接続オプションで有効になります。このとき、libpqで新しい接続パラメータlibpq_connect_scram_client_keyおよびlibpq_connect_scram_server_keyが使用されます。
on_errorオプションにignoreを指定することで入力ファイルの不正な行をスキップしてクエリを実行可能になりました。またlog_verbosityオプションでエラーや警告のログ出力の詳細度を指定できるようになりました。いずれのオプションも外部テーブルに対するSELECT、ANALYZE操作に適用されます。
このオプションはon_errorオプションがignoreの時のみ有効になります。
ユーザーが事前に暗号化されたパスワードを入力した場合は、このパラメータは無効となります。
以前のweakは静的変数で、関数isn_weak()でのみ制御されていました。weakをGUCパラメータとしたことで、トランザクション単位での変更やRESET文でデフォルト値に戻すことが可能になりました。
関数pg_buffercache_evict_relation()は指定したリレーションの共有バッファをすべて追い出し、関数pg_buffercache_evict_all()は全共有バッファを一括で追い出すことができます。既存の関数pg_buffercache_evict()は、バッファがフラッシュされたかどうかの状態を返すようになりました。
pg_stat_statements
- pg_stat_statementsでCREATE TABLE ASおよびDECLAREを追跡できるようになりました。 (Anthonin Bonnefoy) (18)
- pg_stat_statementsでSET文の値のパラメータ化が可能になりました。 (Greg Sabino Mullane, Michael Paquier) (18)
- pg_stat_statementsに並列処理の動作を報告する列が追加されました。 (Guillaume Lelarge) (18)
- pg_stat_statementsにWALバッファが満杯になった回数を報告するwal_buffers_full列が追加されました。 (Bertrand Drouvot) (18)
これらの問合せに対してクエリIDが割り当てられるようになります。
これまで指定値が異なるだけで別エントリになっていたものを集約できるため、データ量の膨張を減らします。
(実行例)
db1=# set enable_seqscan=false;
db1=# set enable_seqscan=true;
db1=# SELECT query, calls, rows FROM pg_stat_statements;
query | calls | rows
---------------------------------------------------+-------+------
set enable_seqscan=$1 | 2 | 0
(17.xでは以下)
db1=# SELECT query, calls, rows FROM pg_stat_statements;
query | calls | rows
---------------------------------------------------+-------+------
set enable_seqscan=false | 1 | 0
set enable_seqscan=true | 1 | 0
追加された列は以下です。
parallel_workers_to_launch : 実行計画のパラレルワーカー数 parallel_workers_launched : 実際に起動されたワーカー数
pgcrypto
- pgcryptoにハッシュアルゴリズムsha256cryptおよびsha512cryptが追加されました。 (Bernd Helmle) (18)
- pgcryptoのAES暗号化/復号化にCFB(Cipher Feedback)モードが追加されました。 (Umar Hayat) (18)
- サーバのFIPSモードを報告する関数fips_mode()が追加されました。 (Daniel Gustafsson) (18)
- pgcryptoに設定パラメータpgcrypto.builtin_crypto_enabledが追加され、組み込みの非FIPSモードの暗号化関数を無効化できるようになりました。 (Daniel Gustafsson, Joe Conway) (18)
暗号タイプに'aes-cfb'と指定して使用できます。
FIPSモードとは米国の連邦情報処理標準に準拠した暗号化方式のみを使用する構成です。本関数はPostgreSQLから使用されているOpenSSLがFIPSモードであるかを返します。
これはFIPSモードの動作を保証するために役立ちます。