このページでは PostgreSQL 14(2021/9/30リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン14の新機能については「PostgreSQL 14 検証報告」も参照してください。
バージョン14の主要な拡張
PostgreSQL 14 の主な拡張点としては以下があります。
- Btree Index 肥大化防止
- 式の拡張統計のサポート
- LZ4によるデータ圧縮のサポート
- パラレルクエリ、ロジカルレプリケーション、FDWを含む各種の性能改善
- マルチ範囲型の追加
- SEARCH/CYCLE句サポート
- セッション制御機能の追加
- pg_read_all / pg_write_all ロール
- amcheck の拡張と pg_amcheckコマンド追加
- 各種の実行時統計ビューの拡張・追加
PostgreSQL 14 への移行/互換性のない変更点
- いくつかの引数を伴う組込の配列関数を参照するユーザ定義オブジェクトは、再作成が必要で、pg_upgrade だけでは移行できません。 (Tom Lane) (14)
- 組込の幾何データ型と contribモジュールの cube、hstore、intarray、seg に対する包含の演算子 @ および ~ が廃止されました。 (Justin Pryzby) (14)
- to_tsquery() と websearch_to_tsquery() が破棄トークンを含む問い合わせテキストを適切にパースするように修正されました。 (Alexander Korotkov) (14)
- クォート内の複数の隣接する破棄トークンを適切にパースするようにwebsearch_to_tsquery() が修正されました。 (Alexander Korotkov) (14)
- EXTRACT が numeric型を返すようになりました。 (Peter Eisentraut) (14)
- numeric型パラメータの集約関数 var_samp()、stddev_samp() が単一の NaN 値の入力に対して NULL を返すように変更されました。 (Tom Lane) (14)
- has_column_privilege() が、アトリビュート番号(pg_attribute.attnum)で存在しないか削除された列を指定して実行したときに、NULL を返すようになりました。 (Joe Conway) (14)
- 無限を伴うウィンドウ関数の範囲を正しく扱えるように修正されました。 (Tom Lane) (14)
- 階乗の演算子 ! および !! が廃止されました。 (Mark Dilger) (14)
- factorial() 関数に負の値を指定できなくなりました。 (Peter Eisentraut) (14)
- 後置演算子(右単項演算子)が廃止されました。 (Mark Dilger) (14)
- 正規表現で改行を区別するモード(オプション n)の場合に、\D と \W が改行にマッチするようになりました。 (Tom Lane) (14)
- 正規表現の後方参照のマッチで、制約を無視するようになりました。 (Tom Lane) (14)
- 正規表現の文字クラスで、範囲の先頭または末尾の \w が禁止されました。 (Tom Lane) (14)
- カスタム設定名に使える文字が、クォート無しの SQL識別子として有効な文字だけに限定されました。 (Tom Lane) (14)
- 設定 password_encryption のデフォルトが scram-sha-256 に変更されました。 (Peter Eisentraut) (14)
- 設定 vacuum_cleanup_index_scale_factor が廃止されました。 (Peter Geoghegan) (14)
- 設定 operator_precedence_warning が廃止されました。 (Tom Lane) (14)
- pg_hba.conf の認証オプション clientcert の仕様が変更されました。 (Kyotaro Horiguchi) (14)
- SSL圧縮のサポートが廃止されました。 (Daniel Gustafsson, Michael Paquier) (14)
- サーバと libpq で、バージョン 2 プロトコルがサポートされなくなりました。 (Heikki Linnakangas) (14)
- CREATE/DROP LANGUAGEコマンドで、言語名を文字列リテラルで指定する構文が廃止されました。 (Peter Eisentraut) (14)
- シーケンスと TOASTテーブルに対応した複合型が作成されなくなりました。 (Tom Lane) (14)
- ecpg の SQLコマンド文字列で二重のクォートを正しく処理するようになりました。 (Tom Lane) (14)
- intarray に対する包含の演算子(<@ と @>)に、GiSTインデックスが使用できなくなりました。 (Tom Lane) (14)
- contrib の pg_standbyコマンドが廃止されました。 (Justin Pryzby) (14)
- contrib の tablefunc の関数 normal_rand() が numvals(行数)に負の値を受け付けなくなりました。 (Ashutosh Bapat) (14)
具体的には、以下の関数の引数が anyarray型から anycompatiblearray型に変更されたため、これらの配列関数を参照する集約や演算子のようなユーザ定義オブジェクトは、アップグレード前に削除してアップグレード後に再作成しなければなりません。
array_append() array_prepend() array_cat() array_position() array_positions() array_remove() array_replace() width_bucket()
これらは既に長らく非推奨となっており、代わりに <@ と @> が推奨されていました。
「_」「=」「#」など、いくつかの破棄トークンはこれら関数で不正確な psquery 出力を引き起こしました。例えば、「websearch_to_tsquery('"pg_class pg"')」と「to_tsquery('pg_class <-> pg')」は、いずれも「( 'pg' & 'class' ) <-> 'pg'」を出力していましたが、これからは「'pg' <-> 'class' <-> 'pg'」を出力します。
これまでは、複数の隣接する破棄トークンを含むクォート内のテキストは複数トークンとして扱われて、不正確な tsquery出力を引き起こしていました。例えば「websearch_to_tsquery('"aaa: bbb"')」は「'aaa' <2> 'bbb'」を、「websearch_to_tsquery('"aaa:: bbb"')」は「'aaa' <3> 'bbb'」を出力していましたが、これからはいずれも「'aaa' <-> 'bbb'」を出力します。
これまでは double precision(別名 float8)でした。以前の振る舞いをさせるには date_part() 関数を利用できます。こちらは依然として double precision型を返します。
また、EXTRACT(date) は date型に含まれない部分を要求したときに、以下のようにエラーを投げるようになりました。
db=# SELECT EXTRACT (minute FROM '2021-10-05'::date); ERROR: date units "minute" not supported (13.x バージョンでは 0 が返りエラーにならない)
これまでは NaN が返っていました。本変更により、浮動小数点型(double precision、real)のパラメータを取る場合と同じ振る舞いになりました。
これまでは以下のようなエラーが生じることがありました。
ERROR: attribute 12 of relation with OID 34567 does not exist
これまでは「RANGE BETWEEN 'inf' PRECEDING AND 'inf' FOLLOWING」のようなウィンドウフレーム句は誤った結果を返していました。該当するケースは実用の SQL にはおそらく現れないと考えられます。
階乗の関数 numeric_fac() も廃止されました。factorial() 関数は引き続き提供されます。
これまでは負の値には何でも 1 が返りましたが、階乗の本来の定義に則り、以下のエラーを出すようになりました。
ERROR: factorial of a negative number is undefined
pg_dump と pg_upgrade は後置演算子がダンプされた場合、警告するようになります。
これまではこれらは改行にマッチしませんでしたが、これは他の一般的な正規表現エンジンの振る舞いと異なりました。\D、\W をそれぞれ [^[:digit:]] 、 [^[:word:]] で置き換えれば従来の振る舞いを再現できます。
db=# SELECT regexp_match(E'abc\ndef', '(\D+)', 'n'); (13.xの応答) regexp_match -------------- {abc} (1 row) (14.0の応答) regexp_match -------------- {"abc + def"} (1 row)
例えば、以下は先頭から始まる数字の並びが後方に再び現れるパターンにマッチしますが、このとき「\1」に対しては制約「^」が無視されるようになります。
(14.0 の動作、これは 13.x ではマッチしない) db=# SELECT regexp_match('123xxx123', '(^\d+).*\1'); regexp_match -------------- {123} (1 row) (こう書けば 14.0 でも 13.x でもマッチする) db=# SELECT regexp_match('123xxx123', '^(\d+).*\1'); regexp_match -------------- {123} (1 row)
これまでは許容されていましたが意図せぬ結果が生じていました。
(13.x の動作例、「[[:alnum:]_-_]」と解釈されて動作していた) db=# SELECT '_' ~ '[\w-_]'; ?column? ---------- t (1 row) (14.0 では以下エラーになる) ERROR: invalid regular expression: invalid character range
これまでは各種の記号も利用可能でした。
(14.0 での実行例、これは 13.x ではエラーにならない) db=# SET "x==x.a~z" TO 123; ERROR: invalid configuration parameter name "x==x.a~z" DETAIL: Custom parameter names must be two or more simple identifiers separated by dots.
これまでは md5 でした。既存のパスワード格納に md5 を用いている場合、アップグレード時に設定調整かパスワード設定のやり直しが必要となります。また、「on」や「true」、「1」を設定した場合、md5 と解釈されていましたが、この振る舞いは廃止されました。
これは PostgreSQL 13.3 から無視されるようになっていました。
本変更は btreeインデックスの autovacuum性能を改善する意図によるもので、挿入タプル数の統計からインデックスをスキャンするかを決める仕組み自体が廃止されました。
これは PostgreSQL 9.5 における仕様変更に該当する演算子を警告するものでした。
clientcert の設定値に 1、0、no-verify は使えなくなり、verify-ca、 verify-full だけが使用可能になります。また、認証方式が cert であるエントリでは verify-full相当の検査が必要となるため、clientcert=verify-ca の指定はできなくなります(下記ログメッセージが出て設定が受け付けられません)。
LOG: clientcert only accepts "verify-full" when using "cert" authentication LOG: pg_hba.conf was not reloaded
これまでのバージョンでもデフォルトで無効となっていました。また、新しい OpenSSL および TLS のバージョンでは、これはサポートされません。接続パラメータ sslcompression は無視されるようになります。
これは 2002年リリースの PostgreSQL 7.3 ではデフォルトでしたが、PostgreSQL 7.4 以降はバージョン 3 プロトコルがデフォルトになりました。
以前は「CREATE LANGUAGE plperl」を「CREATE LANGUAGE 'plperl'」と記述できました。
pg_typeシステムテーブルからシーケンスやTOASTテーブルの存在を調べることはできなくなります。
これまでは 'abc''def' は 'abc'def' として、"abc""def" は "abc"def" として、サーバに渡され、その結果、構文エラーを引き起こしていました。
以前の不適切な動作に対処するための記述をしていた場合、修正が必要です。
GiSTインデックスを使った本演算子の処理には、フルGiSTインデックススキャンが必要であったため、それをせずにヒープをスキャンを行う方が高速でした。該当するインデックスは削除するべきです。
本コマンドが無くとも、レプリケーションのスタンバイを作ることで同様の構成が実現可能です。
これまで負の値を指定すると符号無し整数と解釈して大量行の生成が試みられました。
変更点
サーバ
- pg_read_all_data および pg_write_all_data という定義済みのロールが追加されました。 (Stephen Frost) (14)
- 現在のデータベースの所有者のみを含む定義済みのロールpg_database_owner が追加されました。 (Noah Misch) (14)
- バックエンドプロセスがクラッシュした後に一時ファイルが削除されるようになりました。 (Euler Taveira) (14)
- クライアントが切断された場合に、長時間実行している問い合わせをキャンセルできるようになりました。 (Sergey Cherkashin, Thomas Munro) (14)
- pg_terminate_backend() 関数にオプションのタイムアウトパラメータが追加されました。 (Magnus Hagander) (14)
- 幅の広いタプルを、ほぼ空のヒープページに常に追加できるようになりました。 (John Naylor, Floris van Nee) (14)
- SSL接続パケットにサーバ名表示 (SNI: Server Name Indication)が追加されました。 (Peter Eisentraut) (14)
これらのログイン権限無しのロールを使用して、すべてのテーブル、ビュー、シーケンスの読み取り権限または書き込み権限を付与することができます。
これは特にテンプレートデータベースで役立ちます。
これまではデバッグ目的でこのようなファイルを残していました。 新しい remove_temp_files_after_crash 設定パラメータを必要に応じてoff に設定することで、従来通りファイルを残すこともできます。
設定 client_connection_check_interval で、問い合わせ内での接続切れを検査するかどうかを制御できます。これは、Linux と他のいくつかの OS でサポートされています。
2番目引数の timeoutパラメータ(デフォルト 0)に 0 より大きい値を指定すると、タイムアウト時間(秒単位)を上限としてプロセスが実際に終了したかを待つようになります。
また、プロセス終了を待つ pg_wait_for_backend_termination() 関数も追加されました。
以前は、ページのフィルファクタを超えてしまうタプルの INSERT では常に新しく拡張されたページに追加されていました。
これはクライアントの接続オプション sslsni をオフにすることで無効にできます。
VACUUM
- 削除可能なインデックスエントリ数が些少である場合は、バキュームがインデックスのバキュームをスキップできるようになりました。 (Masahiko Sawada, Peter Geoghegan) (14)
- バキュームが削除された btreeページをより熱心に空き領域マップに追加できるようになりました。 (Peter Geoghegan) (14)
- バキュームが未使用のヒープラインポインタ末尾で使用されるスペースを回収できるようになりました。 (Matthias van de Meent, Peter Geoghegan) (14)
- 弱いロックのみ伴うインデックス操作中に、バキュームがより積極的にデッドタプルを除去できるようになりました。 (Alvaro Herrera) (14)
- 多数のリレーションを持つデータベースのバキューム処理が高速化されました。 (Tatsuhito Kasahara) (14)
- 現在のハードウェア性能をより適切に反映するためにvacuum_cost_page_miss 設定のデフォルト値が減りました。 (Peter Geoghegan) (14)
- TOASTテーブルのバキュームを省略できるようになりました。 (Nathan Bossart) (14)
- COPY FREEZE がページの可視性ビットを適切に更新するようになりました。 (Anastasia Lubennikova, Pavan Deolasee, Jeff Janes) (14)
- テーブルが xid や multixact の周回に近い場合はバキューム処理をより積極的に行うようになりました。 (Masahiko Sawada, Peter Geoghegan) (14)
- トランザクションID とマルチトランザクションID が周回する前の警告時とシステム停止するハードリミットの閾値が増加されました。 (Noah Misch) (14)
- 自動バキュームのログ出力にインデックスごとの情報が追加されました。 (Masahiko Sawada) (14)
VACUUM コマンドの INDEX_CLEANUP パラメータのデフォルト値は、この最適化が有効となる auto になりました。
これまでのバキュームでは、以前のバキュームで削除済みとマークされたページしか空き領域マップに追加できませんでした。
具体的には、CREATE INDEX CONCURRENTLY と REINDEX CONCURRENTLY は、他リレーションのデッドタプル除去を制限しなくなります。
10 から 2 に変更されました。
VACUUMコマンドには TOAST処理を無効にするために false に設定できるPROCESS_TOAST オプションが、vacuumdbコマンドには --no-process-toast オプションが追加されました。
これまで COPY FREEZE は個々のタプルを凍結済としてマークするだけでページレベルのフラグを更新していなかったため、COPY FREEZE 後の最初の VACUUM でテーブル全体を書き換える必要がありました。
これは vacuum_failsafe_age 設定パラメータと multixact_failsafe_age 設定パラメータによって制御されます。
トランザクションID は、警告が周回の 1100万トランザクション前から 4000万トランザクション前、ハードリミットが周回の 100万トランザクション前から 300万トランザクション前になりました。マルチトランザクションID は、警告が周回の 1000万トランザクション前から 4000万トランザクション前、ハードリミットが周回の 100トランザクション前から 300万トランザクション前になりました。
パーティショニング
- 多数のパーティションを持つパーティションテーブルで、更新と削除のパフォーマンスが向上しました。 (Amit Langote, Tom Lane) (14)
- パーティションを強いロックを伴わずに切り離すことができるようになりました。 (Alvaro Herrera) (14)
- パーティション境界値の COLLATE句を無視するようになりました。 (Tom Lane) (14)
この変更により、このような場合のプランナのオーバーヘッドが大幅に削減され、また、更新/削除を実行する際にパーティションプルーニングが利用可能になりました。
そのために「ALTER TABLE ... DETACH PARTITION ... [CONCURRENTLY | FINELIZE]」という構文が追加されました。
これまで、このような COLLATE句はパーティションキーの照合順序と一致する必要がありました。しかし、指定を無視して自動的にパーティションキーの照合順序に合わせる新たな動作の方が一貫性があります。
インデックス
- ページ分割を防ぐために、btreeインデックスの追加に際して、期限切れのインデックスエントリを削除できるようになりました。 (Peter Geoghegan) (14)
- BRINインデックスで範囲ごとに複数の min/max値が記録できるようになりました。 (Tomas Vondra) (14)
- BRINインデックスでブルームフィルターを使用できるようになりました。 (Tomas Vondra) (14)
これは、インデックス付きの列が頻繁に更新されるテーブルのインデックスの肥大化を抑えるのに特に役立ちます。
これは各ページの範囲に値のグループがある場合に有効です。
これにより、ヒープ内で十分に局所化されていないデータでBRINインデックスを効果的に使用できます。
(ブルームフィルタ用の演算子クラスを指定して使用します) db=# CREATE TABLE t24 (a int); db=# CREATE INDEX ON t24 USING brin (a int4_bloom_ops(false_positive_rate = 0.05, n_distinct_per_range = 100));
事前ソートは自動的に行われ、インデックス作成の高速化とインデックスの小型化が実現されます。
プランナ
- 多くの定数を持つ IN句のハッシュ検索が可能になりました。 (James Coleman, David Rowley) (14)
- OR句の推定に拡張統計を使用できる箇所が増えました。 (Tomas Vondra, Dean Rasheed) (14)
- 式の拡張統計を可能にします。 (Tomas Vondra) (14)
- TID の範囲を効率的にヒープスキャンできるようになりました。 (Edmund Horner, David Rowley) (14)
これまでのコードは、常に値のリストを順番にスキャンしていました。
これにより、以前のような列だけではなく、式と列のグループに対するプランナ統計が利用可能になります。システムビュー pg_stats_ext_exprs はそのようなプランナ統計を報告するようになりました。
これまでは等価条件以外の TID指定ではシーケンシャルスキャンが必要でした。このために新たに Tid Range Scanプラン要素が追加されました。
(14.0での実行例) db=# explain SELECT * FROM t30 WHERE ctid < '(2,0)'; QUERY PLAN ------------------------------------------------------------ Tid Range Scan on t30 (cost=0.00..11.36 rows=536 width=4) TID Cond: (ctid < '(2,0)'::tid) (2 rows)
オブジェクトがすでに存在している場合に、以前は EXPLAIN は無効な結果を返していましたが、NOTICEメッセージと 0行を返すようになりました。
性能一般
- CPU数が多くセッション数が多いシステムで MVCC可視化スナップショットの計算速度が向上しました。 (Andres Freund) (14)
- ネストループ結合の内側からの結果をメモ化するエクゼキュータ方式が追加されました。 (David Rowley) (14)
- ウィンドウ関数でインクリメンタルソートが実行できるようになりました。 (David Rowley) (14)
- 並列シーケンシャルスキャンの I/O性能が向上しました。 (Thomas Munro, David Rowley) (14)
- 複数の外部テーブルを参照する問い合わせが、外部テーブルスキャンを並行して実行できるようになりました。 (Robert Haas, Kyotaro Horiguchi, Thomas Munro, Etsuro Fujita) (14)
- analyze でページの先読みを行えるようになりました。 (Stephen Frost) (14)
- 正規表現検索の性能が向上しました。 (Tom Lane) (14)
- ユニコード正規化の性能が大幅に向上しました。 (John Naylor) (14)
- TOASTデータを LZ4 で圧縮できるようになりました。 (Dilip Kumar) (14)
アイドル状態のセッションが多い場合の性能も向上します。
これは、内側でチェックされる行の割合が非常に少ない場合に役立ちます。この機能は、enable_memoize設定で無効にすることができます。
グループ内のブロックをパラレルワーカに割り当てることで実現されました。
postgres_fdw は非同期実行オプションの async_capable パラメータが設定されている場合に、このタイプのスキャンをサポートします。
これは maintenance_io_concurrency設定で制御できます。
normalize() と IS NORMALIZED が高速化されています。
この機能は、列レベルで設定することも、default_toast_compression でデフォルトとして設定することもできます。この機能を使用するには、サーバが --with-lz4 オプションを付けてコンパイルされている必要があります。デフォルトは従来からの圧縮方式の pglz です。
モニタリング
- compute_query_id 設定が有効な場合、pg_stat_activity、EXPLAIN VERBOSE、csvlog、および log_line_prefix 設定のオプションで、クエリID が出力されます。 (Julien Rouhaud) (14)
- 自動バキュームと自動アナライズのログが改善されました。 (Stephen Frost, Jakub Wartak) (14)
- log_connections設定の出力に、クライアントから提供された独自のユーザ名の情報を追加するようになりました。 (Jacob Champion) (14)
また拡張モジュールによって計算されたクエリID も表示されます。
track_io_timing設定が有効になっている場合、自動バキュームおよび自動アナライズの I/Oタイミングが報告されます。また、自動アナライズについてバッファ読み取り率とダーティ率も報告されます。
認証方法により様々な種類の情報が記録されます。
システムビュー
- COPY の進捗状況を報告するシステムビュー pg_stat_progress_copy が追加されました。 (Josef ?imanek, Matthias van de Meent) (14)
- WAL のアクティビティを報告する pg_stat_wal システムビューが追加されました。 (Masahiro Ikeda) (14)
- レプリケーションスロットのアクティビティを報告する pg_stat_replication_slots システムビューが追加されました。 (Masahiko Sawada, Amit Kapila, Vignesh C) (14)
- セッションメモリ使用量を報告する pg_backend_memory_contexts システムビューが追加されました。 (Atsushi Torikoshi, Fujii Masao) (14)
- 任意のバックエンドのメモリコンテキストを出力するpg_log_backend_memory_contexts() 関数が追加されました。 (Atsushi Torikoshi) (14)
- pg_stat_database システムビューにセッション統計が追加されました。 (Laurenz Albe) (14)
- pg_prepared_statementsビューに汎用およびカスタムプランの数を報告する generic_plans 列と custom_plans 列が追加されました。 (Atsushi Torikoshi, Kyotaro Horiguchi) (14)
- pg_locksビューにロック待機開始時間を表示する waitstart 列が追加されました。 (Atsushi Torikoshi) (14)
- アーカイバプロセスが pg_stat_activityビューで表示されるようにしました。 (Kyotaro Horiguchi) (14)
- WALレシーバーの終了待ち時間を報告するためのWalReceiverExit 待機イベントが追加されました。 (Fujii Masao) (14)
- 関数およびプロシージャのデフォルト式で参照される列を追跡するために、情報スキーマビュー routine_column_usage が実装されました。 (Peter Eisentraut) (14)
スロットの統計情報は pg_stat_reset_replication_slot() 関数でリセットされます。
バックエンドの PID を引数に指定して関数を実行すると指定したバックエンドのメモリコンテキスト情報がPostgreSQL ログに出力されます。
セッション統計で追加された列は、session_time、active_time、idle_in_transaction_time、sessions、sessions_abandoned、sessions_fatal、sessions_killed です。
pg_stat_activityビューにおける IPC 待機イベント型に属します。
認証
- SSL証明書の識別名(DN)をクライアント証明書による認証で照合できるようになりました。 (Andrew Dunstan) (14)
- pg_hba.conf および pg_ident.conf のレコードが複数の行にまたがることができるようになりました。 (Fabien Coelho) (14)
- 証明書失効リスト(CRL)ディレクトリの指定が可能になりました。 (Kyotaro Horiguchi) (14)
- 任意の長さのパスワードが使用可能になりました。 (Tom Lane, Nathan Bossart) (14)
これまではコモンネーム (CN) のみに対応していましたが、新しい pg_hba.conf のオプション clientname=DN を指定すると、CN だけでない証明書属性で比較して ident map と結びつけることができます。
行末でバックスラッシュを使用すると、レコードの内容を次の行に続けることができます。
これは、ssl_crl_dir設定および libpq の接続オプションによって制御されます。以前は、ssl_crl_file設定で単一の CRLファイルのみ指定が可能でした。
これまで、様々なクライアントツールで 100文字までの制限があり、サーバ側に 1000文字程度で上限となる箇所がありました。
サーバ設定
- アイドルセッションを閉じるための idle_session_timeout設定が追加されました。 (Li Japin) (14)
- checkpoint_completion_target設定パラメータのデフォルト値が 0.9 に変更されました。 (Stephen Frost) (14)
- log_line_prefix設定の %P でパラレルワーカのパラレルグループリーダーのPID を報告できるようになりました。 (Justin Pryzby) (14)
- unix_socket_directories設定でクォートされたパスの文字列をコンマ区切りで設定できるようになりました。 (Ian Lawrence Barwick) (14)
これは開いたトランザクション中のアイドルセッションを閉じるidle_in_transaction_session_timeout設定と似たものです。
これまでのバージョンでのデフォルト値は 0.5 でした。
これまではすべてのパスが 1つのクォート文字列でなければなりませんでした。実行例を以下に示します。
(13.x) db=# ALTER SYSTEM SET unix_socket_directories = '/path1', '/path2'; ERROR: SET unix_socket_directories takes only one argument (14.0) db=# ALTER SYSTEM SET unix_socket_directories = '/path1', '/path2'; ALTER SYSTEM
新たな設定 min_dynamic_shared_memory で制御します。これにより huge page をより多く使用できるようになります。
ストリーミングレプリケーションとリカバリ
- pg_rewind のソースサーバとしてスタンバイサーバを指定できるようになりました。 (Heikki Linnakangas) (14)
- サーバのリロードで restore_command設定を変更できるようになりました。 (Sergei Kornilov) (14)
- 長時間のリカバリコンフリクトの待ち時間をログ報告するための新たな設定 log_recovery_conflict_waits が追加されました。 (Bertrand Drouvot, Masahiko Sawada) (14)
- プライマリのパラメータ変更によってスタンバイがリカバリできなくなった場合に、ホットスタンバイサーバのリカバリを一時停止するようになりました。 (Peter Eisentraut) (14)
- リカバリ状態を報告する pg_get_wal_replay_pause_state() 関数が追加されました。 (Dilip Kumar) (14)
- 読み取り専用の設定 in_hot_standby が追加されました。 (Haribabu Kommi, Greg Nancarrow, Tom Lane) (14)
- 巨大な共有バッファを持つサーバで、リカバリ中の小さいテーブルの切り詰めが高速化されました。 (Kirk Jamison) (14)
- Linux でクラッシュリカバリ開始時にファイルシステム同期ができるようになりました。 (Thomas Munro) (14)
- 指定されたトランザクションのコミットタイムスタンプとレプリケーションオリジンを返す pg_xact_commit_timestamp_origin() 関数が追加されました。 (Movead Li) (14)
- pg_last_committed_xact() によって返されるレコードにレプリケーションオリジンが追加されました。 (Movead Li) (14)
- レプリケーションオリジンの関数群が標準的な関数の権限制御を使用して制御されるようになりました。 (Martin Marques) (14)
これにより、restore_command に空文字を設定してリロードして、そこからは pg_walディレクトリからのリカバリだけをさせることも可能になりました。
max_connections をスタンバイより多くする等の変更が該当します。
以前は、このような場合にスタンバイは直ちにシャットダウンしていました。
これは、既存の pg_is_wal_replay_paused() よりも詳細な情報が提供されます。
クライアントはこれによりホットスタンバイサーバに接続しているかどうかを簡単に検出できます。
デフォルトでは、PostgreSQL はクラッシュリカバリ開始時にデータベースクラスタ内の各データファイルを開いて fsync します。新たな設定 recovery_init_sync_method に syncfs を指定すると、代わりに syncfs() でクラスタで使用される各ファイルシステムを同期します。これにより多くのデータベースファイルがあるシステムのリカバリが速くなります。
これらの関数(pg_replication_origin_*() と pg_show_replication_origin_status())はスーパーユーザのみが実行可能ですが、以前はハードコードされていました。
ロジカルレプリケーション
- ロジカルレプリケーションで、進行中の長いトランザクションをサブスクライバにストリーミングできるようになりました。 (Dilip Kumar, Amit Kapila, Ajin Cherian, Tomas Vondra, Nikhil Sontakke, Stas Kelvich) (14)
- ロジカルレプリケーションの API が拡張され、大きな進行中のトランザクションをストリーミングできるようにしました。 (Tomas Vondra, Dilip Kumar, Amit Kapila) (14)
- ロジカルレプリケーションのテーブル同期中に複数のトランザクションを許容するようにしました。 (Peter Smith, Amit Kapila, Takamichi Osumi) (14)
- サブトランザクションとトップレベルXID の関連付けを即座に WAL書き出しするようになりました。 (Tomas Vondra, Dilip Kumar, Amit Kapila) (14)
- 二相コミットを扱うために、ロジカルデコーディングの API が拡張されました。 (Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) (14)
- ロジカルレプリケーションを使用している場合、DDLコマンド完了時に WAL にキャッシュ無効化メッセージを追加するようになりました。 (Dilip Kumar, Tomas Vondra, Amit Kapila) (14)
- ロジカルデコーディングにおいてキャッシュ無効メッセージをより効率的に処理できるようになりました。 (Dilip Kumar) (14)
- ロジカルデコーディングのメッセージをレプリケーションストリームに送出するかどうか、制御できるようになりました。 (David Pirotte, Euler Taveira) (14)
- ロジカルレプリケーションのサブスクリプションがバイナリ転送モードを使用できるようになりました。 (Dave Cramer) (14)
- ロジカルデコーディングを XID でフィルタできるようになりました。 (Markus Wanner) (14)
以前は、logical_decoding_work_mem設定を超えるトランザクションは、トランザクションが完了するまでパブリッシャ側でディスクに書き込まれていました。
出力関数は stream で始まります。test_decoding もこれらをサポートします。
これはロジカルデコーディングで有用です。
これは pg_create_logical_replication_slot() 関数で制御されます。
これにより、進行中のトランザクションのロジカルストリーミングが可能になります。ロジカルレプリケーションが無効であるときには、トランザクション完了時にのみ無効化メッセージが生成されます。
これにより、大量の DDL が存在する場合に、ロジカルデコーディングが効率的に動作するようになります。
そのためにプロトコルが拡張されました。
これはテキストモードよりも高速ですが、堅牢性は若干劣ります。
SELECT/INSERT
- AS 無しでは列ラベルとして使用できないキーワード数が減りました。 (Mark Dilger) (14)
- JOIN の USING句に別名を指定できるようになりました。 (Peter Eisentraut) (14)
制限されるキーワードが 90% 少なくなりました。
別名は USING句の後に AS と書くことで作成されます。これはマージされた USING列のテーブル修飾として使用でます。
(使用例) db=# CREATE TABLE t87a (id int, idsub int, v text); db=# CREATE TABLE t87b (id int, idsub int, v text); db=# INSERT INTO t87a VALUES (1, 1, 'A'); db=# INSERT INTO t87b VALUES (1, 1, 'B'); db=# SELECT x.* FROM t87a JOIN t87b USING (id, idsub) AS x; id | idsub ----+------- 1 | 1 (1 row)
例えば、GROUP BY CUBE (a,b), CUBE (b,c) は、DISTINCT がないと重複した GROUPING SET の組み合わせを生成します。
このような場合、以前はエラーが発生していました。
(13.x での挿入に失敗する例) db=# CREATE TABLE t89 (id int generated always as identity); db=# INSERT INTO t89 VALUES (DEFAULT), (DEFAULT); ERROR: cannot insert into column "id" DETAIL: Column "id" is an identity column defined as GENERATED ALWAYS. HINT: Use OVERRIDING SYSTEM VALUE to override. (OVERRIDING USER VALUE は DEFAULT 以外を指定する際に使うものなので HINT も不適切)
既存の構文を使用しても同じ結果が得られますが、非常に不便でした。
ただし、参照できるのは対象のテーブルのみです。
ユーティリティーコマンド
- REFRESH MATERIALIZED VIEW が並列処理できるようになりました。 (Bharath Rupireddy) (14)
- REINDEX が新しいインデックスのテーブル空間を変更できるようになりました。 (Alexey Kondratov, Michael Paquier, Justin Pryzby) (14)
- REINDEX がパーティショニングされたリレーションのすべての子テーブルやインデックスを処理できるようになりました。 (Justin Pryzby, Michael Paquier) (14)
- CONCURRENTLY を使用するインデックスコマンドが、CONCURRENTLY を使用する他の操作の完了を待たずに処理できるようになりました。 (Alvaro Herrera) (14)
- バイナリモードでの COPY FROM のパフォーマンスが改善されました。 (Bharath Rupireddy, Amit Langote) (14)
- ビュー定義における SQL定義関数に対して SQL標準構文を保持するようになりました。 (Tom Lane) (14)
- GRANT と REVOKE に SQL標準の GRANTEDBY句が追加されました。 (Peter Eisentraut) (14)
- CREATE TRIGGER に OR REPLACE オプションを追加されました。 (Takamichi Osumi) (14)
- TRUNCATE で外部テーブルを操作できるようになりました。 (Kazutaka Onishi, Kohei KaiGai) (14)
- サブスクリプションに対するパブリケーション追加や削除がより容易にできるようになりました。 (Japin Li) (14)
- システムカタログに主キー、一意性制約、および外部キーが追加されました。 (Peter Eisentraut) (14)
- CURRENT_USER が受け入れられるすべての場所で CURRENT_ROLE も受け入れられるようになりました。 (Peter Eisentraut) (14)
REINDEX に TABLESPACE句を指定して変更できます。reindexdbコマンドには --tablespace オプションが追加されました。
これまではパーティションテーブル全体に対して REINDEX を使用できず、個々のパーティションやインデックスに対して実行する必要がありました。
これまでは、EXTRACT(.. from ..) のような SQL標準関数の呼び出しは、単純な関数呼び出しの構文で表示されていました。 ビューやルールを表示する際に、元の構文が保持されるようになりました。
これにより既存のトリガを条件付きで置き換えられます。
postgres_fdw モジュールもこれをサポートするようになりました。
新しい構文は ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION です。これにより、エントリーを追加、削除するためにすべてのパブリケーションを指定する必要がなくなりました。
これらの変更は、GUIツールがシステムカタログを分析するのに役立ちます。カタログの既存の一意性インデックスには、UNIQUE または PRIMARY KEY制約が関連付けられました。外部キーの関係は実際には制約として格納されたり実装されたりしませんが、pg_get_catalog_foreign_keys() 関数から表示用に取得できます。
データ型
- 拡張および組み込みのデータ型で添字を実装できるようになりました。 (Dmitry Dolgov) (14)
- JSONB に添字が利用できるようになりました。 (Dmitry Dolgov) (14)
- マルチ範囲データ型のサポートが追加されました。 (Paul Jungwirth, Alexander Korotkov) (14)
- アルメニア語、バスク語、カタロニア語、ヒンディー語、セルビア語、イディッシュ語の語幹処理がサポートされました。 (Peter Eisentraut) (14)
- tsearchデータファイルが無制限の行長を持てるようになりました。 (Tom Lane) (14)
- numericデータ型で Infinity と -Infinity がサポートされました。 (Tom Lane) (14)
- point に対する演算子 <<| および |>> が追加され、厳密に上か下かを表せるようになりました。 (Emre Hasegeli) (14)
- LSN と数値 (byte) とを加算、減算する演算子が追加されました。 (Fujii Masao) (14)
これまでは添字の処理はサーバーにハードコードされていたため、添字は配列型にしか適用できませんでした。この変更により、概念が意味を持つ任意の型の値の一部を抽出または割り当てるために、添字表記を使用できるようになりました。
JSONB の添字を使用して、JSONBドキュメントの一部を抽出したり割り当てたりできます。
これは範囲データ型と似ていますが、順序付けられた重ならない複数の範囲を指定できます。関連するマルチ範囲型はすべての範囲型に対して自動的に作成されます。
以前の制限は 4KB でした。 また、関数 t_readline() を削除しました。
浮動小数点データ型ではこれらを既にサポートしています。
以前は、これらは <^ と >^ と呼ばれていましたが、この命名は他の幾何学的データ型と一貫性がありませんでした。以前の名前も利用可能ですが、いつかは削除されるかもしれません。
(このような演算が可能になります) db=# SELECT '0/16AE7F7'::pg_lsn - 16::numeric; ?column? ----------- 0/16AE7E7 (1 row)
ユーザ定義のリレーションについては、複合型とその配列型が関連付けられて作成されていました。本バージョンからシステムカタログも同様になりました。
この変更により、シングルユーザーモードでユーザー定義テーブルを作成すると、複合配列型の作成に失敗するという不整合も修正されました。
関数
- SQL 言語の関数およびプロシージャの関数本体で、SQL 標準を使用できるようになりました。 (Peter Eisentraut) (14)
- プロシージャが OUT パラメータを持てるようになりました。 (Peter Eisentraut) (14)
- いくつかの配列関数が、互換性のあるデータ型の組み合わせで操作できるようにしました。 (Tom Lane) (14)
- SQL標準の trim_array() 関数が追加されました。 (Vik Fearing) (14)
- bytea型に対する ltrim() および rtrim() 関数が追加されました。 (Joel Jacobson) (14)
- split_part() で負の添字がサポートされました。 (Nikhil Benesch) (14)
- 文字列をデリミタで分割する string_to_table() 関数が追加されました。 (Pavel Stehule) (14)
- ユニコード文字を文字列のバックスラッシュ16進エスケープとして指定できるunistr() 関数が追加されました。 (Pavel Stehule) (14)
これまでは、文字列リテラルの関数本体のみがサポートされていました。 SQL 標準の構文で関数やプロシージャを書く場合、本体は直ちに解析され、解析ツリーとして保存されます。これにより、関数の依存関係をより正確に追跡でき、セキュリティ上の利点もあります。
関数 array_append()、array_prepend()、array_cat()、array_position()、array_positions()、array_remove()、array_replace()、width_bucket() は、anyarray 引数の代わりに anycompatiblearray を取るようになりました。 これにより、引数の型が完全に一致しているかどうかを気にする必要がなくなりました。
これはすでに配列スライスで行えましたが、あまり簡単ではありませんでした。
負の値は最後のフィールドから始まり、逆に数えます。
これは regexp_split_to_table() 関数と似たものです。
これはユニコードをリテラル文字列で指定する方法と似ています。
(実行例を示します) db=# SELECT 'Japanese : ' || unistr( '\65E5\672C\8A9E' ) AS unicode_test_string; unicode_test_string --------------------- Japanese : 日本語
すでに bit_and() と bit_or() は存在しています。順序付けられていない値のチェックサムとして役立ちます。
この関数は入力されたタイムスタンプをビン化します。即ち、指定された起点からの同一長に揃えられた区間にグループ分けします。
(実行例: '2020-02-11 15:34:17' が属するグループの先頭タイムスタンプが返る) =# SELECT date_bin('15 minutes', '2020-02-11 15:34:17', '2001-01-01'); date_bin ------------------------ 2020-02-11 15:30:00+09 (1 row)
負の値は紀元前 (BC) として解釈されます。
新しい SQL標準構文は SUBSTRING(text SIMILAR pattern ESCAPE escapechar) です。以前の標準構文は SUBSTRING(text FROM pattern FOR escapechar) でしたが、これは PostgreSQL で引き続き受け入れられます。
以前はこれを実行するとアンダーフローエラーが発生していました。
以前はエラーになっていました。
以前はしばしばアンダーフローエラーを返しました。
対象の関数では pg_proc カタログの proleakproof列が 't' に設定されます。これにより、セキュリティが重要な状況で、型変換を必要とする関数をより多く使用できるようになります。
PL/pgSQL
- PL/pgSQL の「=」式および代入の解析が改善されました。 (Tom Lane) (14)
この変更により、配列のスライスと入れ子になったレコードフィールドへの代入が可能になりました。
(以下のような実行が可能になります) db=# CREATE TYPE typ136 AS (x int, y int); db=# DO $$ DECLARE a typ136[]; BEGIN a := ARRAY[(1,2)::typ136,(3,4)::typ136]; a[2:3] := ARRAY[(5,6)::typ136,(7,8)::typ136]; a[1].x = 0; RAISE NOTICE 'a = %', a; END $$; NOTICE: a = {"(0,2)","(5,6)","(7,8)"}
カーソルを使用しないように変更することで実現されています。
クライアントインタフェース
- libpq にパイプラインモードが追加されました。 (Craig Ringer, Matthieu Garrigues, Alvaro Herrera) (14)
- libpq の target_session_attrs パラメータオプションが拡張されました。 (Haribabu Kommi, Greg Nancarrow, Vignesh C, Tom Lane) (14)
- libpq の PQtrace() の出力フォーマットが改善されました。 (Aya Iwata, Alvaro Herrera) (14)
- ECPG の SQL識別子を特定の接続に結びつけできるようになりました。 (Hayato Kuroda) (14)
- vacuumdb でインデックスのクリーンアップと切り詰めを省略できるようになりました。 (Nathan Bossart) (14)
- pg_dump で特定の拡張機能だけをダンプできるようになりました。 (Guillaume Lelarge) (14)
- pgbench に値をランダムにシャッフルする permute() 関数が追加されました。 (Fabien Coelho, Hironobu Suzuki, Dean Rasheed) (14)
- pgbench で -C を付けて再接続オーバヘッドを計測するときに切断時間を含むようになりました。 (Yugo Nagata) (14)
- 詳細オプション(-v) を複数指定してログの詳細度を増やす指定ができるようになりました。 (Tom Lane) (14)
複数のクエリを送信し、特定の同期メッセージが送信された時にのみ完了を待機することができるようになりました。
新しいオプションは read-only、primary、standby、prefer-standby です。
従来のバイトレベルの出力形式から、論理メッセージレベルの出力に変換されることでより使いやすくなりました。
これは DECLARE … STATEMENT で行うことができます。
クライアントアプリケーション
オプションは --no-index-cleanup と --no-truncate です。
--extension オプションで指定します。
以前は hash() 関数が推奨されていましたが、衝突により分布が変化する可能性がありました。
この機能は pg_dump、pg_dumpall、pg_restore で使用可能です。
psql
- psql の \df と \do コマンドで関数と演算子の引数の型を指定できるようになりました。 (Greg Sabino Mullane, Tom Lane) (14)
- psql の \d[i|m|t]+ の出力にアクセスメソッドの列が追加されました。 (Georgios Kokolatos) (14)
- psql の \dt と \di で TOASTテーブルとそのインデックスを表示できるようになりました。 (Justin Pryzby) (14)
- 拡張統計オブジェクトを表示する psql コマンドの \dX が追加されました。 (Tatsuro Yamada) (14)
- 配列の構文やバックエンド文法のエイリアスを理解できるように psql の \dT が修正されました。 (Greg Sabino Mullane, Tom Lane) (14)
- psql で \e や \ef 、\ev を使用して過去のクエリやファイルを編集している時に、保存せずエディタを終了した場合、結果を無視するようになりました。 (Laurenz Albe) (14)
- psql のタブ補完機能が改善されました。 (Vignesh C, Michael Paquier, Justin Pryzby, Georgios Kokolatos, Julien Rouhaud) (14)
これにより、オーバーロードされた名前に一致して出力される件数を減らすことができます。
これまでは \d では表示できても、\dt、\di を使うと「Did not find any relation named ...」が返っていました。
たとえば int を integer と解釈するようになります。
以前はこのような操作を行うと、過去のクエリをクエリバッファに読み込み、通常すぐに実行していましたが、これはユーザが望む動作ではないと判断されました。
サーバアプリケーション
- 多数のリレーションに対する contrib/amcheck テストを簡単に実行できるコマンドラインユーティリティ pg_amcheck が追加されました。 (Mark Dilger) (14)
- initdb に --no-instructions オプションが追加されました。 (Magnus Hagander) (14)
- pg_upgrade が analyze_new_clusterスクリプトを作成しなくなりました。 (Magnus Hagander) (14)
- postmaster の -o オプションが削除されました。 (Magnus Hagander) (14)
通常出力されるサーバ起動の説明が抑制されます。
その代わりに同等の vacuumdbコマンドを実行するようになりました。
既にすべてのオプションは直接指定が可能となっているため、この -o オプションは不要でした。
ドキュメント
- 「デフォルトロール(Default Roles)」が「事前定義済ロール(Predefined Roles)」に変更されました。 (Bruce Momjian, Stephen Frost) (14)
- factorial() 関数のドキュメントが追加されました。 (Peter Eisentraut) (14)
このリリースで ! 演算子は削除されたので、factorial() は階乗を計算する唯一の方法になりました。
ソースコード
- configure オプションの --with-ssl={openssl} で、使用する SSLライブラリを選べるようになりました。 (Daniel Gustafsson, Michael Paquier) (14)
- 抽象名前空間の Unixドメインソケットをサポートするようになりました。 (Peter Eisentraut) (14)
- Windows で 4GB を超えるファイルを適切に扱えるようになりました。 (Juan Jose Santamaria Flecha) (14)
- テストを目的としてキャッシュフラッシュを制御する設定 debug_discard_caches が追加されました。 (Craig Ringer) (14)
- valgrind のエラー検出機能で様々な改善が実施されました。 (Alvaro Herrera, Peter Geoghegan) (14)
- 正規表現パッケージのテストモジュール test_regex が追加されました。 (Tom Lane) (14)
- LLVM バージョン 12 がサポートされました。 (Andres Freund) (14)
- OpenSSL の EVP API を使うために SHA1 と SHA2、MD5 のハッシュ計算が変更されました。 (Michael Paquier) (14)
- ビルド時に SSLライブラリから独立して乱数発生器を選択する機能が削除されました。 (Daniel Gustafsson) (14)
- EUC_TW と Big5 エンコーディング間の直接変換ルーチンが追加されました。 (Heikki Linnakangas) (14)
- FreeBSD について照合順序のバージョンに対応しました。 (Thomas Munro) (14)
- インデックスアクセスメソッドの API に amadjustmembers が追加されました。 (Tom Lane) (14)
- 最近追加された libpq 機能について、libpq-fe.h に機能テスト用マクロが提供されました。 (Tom Lane, Alvaro Herrera) (14)
- hstore型の値で添字が利用可能になりました。 (Tom Lane, Dmitry Dolgov) (14)
- pg_trgm の GiST/GINインデックスで等価検索を行えるようになりました。 (Julien Rouhaud) (14)
- cubeデータ型をバイナリモードで転送できるようになりました。 (KaiGai Kohei) (14)
- pgstattuple_approx() 関数で TOASTテーブルが表示可能となりました。 (Peter Eisentraut) (14)
- 行の可視性を変更できる contribモジュール pg_surgery が追加されました。 (Ashutosh Sharma) (14)
- old_snapshot_threshold 設定が有効であるときに XID と日時のマッピングを報告する、contribモジュール old_snapshot が追加されました。 (Robert Haas) (14)
- amcheck がヒープページもチェックできるようになりました。 (Mark Dilger) (14)
- pageinspect が GiSTインデックスを検査できるようになりました。 (Andrey Borodin, Heikki Linnakangas) (14)
- pageinspect の各関数におけるブロック番号(blkno)引数が bigint型になりました。 (Peter Eisentraut) (14)
- nbtree_gist の各関数がパラレルセーフと印付けされました。 (Steven Winfield) (14)
互換性維持のため --with-openssl も使用可能です。
現在は Linux と Windows で利用可能で、@ (アットマーク)で始まる名前を使用します。
例えば、COPY で扱うファイルや WALファイル、リレーションセグメントファイルを4GB 以上にすることが可能になります。
以前、この動作はコンパイル時にのみ設定可能でした。initdb 時に制御したい場合には新たな --discard-caches オプションを使用します。
valgrind はメモリデバッグなどの機能を有する動的解析ツールです。
これはより現代的で FIPSモードをサポートします。
現在は常に SSLライブラリの選択によって決定されます。
これによりインデックスアクセスメソッドは、新しい演算子クラスまたは演算子族の作成中における有効性チェックが可能になりました。
歴史的にアプリケーションは通常 PG_VERSION_NUM のコンパイル時チェックを使用して、ある機能が利用可能かどうかを調べてきました。 しかしこれは通常はサーバのバージョンであり、libpq のバージョンにはよくない目安かもしれません。libpq-fe.h は、v14 で追加されたアプリケーションから見える機能を示すそのような機能のシンボルを追加し続けることです。
これはワイルドカードを使用しない LIKE と似ています。
これはデータベースの破損を修正するのに役立ちます。
関数の実装自体に変更はありません。
contrib拡張
pg_stat_statements
- 問い合わせのハッシュ計算の実装コードが pg_stat_statements からPostgreSQL本体に移されました。 (Julien Rouhaud) (14)
- pg_stat_statements がトップの文と入れ子の文を分けて記録するようになりました。 (Julien Rohaud) (14)
- pg_stat_statements でユーティリティコマンドの処理行数が記録されるようになりました。 (Fujii Masao, Katsuragi Yuta, Seino Yuki) (14)
- pg_stat_statements の動作状況を参照できる、システムビュー pg_stat_statements_info が追加されました。 (Katsuragi Yuta, Yuki Seino, Naoki Nakamichi) (14)
新たな設定 compute_query_id がデフォルトの「auto」である場合、pg_stat_statement がロードされると自動的にクエリID の計算が有効になります。
これまでは、全ステートメントを記録するとき、同一のトップおよび入れ子の文が単一エントリとして記録されました。
例えば、pg_stat_statements.track = all であるとき、「DO $$ BEGIN DELETE FROM t185; END; $$ LANGUAGE plpgpsql;」の実行に対して、ps_stat_statementsビューで query列に「DO $$ BEGIN DELETE FROM t185; END; $$ LANGUAGE plpgpsql;」を持つ行と、「DELETE FROM t185;」を持つ行の両方が現れるようになります。後者はトップレベルでの「DELETE FROM t185;」の記録とは区別されます。
COPY、FETCH、CREATE TABLE AS、CREATE/REFRESH MATERIALIZED VIEW などが該当します。
postgres_fdw
- postgres_fdw が一括で行を INSERT できるようになりました。 (Takayuki Tsunakawa, Tomas Vondra, Amit Langote) (14)
- postgres_fdw が「IMPORT FOREIGN SCHEMA」の「LIMIT TO」句で明示した指定したテーブルのパーティションを取り込みできるようになりました。 (Matthias van de Meent) (14)
- postgres_fdw にオープン中の外部サーバ接続を報告する関数 postgres_fdw_get_connections() が追加されました。 (Bharath Rupireddy) (14)
- トランザクション改良後に外部サーバが接続をオープンしたまま維持するかを、制御できるようになりました。 (Bharath Rupireddy) (14)
- postgres_fdw が必要に応じて外部サーバ接続の再確立を行えるようになりました。 (Bharath Rupireddy) (14)
- postgres_fdw でキャッシュされた接続を廃棄する関数 postgres_fdw_disconnect()、postgres_fdw_disconnect_all() が追加されました。 (Bharath Rupireddy) (14)
これまで、リモート側では 1行ずつINSERT文を実行していました。
指定が無い場合にはパーティションテーブルのルートテーブルだけが取り込まれます。
keep_connections オプションで制御します。デフォルトは on です。
保持していた接続が無効であるとき、接続し直す動作をするようになります。これまでは外部テーブルアクセスエラーを起こしていました。
リリースノートに記載の無い変更点
- システムビュー pg_stat_all_tables および pg_stat_user_tables 等の派生ビューでパーティションテーブルのエントリも含まれるようになりました。
自動ANALYZE でパーティションテーブル(宣言的パーティションニングにおける親テーブル)も処理するために追加されました。その後、パーティションテーブルへの自動ANALYZE 対応は 14.0 バージョンがリリースされる前に機能取り下げになりましたが、システムビューの変更はそのまま採用されました。