
このページでは PostgreSQL 17(2024/9/26リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン17 の新機能については「PostgreSQL 17 検証報告」も参照してください。
バージョン17の主要な拡張
PostgreSQL 17 の主な拡張点としては以下があります。
- VACUUM性能向上
- WAL排他処理の改善
- COPY高速化
- ストリームI/O対応
- 各種プランナ改善
- SQL/JSON 対応拡充
- MERGE文の拡張
- COPY に ON_ERROR オプション
- パーティションテーブルで排他制約サポート
- 新コマンドpg_createsubscriber
- ロジカルレプリケーションのフェイルオーバ対応
- インクリメンタルバックアップ
- ダンプ/リストアのフィルタファイル
- MAINTAIN権限と pg_maintain既成ロール
バージョン17への移行/互換性のない変更点
- メンテナンス操作中に安全な search_path を使用するように機能がが変更されました。 (Jeff Davis) (17)
- ago が interval型の値の最後にのみ現れるように制限されました。 (Joseph Koshakow) (17)
- 設定パラメータ old_snapshot_threshold が廃止されました。 (Thomas Munro) (17)
- SET SESSION AUTHORIZATION における、初期セッションユーザのスーパーユーザステータスの扱いが変更されました。 (Joseph Koshakow) (17)
- データベースごとのユーザをシミュレートする機能が削除されました。 (Nathan Bossart) (17)
- Windows で wal_sync_method の値 fsync_writethrough が廃止されました。 (Thomas Munro) (17)
- WALファイル名を返すシステム関数のファイル境界処理が変更されました。 (Kyotaro Horiguchi, Andres Freund, Bruce Momjian) (17)
- 設定パラメータ trace_recovery_messages が廃止されました。 (Bharath Rupireddy) (17)
- 情報スキーマ列 element_types.domain_default が削除されました。 (Peter Eisentraut) (17)
- pgrowlocks拡張の pgrowlocks関数におけるロックモード(modes)の出力ラベルが変更されました。 (Bruce Momjian) (17)
- pg_stat_bgwriterビューから buffers_backend 列とbuffers_backend_fsync 列が削除されました。 (Bharath Rupireddy) (17)
- pgstatstatements の I/O ブロックの読み取り/書き込みタイミング統計列の名前が変更されました。 (Nazir Bilal Yavuz) (17)
- pg_attribute.attstattarget と pg_statistic_ext.stxstattarget が変更され、デフォルトの統計ターゲットを「NULL」として表すようになりました。 (Peter Eisentraut) (17)
- システムテーブル pg_collation で列名 colliculocale が colllocale に、システムテーブル pg_database で列名 daticulocale が datlocale に変更されました。 (Jeff Davis) (17)
- pg_stat_progress_vacuum ビューの max_dead_tuples 列の名前をmax_dead_tuple_bytes に変更し、num_dead_tuples 列の名前を num_dead_item_ids に変更し、dead_tuple_bytes 列が追加されました。 (Masahiko Sawada) (17)
- システムビュー pg_stat_slru の name列の値が変更されました。 (Alvaro Herrera) (17)
これにより、下記のメンテナンス操作が安全でないアクセスを実行するのを防止します。式インデックスとマテリアライズドビューで使用される関数で、デフォルト以外のスキーマを参照する必要があるものは、関数の作成時に search_path を明示的に指定する必要があります。
(動作が変更されるメンテナンス操作) ANALYZE CLUSTER CREATE INDEX CREATE MATERIALIZED VIEW REFRESH MATERIALIZED VIEW REINDEX VACUUM
また、空の interval型ユニットが複数回出現してはならないものとなりました。
この設定により、実行中のトランザクションでまだ可視となっているかもしれない行を VACUUM処理で削除できるようになり、後でアクセスすると「snapshot too old」というエラーが発生します。
本機能があることによる性能上の問題や、指定が正しく動作しない問題、問い合わせで不正確な結果が返る問題が報告されていました。将来改善された実装が見つかった場合に本機能は再度追加されるかもしれません。
新しい動作は、接続時のスーパーユーザステータスではなく、SET SESSION AUTHORIZATION コマンドが発行された時点のセッションユーザのスーパーユーザーステータスに基づきます。
db_user_namespace 設定による機能はほとんど使用されていませんでした。
この値は Windows の「fsync」と同じでした。
pg_walfile_name() 関数 および pg_walfile_name_offset() 関数は、LSN が ファイルセグメント境界上にある場合、これまで 1つ前の LSNセグメント番号を報告していましたが、現在の LSNセグメントを返すようになりました。
pg_waldump のような同等の情報を提供できるツールが他にもあり、trace_recovery_messages の機能がどのように役立つのか明確ではないため削除されました。
これは SQL標準仕様の誤りと考えられ、意味のない列でした。
他のロックモードラベルとの一貫性を保つために、「Share」が「For Share」に、「Key Share」が「For Key Share」に変更されました。
これらのフィールドは、PostgreSQL 16 で追加された pg_stat_io ビューの同様の列と重複していると見なされました。
blk_read_time が shared_blk_read_timeに、blk_write_time が shared_blk_write_time に、名前変更されました。
これまでは -1 が使われていました。引き続き「ALTER TABLE t13 ALTER c1 SET STATISTICS -1;」といった指定は可能ですが、その場合でも実際にシステムテーブルの当該フィールドに格納される値は NULL になります。
同じく pg_stat_reset_slru() 関数で受け入れられるカウンタ名も変更されました。
(変更一覧) CommitTs → commit_timestamp MultiXactMember → multixact_member MultiXactOffset → multixact_offset Notify → notify Serial → serializable Subtrans → subtransaction Xact → transaction other → other
変更点
サーバ
オプティマイザ
- オプティマイザが手前の行出力句で参照される列の統計情報とソート順序を考慮することで、CTE実行計画を改善できるようになりました。 (Jian Guo, Richard Guo, Tom Lane) (17)
- 問い合わせの IS NULL、IS NOT NULL 限定による最適化が改善されました。 (David Rowley, Richard Guo, Andy Fan) (17)
NOT NULL 列に対する問い合わせから IS NOT NULL 限定を除くようになり、IS NULL 指定がある場合に NOT NULL 列のスキャンを除くようになりました。
(実行例) db1=# CREATE TABLE t2 (id int PRIMARY KEY, v text); db1=# INSERT INTO t2 SELECT g, md5(g::text) FROM generate_series(1, 1000) g; db1=# VACUUM ANALYZE t2; db1=# explain SELECT id FROM t2 WHERE id IS NULL; QUERY PLAN ------------------------------------------ Result (cost=0.00..0.00 rows=0 width=0) One-Time Filter: false (2 rows) (16.x ではスキャンを行う実行プランになる) QUERY PLAN ----------------------------------------------------------------------- Index Only Scan using t2_pkey on t2 (cost=0.28..4.29 rows=1 width=4) Index Cond: (id IS NULL) (2 rows)
LIMIT が付加されたことで、最初の件を返すことを優先する最適化を行う場合には、子テーブル部分のプラン作成においても同様に行うようになりました。
パラレルセーフな InitPlan プラン要素について並列実行が検討されるようになりました。
新たな設定パラメータ enable_groupby_reordering で本機能(デフォルト有効)を無効にすることができます。
これまでは Append → Hash Aggregate や Append → Sort → Unique の実行プランになっていました。
プラン作成時にソートのコストが過大に計算されていました。プラン選択の変化を避けるため、マイナーバージョンアップには適応されませんでした。
これは特に ORDER BY 句の(他の列ではなく)最初の列に GiST や SP-GiSTのインデックスがあるときに有用です。
(pg_stats に追加された列) range_length_histogram 範囲の長さのヒストグラム range_empty_frac 空範囲の比率 range_bounds_histogram 範囲の下限と上限のヒストグラム
インデックス
- Btreeインデックスが IN句の定数で与えられる値の集合を、より効率的に探せるようになりました。 (Peter Geoghegan, Matthias van de Meent) (17)
- BRINインデックスを並列作成できるようになりました。 (Tomas Vondra, Matthias van de Meent) (17)
性能一般
- VACUUM処理がより効率的にタプルの除去と凍結を行えるようになりました。 (Melanie Plageman, Heikki Linnakangas) (17)
- VACUUM処理の過程でタプル情報をより効率的に格納できるようになりました。 (Masahiko Sawada, John Naylor) (17)
- インデックスを持たないテーブルの VACUUM が最適化されました。 (Melanie Plageman) (17)
- vacuum_buffer_usage_limit 設定のデフォルトが 2MB に変更されました。 (Thomas Munro) (17)
- 多数のメンバーシップを伴うロールを検査する性能が改善されました。 (Nathan Bossart) (17)
- 競合が多いときの WAL書き込みの性能が改善されました。 (Bharath Rupireddy) (17)
- 大きなブロックのデータをクライアントに送信するときの性能が改善されました。 (Melih Mutlu) (17)
- 新たな設定パラメータ io_combine_limit に基づきファイルシステム読み込みのグルーピングが可能になりました。 (Thomas Munro, Andres Freund, Melanie Plageman, Nazir Bilal Yavuz) (17)
VAUUM処理による WAL出力量も縮減されました。
さらに、maintenamce_work_mem や autovacuum_work_mem がより大きくても暗黙に制限されていた使用メモリ量の上限 1GB が撤廃されました。
これまでは 256kB でした。
調べるべきロールの数が多いときには単純な線形探索ではなく、Bloomフィルタが使われるようになりました。
モニタリング
- システムビュー pg_stat_checkpointer が新設されました。 (Bharath Rupireddy, Anton A. Melnikov, Alexander Korotkov) (17)
- 統計情報をリセットする制御が改善されました。 (Atsushi Torikoshi, Bharath Rupireddy) (17)
- バックアップからの WALリカバリに関するログメッセージが追加されました。 (Andres Freund) (17)
pg_stat_bgwriter からチェックポイント関連の列が本ビューに移動しました。
引数無しの pg_stat_reset_shared() および pg_stat_reset_shared(NULL) の関数実行で全ての共有統計情報をリセットできるようになりました。
pg_stat_reset_shared('slru') および pg_stat_reset_slru() で、SLRU の統計情報をリセットできるようになりました。これは以前は pg_stat_reset_slru(NULL) で行うことができました。
(新たに出るようになったメッセージ) LOG: starting backup recovery with redo LSN ../.., checkpoint LSN ../., on timeline ID .. LOG: restarting backup recovery with redo LSN ../.." LOG: completed backup recovery with redo LSN ../.. and end LSN ../..
待機イベントタイプは pg_stat_activity システムビューの出力にあらわれます。
システムビュー pg_stat_progress_vacuum の列 indexes_total とindexes_processed で、いくつのインデックスが処理済かが報告されます。
権限
- メンテナンス操作を実行する権限を付与できるようになりました。 (Nathan Bossart) (17)
- pg_monitor のメンバシップを持つロールが pg_current_logfile() を実行できるようになりました。 (Pavlo Golub, Nathan Bossart) (17)
権限名 MAINTAIN を使用してオブジェクト単位で権限付与することも、定義済みロール pg_maintain を使用して全オブジェクトむけにロール単位で権限を付与することもできます。あるユーザがあるオブジェクトに MAINTAIN権限を持っているときに許可される操作は、VACUUM、ANALYZE、REINDEX、REFRESH MATERIALIZED VIEW、CLUSTER、LOCK TABLE です。
サーバ設定
- ALTER SYSTEM を禁止することができる設定パラメータ allow_alter_system が追加されました。 (Jelte Fennema-Nio, Gabriele Bartolini) (17)
- ALTER SYSTEM が認識していないカスタム設定パラメータを設定できるようになりました。 (Tom Lane) (17)
- トランザクションの実行時間を制限する、設定パラメータ transaction_timeout が追加されました。 (Andrey Borodin, Japin Li, Junwang Zhao, Alexander Korotkov) (17)
- プラットフォーム非依存の組み込みの照合順序プロバイダ「builtin」が追加されました。 (Jeff Davis) (17)
- Postgres による Huge Pages の使用を報告するための参照用の設定パラメータ huge_pages_status が追加されました。 (Justin Pryzby) (17)
- イベントトリガを無効にできる設定パラメータ event_triggers が追加されました。 (Daniel Gustafsson) (17)
- SLRUキャッシュサイズが設定できるようになりました。 (Andrey Borodin, Dilip Kumar, Alvaro Herrera) (17)
「GRANT ... ON PARAMETER ...」でカスタム設定パラメータを指定することも可能です。
これによりサポートされる照合順序は「C」と「C.UTF-8」です。
これは huge_pages が try に設定されている場合に便利です。
これを off にすることで、調査用に一時的にイベントトリガを無効にできます。
新たな設定パラメータは以下の通りです。
commit_timestamp_buffers multixact_member_buffers multixact_offset_buffers notify_buffers serializable_buffers subtransaction_buffers transaction_buffers
このうち、commit_timestamp_buffers、transaction_buffers、subtransaction_buffers のデフォルト設定値は shared_buffers とともに自動的にスケールアップします。
ストリーミングレプリケーションとリカバリ
- ファイルシステムの増分バックアップがサポートされました。 (Robert Haas, Jakub Wartak, Tomas Vondra) (17)
- WAL要約ファイルの作成ができるようになりました。 (Robert Haas, Nathan Bossart, Hubert Depesz Lubaczewski) (17)
- バックアップマニフェストファイルにシステム識別子が追加されました。 (Amul Sul) (17)
- pg_basebackup が postgresql.auto.conf に接続情報を書き込む際に接続文字列内の dbname の値を書き込めるようになりました。 (Vignesh C, Hayato Kuroda) (17)
- pg_replication_slotsビューに、無効なスロットの理由を報告する invalidation_reason列が追加されました。 (Shveta Malik, Bharath Rupireddy) (17)
- pg_replication_slotsビューに、スロットの非アクティブ期間を報告する inactive_since列が追加されました。 (Bharath Rupireddy) (17)
- 論理レプリケーションスロットを同期させる関数 pg_sync_replication_slots() が追加されました。 (Hou Zhijie, Shveta Malik, Ajin Cherian, Peter Eisentraut) (17)
- レプリケーションプロトコルに failoverプロパティが追加されました。 (Hou Zhijie, Shveta Malik) (17)
増分バックアップは pg_basebackup の新たな --incremental オプションを使用して作成できます。 新しいアプリケーション pg_combinebackup を使用すると、基本および増分ファイルシステムバックアップを操作できます。
これらのファイルは、LSN 範囲内で変更されたブロック番号を記録し、データベースクラスタディレクトリとテーブルスペースの増分バックアップに役立ちます。これは設定パラメータ summarize_wal と wal_summary_keep_time によって制御され、関数 pg_available_wal_summaries()、pg_wal_summary_contents()、pg_get_wal_summarizer_state() で状態を観測できます。
これにより無効な WAL の使用を検出できるようになりました。
物理スタンバイで実行して、物理プライマリにある論理レプリケーションスロットと状態情報の同期を取ります。これにより物理スタンバイを昇格したとき、論理レプリケーションのパブリッシャを引継ぐことができます。
ロジカルレプリケーション
- 物理スタンバイサーバから論理レプリカを作成するためにpg_createsubscriber アプリケーションが追加されました。 (Euler Taveira) (17)
- pg_upgrade で論理スロットとサブスクリプションをバージョンアップ移行できるようになりました。 (Hayato Kuroda, Hou Zhijie, Vignesh C, Julien Rouhaud, Shlok Kyal) (17)
- 論理スロットのフェイルオーバーが有効になりました。 (Hou Zhijie, Shveta Malik, Ajin Cherian) (17)
- フェイルオーバの論理スロット同期を有効にする設定パラメータ sync_replication_slots が追加されました。 (Shveta Malik, Hou Zhijie, Peter Smith) (17)
- 「CREATE / ALTER SUBSCRIPTION」に論理レプリケーションフェイルオーバ制御のオプション failover が追加されました。 (Shveta Malik, Hou Zhijie, Ajin Cherian) (17)
- 論理レプリケーションの変更適用において、サブスクライバでハッシュインデックスが使用できるようになりました。 (Hayato Kuroda) (17)
- サブトランザクションが多数ある場合のロジカルデコーディングの性能が向上しました。 (Masahiko Sawada) (17)
- サブスクリプション所有者のスーパーユーザ権限が取り消された場合は、適用ワーカプロセスが再起動されるようになりました。 (Vignesh C) (17)
- pg_logical_emit_message() 関数に、メッセージを永続化する flushオプションが追加されました。 (Michael Paquier) (17)
- サブスクライバから参照される前に、同期する必要のある物理スタンバイを指定できるようになりました。 (Hou Zhijie, Shveta Malik) (17)
- pg_stat_subscription ビュー に worker_type列が追加されました。 (Peter Smith) (17)
これにより論理レプリケーションをアップグレード後も素早く継続できます。 これは移行元のバージョンが 17以降である場合にのみ機能します。
これは pg_create_logical_replication_slot() の 5番目のオプション引数で制御されます。
以前は、この目的で使用できるのは Btreeインデックスのみでした。
これにより再認証が強制されます。
新たな設定パラメータは synchronized_standby_slots です。
「apply」「parallel apply」「table synchronization(初期同期)」をいずれであるかが報告されます。
ユーティリティコマンド
- COPY に、エラー行を無視して処理を継続する新オプション「ON_ERROR ignore」が追加されました。 (Damir Belyalov, Atsushi Torikoshi, Alex Shulgin, Jian He, Yugo Nagata) (17)
- COPY に新オプション「LOG_VERBOSITY」が追加されました。 (Bharath Rupireddy) (17)
- COPY FROM でスキップした行数を報告するようになりました。 (Atsushi Torikoshi) (17)
- COPY FROM で、全列への FORCE_NULL または FORCE_NOT_NULL を指定するのに「*」が使えるようになりました。 (Zhang Mingli) (17)
- パーティションテーブルが IDENTITY列(自動連番生成する列)を持てるようになりました。 (Ashutosh Bapat) (17)
- パーティションテーブルで排他制約が使用可能になりました。 (Paul A. Jungwirth) (17)
- ALTER TABLE で列の統計ターゲット数をデフォルトに指定する方法が明解になりました。 (Peter Eisentraut) (17)
- ALTER TABLE で列の生成式を変更できるようになりました。 (Amul Sul) (17)
- パーティションテーブルに対してテーブルアクセスメソッドを指定できるようになりました。 (Justin Pryzby, Soumyadeep Chakraborty, Michael Paquier) (17)
- ALTER TABLE ... SET ACCESS METHOD で DEFAULT を指定できるようになりました。 (Michael Paquier) (17)
- 接続時に起動するイベントトリガがサポートされました。 (Konstantin Knizhnik, Mikhail Gribkov) (17)
- REINDEX に対するイベントトリガがサポートされました。 (Garrett Thornburg, Jian He) (17)
- CLUSTER コマンドで括弧でパラメータを与える構文でもテーブル名を指定しない(すなわち全テーブルを対象とする)ことが可能になりました。 (Nathan Bossart) (17)
デフォルトは「ON_ERROR stop」で、エラー行に遭遇するとコマンド実行がそこでエラー終了するという、従来通りの振る舞いです。
この指定で COPY FROM で無視した行が報告されます。
システムビュー pg_stat_progress_copy の列 tuples_skipped で報告されます。
パーティション全体で1つのシーケンスから一貫した発番が行われます。
ただし、排他制約にパーティションキー列の等価比較が含まれている必要があります。
新たに「ALTER TABLE ... SET STATISTICS DEFAULT」という構文が使用できます。旧来からの「... SET STATISTICS -1」も引き続き使用できます。
構文は「ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION ...」です。
EXPLAIN
- EXPLAIN でオプティマイザのメモリ使用を報告できるようになりました。 (Ashutosh Bapat) (17)
- EXPLAIN に、転送用のデータ変換コストを報告する「SERIALIZE」オプションが追加されました。 (Stepan Rutz, Matthias van de Meent) (17)
- EXPLAIN で BUFFERS 指定したときの出力で、ローカル I/O ブロックの read/write 時間の統計が報告されるようになりました。 (Nazir Bilal Yavuz) (17)
- EXPLAIN で SubPlanノードと出力パラメータの表示が改善されました。 (Tom Lane, Dean Rasheed) (17)
- EXPLAIN 出力で JIT の deform_counter が Generation時間の内のDeform時間として、報告されるようになりました。 (Dmitry Dolgov) (17)
オプション名は「MEMORY」です。
Output: で SubPlan のどの列を使っているのか、また、Filter: でSubPlan からどのような条件を使用しているのかが、具体的に示されるようになります。
pg_stat_statements拡張でも pg_stat_statements 関数およびビューに、jit_deform_count および jit_deform_time 列が追加されました。
データ型
- interval型で「+infinity」と「-infinity」値がサポートされました。 (Joseph Koshakow, Jian He, Ashutosh Bapat) (17)
- 同トランザクション内で、作成され、ALTER TYPE で変更された ENUM型を使用できるようになりました。 (Tom Lane) (17)
(16.x ではエラーになる使用法) db1=# BEGIN; db1=# CREATE TYPE myenum AS ENUM('good'); db1=# ALTER TYPE myenum ADD VALUE 'bad'; db1=# SELECT enum_range(null::myenum); -- 以前はここでエラー enum_range ------------ {good,bad} (1 row) db1=# COMMIT;
MERGE
- MERGE文で書き換え対象のターゲット表として、更新可能ビューを扱えるようになりました。 (Dean Rasheed) (17)
- MERGE文で「WHEN NOT MATCHED BY SOURCE」指定が可能になりました。 (Dean Rasheed) (17)
- MERGE文で RETURNING句が利用可能になりました。 (Dean Rasheed) (17)
参照対象の表としてであれば従来から扱えました。
従来から対応していた「WHEN NOT MATCHED」は、ターゲット表に無い場合の動作を意味します。このことを明確化に示す「WHEN NOT MATCHED BY TARGET」という書き方にも対応しました。
RETURNING句で merge_action() 関数を指定すると、実行した DML の種別(UPDATE、INSERT、DELETE)が報告されます。
関数
- JSONデータをテーブル表現に変換する関数 JSON_TABLE() が追加されました。 (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Andrew Dunstan, Amit Langote, Jian He) (17)
- SQL/JSON のコンストラクタ関数 JSON()、JSON_SCALAR()、JSON_SERIALIZE() が追加されました。 (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Andrew Dunstan, Amit Langote) (17)
- SQL/JSON の問い合わせ関数 JSON_EXISTS()、JSON_QUERY()、JSON_VALUE() が追加されました。 (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Andrew Dunstan, Amit Langote, Peter Eisentraut, Jian He) (17)
- 値を他の JSONデータ型に変換する jsonpathメソッドがいくつか追加されました。 (Jeevan Chalke) (17)
本関数は元となる JSONデータを問い合わせる SELECT文の FROM句に(ラテラル結合で)指定して、使用することができます。
(追加されたメソッドは以下の通り) .bigint() .boolean() .date() .decimal([precision [, scale]]) .integer() .number() .string() .time() .time_tz() .timestamp() .timestamp_tz()
「TZ」でタイムゾーンの略記形または数値オフセットを受け付けるようになります。これまでは「OF」で数値オフセットのみを受け付けていました。「TZ」は to_char() 関数でしか対応していませんでした。
「AT TIME ZONE ゾーン」という指定ができた箇所に「AT LOCAL」と指定できます。これは、タイムゾーンを具体的に指定することなく、タイムスタンプ値にタイムゾーンを追加、削除するときに有用です。
(実行例) db1=# SELECT now(); now ------------------------------- 2024-10-09 10:32:37.484554+09 (1 row) db1=# SELECT now() AT LOCAL; timezone ---------------------------- 2024-10-09 10:32:34.937626 (1 row)
integer、bigint、numeric 型むけにそれぞれ提供されます。
(実行例) db1=# SELECT to_bin(128), to_oct(128); to_bin | to_oct ----------+-------- 10000000 | 200 (1 row)
追加された関数は、ユニコードバージョンを返す unicode_version()、ICU におけるユニコードバージョンを返す icu_unicode_version()、文字列が全てユニコードのコードポイントに割り当てされているかを返す unicode_assigned(str) です。
(実行例) db1=# SELECT to_regtypemod('timestamp(4)'), to_regtypemod('text'); to_regtypemod | to_regtypemod ---------------+--------------- 4 | -1 (1 row)
(実行例) db1=# CREATE DOMAIN uint AS int CHECK (VALUE >= 0); db1=# SELECT pg_basetype('uint'), pg_typeof(pg_basetype('uint')); pg_basetype | pg_typeof -------------+----------- integer | regtype (1 row)
TOAST格納されていない列に対しては NULL が返ります。
(実行例) db1=# CREATE TABLE t95 (id int PRIMARY KEY, v text); db1=# INSERT INTO t95 VALUES (1, repeat('a', 999999)), (2, 'bbb'); db1=# SELECT id, pg_column_toast_chunk_id(v) FROM t95; id | pg_column_toast_chunk_id ----+-------------------------- 1 | 16476 2 | (2 rows)
PL/pgSQL
- PL/pgSQL で %TYPE および %ROWTYPE による指定を配列に用いることができるようになりました。 (Quan Zongliang, Pavel Stehule) (17)
(使用例) db1=# CREATE FUNCTION f96() RETURNS void LANGUAGE plpgsql AS $$ DECLARE ids public.t95.id%TYPE[]; BEGIN ids := '{1,2,3}'; RETURN; END; $$;
libpq
- ロールのパスワードを変更する、新たな libpq 関数が追加されました。 (Joe Conway) (17)
- ポータルとプリペアドステートメントをクローズする libpq関数が追加されました。 (Jelte Fennema-Nio) (17)
- ブロッキングと非ブロッキングのキャンセル要求が可能な libpq API が追加されました。キャンセルする接続で暗号化が行われている場合、キャンセル要求の接続でも同条件の暗号化が適用されます。 (Jelte Fennema-Nio) (17)
新関数 PQchangePassword() は新たなパスワードをサーバに送る前にハッシュ化します。
これらの関数は、PQclosePrepared()、 PQclosePortal()、 PQsendClosePrepared()、 PQsendClosePortal() です。
追加された API関数は以下の通りです。 PQcancelBlocking PQcancelStart PQcancelCreate PQcancelPoll PQcancelStatus PQcancelSocket PQcancelErrorMessage PQcancelReset PQcancelFinish
これは PQpipelineSync() と似ていますが、これは出力バッファのサイズ閾値に達するまでは、サーバへのフラッシュは行いません。
クライアント側でオプション sslnegotiation=directを指定して利用します。また、SSLライブラリで ALPN をサポートしていることが必要です。PostgreSQL 17 以上のサーバに対してのみ利用できます。
psql
- psql でデフォルトと空の権限の表示が改善されました。 (Erik Wienhold, Laurenz Albe) (17)
- psql でバックスラッシュコマンドに対する出力が「\pset null 《NULLを示す文字列》」の指定に従うようになりました。 (Erik Wienhold, Laurenz Albe) (17)
- psql の \watch が問い合わせ結果行数が指定数よりも小さいときに停止できるようになりました。 (Greg Sabino Mullane) (17)
\dp で権限が空の場合については「(none)」と表示するようになりました。デフォルトの場合には引き続き、空欄(即ち NULL)で示されます。これまでは両ケースがどちらも空欄で区別ができませんでした。
これまでは、この指定が無視されていました。
これを指定する新たなパラメータは min_rows です。
(1秒ごと繰り返し実行して 0行の応答だったら停止する例) db1=# SELECT * FROM t107 WHERE id < random(1, 5); id | v ----+---------------------------------- 1 | c4ca4238a0b923820dcc509a6f75849b 2 | c81e728d9d4c2f636f067f89cc14862c 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 (3 rows) db1=# \watch min_rows=1 1 2024年10月10日 16時03分09秒 (every 1s) id | v ----+---------------------------------- 1 | c4ca4238a0b923820dcc509a6f75849b (1 row) 2024年10月10日 16時03分10秒 (every 1s) id | v ----+--- (0 rows)
(動作例: \c による接続で Ctrl-C が効くようになりました) db1=# \c db2 postgres ^Cconnection to server on socket "/tmp/.s.PGSQL.5432" failed: Previous connection kept db1=#
CREATE SCHEMA、CREATE TABLE、ALTER TABLE、ALTER DEFAULT PRIVILEGES 等で対応が強化されたほか、新構文への対応も行われました。
サーバアプリケーション
- WALサマリファイルのダンプを行う pg_walsummary コマンドが追加されました。 (Robert Haas) (17)
- pg_dump でダンプされたラージオブジェクトをバッチでリストア可能になりました。 (Tom Lane) (17)
- pg_dump に --exclude-extension オプションが追加されました。 (Ayush Vatsa) (17)
- pg_dump、pg_dumpall および pg_restore で、処理対象にオブジェクトを含めるか含めないかを 1つのファイルで一括して指定できるようになりました。 (Pavel Stehule, Daniel Gustafsson) (17)
- いくつかのクライアントアプリケーションに --sync-method オプションが追加されました。 (Justin Pryzby, Nathan Bossart) (17)
- pg_restore に --transaction-size オプションが追加されました。 (Tom Lane) (17)
- pgbench のデバッグモードオプションが -d から --debug に変更されました。 (Greg Sabino Mullane) (17)
- pgbench に、いずれかクライアントが異常終了したときに処理を終了するオプション --exit-on-abort が追加されました。 (Yugo Nagata) (17)
- pgbench にコマンド「\syncpipeline」が追加されました。 (Anthonin Bonnefoy) (17)
- pg_archivecleanup がバックアップヒストリファイルを削除できるようになりました。 (Atsushi Torikoshi) (17)
- pg_archivecleanup に長いオプションがいくつか追加されました。 (Atsushi Torikoshi) (17)
- pg_basebackup と pg_receivewal で接続指定に dbname が利用可能になりました。 (Jelte Fennema-Nio) (17)
- pg_upgrade に --copy-file-range オプションが追加されました。 (Thomas Munro) (17)
- reindexdb の --index オプションで、異なるテーブルのインデックスを並列に処理できるようになりました。 (Maxim Orlov, Svetlana Derevyanko, Alexander Korotkov) (17)
- reindexdb、vacuumdb、clusterdb の各コマンドで、全データベースを通して、指定に一致したオブジェクトだけを処理させることが可能になりました。 (Nathan Bossart) (17)
これにより多数のラージオブジェクトをリストアするのに、複数トランザクションに分けて行ったり、パラレルでリストアすることが可能になります。今のところ、所有者ごとに固定の上限1000個を超えるラージオブジェクトが分割してダンプされます。
tar形式やディレクトリ形式のダンプで、blobs.tocファイルがいくつかの blobs_*.toc というファイルに分かれて出力されるようになります。
指定したパターンの拡張をダンプから除外します。
--filter オプションでフィルタファイルを指定します。
対象は、initdb、 pg_basebackup、 pg_checksums、 pg_dump、 pg_rewind、 pg_upgrade です。ストレージに同期書き込み命令を送る方法を fsync または syncfs かで指定できます。
これによりオブジェクトのリストアを複数のトランザクションバッチに分けることができます。巨大すぎるトランザクションブロックの問題を避けることで、性能上のメリットを得ることができます。
-d は、新たに追加された --dbname オプションと共に、データベース名の指定に使われるようになりました。
本コマンドで libpq API の PQsendPipelineSync を通してサーバに Sync メッセージを送ります。
この動作は --clean-backup-history オプションで指定します。
追加された --debug、--dry-run、--strip-extension には、これまで 1文字オプション -d、-n、-x しかありませんでした。
これはデータベース名を必要とする PgBouncer のようなコネクションプーラを通す場合に有益です。
これは Linux と FreeBSD でサポートされます。
これまではオプション --all とオブジェクトを指定する --table などのオプションは、両立できませんでした。
(実行例) $ vacuumdb --all --table='pg_class' vacuumdb: vacuuming database "db1" vacuumdb: vacuuming database "postgres" vacuumdb: vacuuming database "template1"
ソースコード
- OpenSSL 1.0.1 のサポートが廃止されました。 (Michael Paquier) (17)
- OpenSSL FIPS モードでテストに合格できるようになりました。 (Peter Eisentraut) (17)
- ビットカウントに CPU の AVX-512 命令を使用するようになりました。 (Paul Amonson, Nathan Bossart, Ants Aasma) (17)
- LLVM バージョン 10 以降が必要になりました。 (Thomas Munro) (17)
- 64ビット LoongArch CPU でネイティブ CRC 命令を使用するようになりました。 (Xudong Yang) (17)
- AIX がサポートされなくなりました。 (Heikki Linnakangas) (17)
- Microsoft Visual Studio 固有の PostgreSQL ビルドオプションが廃止されました。 (Michael Paquier) (17)
- configure の --disable-thread-safety オプションが廃止されました。 (Thomas Munro, Heikki Linnakangas) (17)
- configure の --with-CC オプションが廃止されました。 (Heikki Linnakangas) (17)
- ユーザ定義のデータ型受信関数で、NULL終端データの受信が必須ではなくなりました。 (David Rowley) (17)
- 巨大な JSONドキュメントで使用するためのインクリメンタルJSONパーサが追加されました。 (Andrew Dunstan) (17)
- トップレベルの README ファイルが Markdown に変換されました。 (Nathan Bossart) (17)
- 不要になったトップレベルの INSTALL ファイルが削除されました。 (Tom Lane) (17)
- make の distprep オプションが廃止されました。 (Peter Eisentraut) (17)
- make に Android の共有ライブラリへの対応が追加されました。 (Peter Eisentraut) (17)
- インジェクションポイントのバックエンドサポートが追加されました。 (Michael Paquier) (17)
- 動的共有メモリレジストリが追加されました。 (Nathan Bossart) (17)
- 同じクエリの他のログレコードと同じ時刻値を使用するようにemit_log_hook が修正されました。 (Kambam Vinay, Michael Paquier) (17)
- 述語チェックに jsonpath を使用するためのドキュメントが改善されました。 (David Wheeler) (17)
ビジビリティマップ、BRINインデックス、bit_count()関数、テキスト全文検索における tsvector の処理でビットカウントが行われます。
現在、Visual Studio ビルドで使用できる方法は Meson のみです。
サポートされているすべてのプラットフォームで、十分なスレッド対応がなされていると想定しています。
これからは、CC 環境変数を設定することが、唯一のサポートされているコンパイラを指定する方法です。
データバッファが NULL終端でなければならないという要件が緩和されました。
これはサーバのデバッグに使用され、サーバーのコンパイル時に有効にする必要があります。
これにより、起動時に初期化されない共有ライブラリが動的共有メモリアクセスを調整することが可能になります。
追加モジュール
- 非結合の条件を持つ結合を外部データラッパーとカスタムスキャンにプッシュダウンすることが可能になりました。 (Richard Guo, Etsuro Fujita) (17)
これを行うには、外部データラッパーとカスタムスキャンが、本ケースに対応できるように修正されている必要があります。
(下記例の「AND CURRENT_DATE = now()::date;」の条件が加わると、 これまでは結合のプッシュダウンが行われなかった) db1=# explain (verbose) SELECT * FROM ft145 JOIN ft145d ON ft145.id = ft145d.id AND CURRENT_DATE = now()::date; QUERY PLAN ----------------------------------------------------------------------------------- Result (cost=100.01..257588.74 rows=10101 width=12) Output: ft145.id, ft145.v, ft145d.id, ft145d.c1 One-Time Filter: (CURRENT_DATE = (now())::date) -> Foreign Scan (cost=100.01..257588.74 rows=10101 width=12) Output: ft145.id, ft145.v, ft145d.id, ft145d.c1 Relations: (public.ft145) INNER JOIN (public.ft145d) Remote SQL: SELECT r1.id, r1.v, r2.id, r2.c1 FROM (public.t145 r1 INNER JOIN public.t145d r2 ON (((r1.id = r2.id)))) (7 rows)
(新たに可能となったプッシュダウンの例) db1=# explain (verbose) SELECT * FROM ft145 WHERE id IN (SELECT id FROM ft145 WHERE id < 10); QUERY PLAN ---------------------------------------------------------------------------------------- Foreign Scan (cost=100.00..467.99 rows=1 width=6) Output: ft145.id, ft145.v Relations: (public.ft145) SEMI JOIN (public.ft145 ft145_1) Remote SQL: SELECT r1.id, r1.v FROM public.t145 r1 WHERE EXISTS ( SELECT NULL FROM public.t145 r3 WHERE ((r3.id < 10)) AND ((r1.id = r3.id))) (4 rows)
値はオプティマイザ(プランナ)から使われます。
これまでは以下のような Ctrl-C (INTシグナル) による SQL実行のキャンセルができませんでした。なお、このようにキャンセルしても、リモートセッション上の SQL実行は継続します。
db1=# SELECT dblink_exec('dbname=db1 host=localhost', 'SELECT pg_sleep(100)'); ^C Cancel request sent ERROR: canceling statement due to user request
同様に、ltree型の列についてハッシュ結合やハッシュ集約も可能になりました。
(これまで以下の出力が「11/2」となってしまう不都合がありました) db1=# SELECT unaccent('1?'); unaccent ---------- 1 1/2 (1 row)
・amcheck拡張でユニーク制約違反を検査できるようになりました。
pg_amcheckコマンドにも、これを行う新たなオプション --checkunique が加わりました。
これは開発終了した pgAdmin III で使われていました。
これは拡張の開発に有用と考えられます。
使用例としては postgres_fdw と dblink でカスタム定義イベントが追加されています。
これはテストに有用と考えられます。
pg_stat_statements
- pg_stat_statements 内の CALLパラメータをプレースホルダに置き換えるようになりました。 (Sami Imseih) (17)
(15.x以前はパラメータが異なると、異なるSQLとして収集) CALL p1 (2, 'v2') CALL p1 (1, 'v1') (16.x以降はパラメータをプレースホルダに置き換え、同じSQLとして収集) CALL p1 ($1, $2)
これにより、SAVEPOINT、RELEASE SAVEPOINT、および ROLLBACK TO SAVEPOINTコマンドを記録するのに必要なエントリ数が大幅に削減されます。
(15.x以前はセーブポイント名が異なると、異なるSQLとして収集) SAVEPOINT sp2 SAVEPOINT sp1 (16.x以降はセーブポイントをプレースホルダに置き換え、同じSQLとして収集) SAVEPOINT $1
これにより、PREPARE TRANSACTION、COMMIT PREPARED、および ROLLBACK PREPARED コマンドを記録するのに必要なエントリ数が大幅に削減されます。
(15.x以前はGIDが異なると、異なるSQLとして収集) PREPARE TRANSACTION 'pt2' PREPARE TRANSACTION 'pt1' (16.x以降はGIDをプレースホルダに置き換え、同じSQLとして収集) PREPARE TRANSACTION $1
このとき、プリペアドステートメント名はプレースホルダとして pg_stat_statements 内に保存されます。
新しい列は local_blk_read_time と local_blk_write_time です。
新しい列は jit_deform_count と jit_deform_time で、それぞれタプルデフォーミングの回数、総時間を示します。
この引数のデフォルトは false です。