PostgreSQL 12 に関する技術情報

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

最終更新:2019/10/16

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

  1. oid列の特別な振る舞いが廃止されました。 (Andres Freund, John Naylor) (12)
  2. これまでテーブル作成時に WITH OIDS で隠し oid列を持たせる指定ができましたが、この機能が廃止されました。なお、引き続き、テーブルに明示的に oid型の列を含めることは可能です。WITH OIDS を使って作られた列を持つテーブルに対する操作は補正が必要です。

    隠しoid列を持っていたシステムカタログは、通常の oid列を持つようになります。その結果「SELECT * …」で、これまで明示的に選択しないと出力されなかったoid列が出力されるようになります。

    (12での動作例 / 11では oid列が表示されない)
    db=# SELECT * FROM pg_tablespace ;
     oid  |  spcname   | spcowner | spcacl | spcoptions
    ------+------------+----------+--------+------------
     1663 | pg_default |       10 |        |
     1664 | pg_global  |       10 |        |
    (2 rows)
    
  3. abstime、reltime、tinterval の各データ型が廃止されました。 (Andres Freund) (12)
  4. これらデータ型は、timestampのようなSQL標準のデータ型により代替されて、もはや用いられていれません。

  5. timetravel拡張が廃止されました。 (Andres Freund) (12)
  6. recovery.conf の設定が postgresql.conf に移されました。 (Masao Fujii, Simon Riggs, Abhijit Menon-Sen, Sergei Kornilov) (12)
  7. recovery.conf はもはや使われず、recovery.confファイルがあると PostgreSQLサーバは起動しなくなります。これからは非プライマリモードに切り替えするのに、recovery.signalファイル、standby.signalファイルが使われます。standby_mode設定は廃止されました。また、trigger_file設定は promote_trigger_file に名前が変更されました。

  8. 衝突する複数の recovery_target_* と言う名前を持つ設定パラメータの指定が禁止されました。 (Peter Eisentraut) (12)
  9. 設定 recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time、recovery_target_xid のうち一つだけが指定できるようになりました。

    これまでは、これらの複数指定が可能で、最後にあらわれた設定に従って動作していました。これからは何れか一つだけ指定できるようになります。ただし、同一設定項目を複数書くことは可能で、その場合は最後の一つが適用されます。

  10. リカバリを最新タイムラインまで進めるのがデフォルトとなりました。 (Peter Eisentraut) (12)
  11. recovery_target_timeline設定は latest がデフォルトになりました。これまでは current がデフォルトでした。

  12. 幾何関数、演算子のコードがリファクタリングされました。 (Emre Hasegeli) (12)
  13. これにより、以前のリリースに対して、より正確ですが僅かに異なる結果が生じる可能性があります。特に、NaN、アンダーフロー、オーバーフロー、ゼロ除算に関する場合について、より一貫性のある処理が行われるようになりました。

  14. 新たなアルゴリズムを使用することで real型、double precision型の値を出力する際の性能が改善されました。 (Andrew Gierth) (12)
  15. これまでは出力される浮動小数点の値は、デフォルトで real なら 6桁、double precision なら 15桁に丸められ、extra_float_digits設定値に応じて補正されていました。

    これからは、extra_float_digits が 0 より大きい場合にはいつでも、正確なバイナリ値の保持に必要な最小桁数のみが出力されるようになります。つまり、extra_float_digits設定値の 1、2、3 は同じ動作になります。また、extra_float_digits のデフォルトは 0 から 1 に変更されました。extra_float_digits に 0 以下を指定した場合の振る舞いは従来通りです。

    また、浮動小数点の指数部の書式がプラットフォームによらず統一されました。3桁が必要ない限り、2桁が使われるようになります。以前は Windowsビルドの場合には常に3桁が出力されていました。

    (以前の Windowsでの出力例)
    db=# SELECT 1.23e99::float;
      float8
    -----------
     1.23e+099
    (1 row)
    
    (以前の Linuxでの出力/PostgreSQL 12での共通の出力)
    db=# SELECT 1.23e99::float;
      float8
    ----------
     1.23e+99
    (1 row)
    
  16. random()、setseed()関数がプラットフォームによらず統一した動作をするようになりました。 (Tom Lane) (12)
  17. 特定のシード値を伴う setseed() の呼び出しに従って生成される random()関数の値の並びは従来と違ったものになるはずです。

    一方でこれは再現可能なものになります。以前はサーバ内の他の乱数使用に影響を受けるため、再現が保証されませんでした。SQL の random()関数は今後は自身のセッション毎の固有の状態を持つようになります。

  18. SQLスタイルの substring(.. from … for ..)関数が標準に従ったマッチングの欲張り動作をするように変更されました。 (Tom Lane) (12)
  19. 複数のマッチがありうる場合において、最初の副パターンが最大ではなく最小テキストにマッチするものとして処理されるようになりました。以下に例を示します。

    (バージョン11までの動作/冒頭の a* が欲張りマッチで a を消費)
    db=# SELECT substring('abcdefg' from 'a*#"%#"g*' for '#');
     substring
    -----------
     bcdefg
    (1 row)
    
    (バージョン12の動作/冒頭の a* は最小0文字マッチ)
    db=# SELECT substring('abcdefg' from 'a*#"%#"g*' for '#');
     substring
    -----------
     abcdefg
    (1 row)
    
    (バージョン11までの動作/冒頭の % が ababa までの欲張りマッチ)
    db=# SELECT substring('ababab' from '%#"[ab][ab]*#"%' for '#');
     substring
    -----------
     b
    (1 row)
    
    (バージョン12の動作/冒頭の % が最小0文字マッチ)
    db=# SELECT substring('ababab' from '%#"[ab][ab]*#"%' for '#');
     substring
    -----------
     ababab
    (1 row)
    
  20. xpath()関数 や XMLTABLE による値の作成で出力を整形しなくなりました。 (Tom Lane) (12)
  21. 一部の場合にこれらの関数はノードセット値の出力に空白文字(改行を含む)を追加していました。使用方法によっては空白文字も意味を持つかもしれないため、これは望ましくありません。

  22. コマンドラインツール pg_verify_checksums は pg_checksums に改名されました。 (Michael Paquier) (12)
  23. pg_restore でダンプ内容を標準出力に送るために「-f -」の指定が必要になりました。 (Euler Taveira) (12)
  24. これまではこれが宛先を指定しない場合のデフォルトの振る舞いでしたが、不親切であると判断されました。

  25. psqlの「pset format ..」コマンドでユニークでない略記が禁止されました。 (Daniel Verite) (12)
  26. フォーマットの選択肢は先頭の 1文字で指定できますが、これまでは複数候補がある場合にもエラーにならず、どれかが選ばれていました。以下に例を示します。

    (バージョン11の結果)
    db=# pset format a
    Output format is aligned.
    
    (バージョン12の結果)
    db=# pset format a
    pset: ambiguous abbreviation "a" matches both "aligned" and "asciidoc"
    
  27. 新たな Btreeインデックスでインデックスの最大エントリ長が 8バイト減りました。重複エントリの扱いを改善するのに伴う変更です。 (Peter Geoghegan) (12)
  28. これは、pg_upgrade でアップグレードしたデータベースクラスタでREINDEX操作をしたときに失敗する可能性があることを意味します。

  29. DROP IF EXISTS FUNCTION / PROCEDURE / AGGREGATE / ROUTINE が、引数リストを省略していて一致するオブジェクトが複数あるときに、エラーを出すようになりました。 (David Rowley) (12)
  30. 以下に例を示します。

    (以下のような関数があったとして)
    db=# CREATE FUNCTION f1() RETURNS int LANGUAGE sql AS $$ SELECT 1 $$;
    db=# CREATE FUNCTION f1(p int) RETURNS int LANGUAGE sql AS $$ SELECT 1 $$;
    
    (バージョン11では以下メッセージが出て、実際には関数は1つも削除されない)
    db=# DROP FUNCTION IF EXISTS f1;
    NOTICE:  function f1() does not exist, skipping
    DROP FUNCTION
    
    (バージョン12では以下のメッセージでエラーになる)
    db=# DROP FUNCTION IF EXISTS f1;
    ERROR:  function name "f1" is not unique
    HINT:  Specify the argument list to select the function unambiguously.
    
  31. pg_statistic_extシステムテーブルが二つのシステムテーブルに分割され、それらのビューである pg_stats_ext が追加されました。 (Dean Rasheed, Tomas Vondra) (12)
  32. これは、潜在的に取り扱いに注意が必要な統計データを、権限のないユーザから隠すための変更です。

  33. pg_constraintシステムテーブルのもはや用いられなくなっている consrc列が廃止されました。 (Peter Eisentraut) (12)
  34. 制約の定義は conbin列に格納されています。

  35. pg_attrdefシステムテーブルのもはや用いられなくなっている adsrc列が廃止されました。 (Peter Eisentraut) (12)
  36. 列デフォルト値の定義は adbin列に格納されています。

  37. テーブルの name型の列がデフォルトで C照合順序を持つように印付けされました。 (Tom Lane, Daniel Verite) (12)
  38. nameデータ型に対する比較演算子は、常に C ではなく、任意の照合順序が使えるようになりました。これまでの問い合わせの意味を維持するため、name型の列は明示的に C照合順序を持つと印付けされるようになりました。

    (データ型の内部属性としてC照合順序が付与/以下SQLで確認できる)
    db=# SELECT t.typname, t.typcollation, c.collname FROM pg_type t
            JOIN pg_collation c ON (t.typcollation = c.oid) WHERE typname = 'name';
     typname | typcollation | collname
    ---------+--------------+----------
     name    |          950 | C
    (1 row)
    

    この副作用は、name型の列に対する正規表現演算子が、ロケールに依存する正規表現パターン(psql の w で実行される SQLなど)の振る舞いを決めるのに、デフォルトでデータベースの照合順序ではなく、C照合順序を使うようになることです。

    もし、name型の列に対する正規表現で C照合順序以外の振る舞いをさせたいなら、明示的に COLLATE句を足してください。

    ユーザ定義のname型の列に対してはテーブル作成時に異なる照合順序を指定することも考えられますが、これは後方互換性の欠如を比較演算子に移すだけです(11.x以前バージョンでは name型を C 以外の照合順序で比較できないため)。

    SELECT … FROM information_schema.tables WHERE table_name < ‘foo’;

  39. information_schemaビューで、オブジェクト名の列を varchar型ではなく、name型として扱うようになりました。 (Tom Lane) (12)
  40. SQL標準では information_schemaビューのオブジェクト名の列はドメイン型sql_identifierとして宣言されています。PostgreSQLでの実際の元となるカタログ列は name型です。本修正でドメイン型sql_identifierの元となる型を varcahr から name に変更されました。

    これにより、比較とソートの動作における意味のミスマッチを除去し、information_schemaビューに対するオブジェクト名で限定する問い合わせの性能を(C照合順序での比較にすることで)大きく改善します。

    ただし、以下のような不等号で限定する問い合わせでは、デフォルトではデータベースのデフォルト照合順序ではなく、Cロケールで比較されるようになっていることに注意してください。

    db=# SELECT * FROM information_schema.tables WHERE table_name < 'foo';
    

    以前の振る舞いに戻す(遅くなります)には「COLLATE “default”」を加えてください。

  41. 動的共有メモリを無効化する設定を廃止しました。 (Kyotaro Horiguchi) (12)
  42. 設定パラメータ dynamic_shared_memory_type に none を指定できなくなりました。

変更点

サーバ

パーティションニング
    • パーティションテーブルに対する様々な操作の性能が改善されました。 (Amit Langote, David Rowley, Tom Lane, Alvaro Herrera) (12)

少数のパーティションにのみ影響を与える操作について、数千の子パーティションを持つテーブルを効率的に処理できるようになりました。

    • パーティションテーブルを参照する外部キーに対応しました。 (Alvaro Herrera) (12)
    • パーティションテーブルに対する COPY の速度が改善されました。 (David Rowley) (12)
    • パーティション境界に任意の式を記述できるようになりました。 (Kyotaro Horiguchi, Tom Lane, Amit Langote) (12)

このような式はパーティション作成時に評価されます。これまではパーティション境界に定数しか指定できませんでした。

(バージョン12でパーティション境界に式を与える例)
db=# CREATE TABLE t_log_0 PARTITION OF t_log FOR VALUES
       FROM (CURRENT_DATE::timestamp)
       TO (CURRENT_DATE::timestamp + '1 year'::interval);
    • CREATE TABLE でのテーブルスペース指定がパーティションテーブルに対しても可能になりました。 (David Rowley, Alvaro Herrera) (12)

この指定は子パーティションにも反映されます。これまではパーティションテーブルに指定しても効果がありませんでした。

    • パーティションが既に必要とされる順序でスキャンされているときには、ソート実行を回避するようになりました。 (David Rowley) (12)

各パーティションでの処理結果を統合するときに、ソート済みである場合には、ソート処理を内包する MergeAppend を使わす、単に Append を選択するようになります。

    • ALTER TABLE .. ATTACH PARTITION .. の実行で取得するロックが軽減されました。 (Robert Haas) (12)

パーティションテーブル(親)に対しては、SHARE UPDATE EXCLUSIVEロックだけでよくなりました。なお、パーティション(子)に対しては引き続き ACCESS EXCLUSIVEロックが必要です。

    • パーティションを検査する関数がいくつか追加されました。 (Michael Paquier, Alvaro Herrera, Amit Langote) (12)

function pg_partition_root() はパーティションツリーの最上位にある親パーティションテーブルを返します。pg_partition_ancestors() は全ての先祖となるパーティションテーブルを報告します。pg_partition_tree() はパーティションテーブル全体を一覧する情報を出力します。

(例)
db=# CREATE TABLE t_log (id bigint, lev int, ts timestamp, mes text)
       PARTITION BY RANGE (ts);
db=# CREATE TABLE t_log_ts2020 PARTITION OF t_log FOR VALUES
       FROM ('2020-01-01') TO ('2021-01-01') PARTITION BY LIST;
db=# CREATE TABLE t_log_ts2020_lv1 PARTITION OF t_log_ts2020 FOR VALUES IN (1);

db=# SELECT * FROM pg_partition_ancestors('t_log_ts2020_lv1');
      relid
------------------
 t_log_ts2020_lv1
 t_log_ts2020
 t_log
(3 rows)
    • システムビューpg_indexesにパーティションインデックスも含まれるようになりました。 (Suraj Kharage) (12)
    • psqlコマンドに dP が追加されました。パーティションテーブルとパーティションインデックスの一覧を表示するものです。 (Pavel Stehule) (12)
    • psql の d と z のパーティションテーブルに対する表示が改善されました。 (Pavel Stehule, Michael Paquier, Alvaro Herrera) (12)

機能追加に対応してテーブルスペースや外部キー制約が出力されるようになり、また、単独テーブルではなくパーティションテーブルであることが明記されるようになりました。

    • ALTER TABLE .. DETACH PARTITION .. が誤った依存性状態を残してしまい、続く操作で誤動作をもらたす可能性のある障害が修正されました。 (Tom Lane) (12)

例えば、以前パーティションであったテーブルを削除したときに、そのテーブルにある同じく以前パーティションであったインデックスが削除されないという誤動作がありえました。

システムテーブル pg_depend の使われ方が変わるため、メジャーバージョンアップでの修正となります。

インデックス
    • 重複データを多く持つ Btreeインデックスについて、性能と格納空間効率が改善されました。 (Peter Geoghegan, Heikki Linnakangas) (12)

これまではインデックスの重複したエントリは重複グループ内で不規則に格納されていました。これはインデックス挿入時にオーバーヘッドをもたらし、過剰なページ分割のために空間を浪費し、VACUUM によるページ全体の再利用を行いにくくしていました。インデックスの重複するエントリはヒープでの格納順にソートされるようになります。

以前のバージョンから pg_upgrade で移行してきたインデックスは、インデックス再構築をしない限り、本変更の恩恵を得られません。

    • 複数列の(すなわち複合インデックスである) Btreeインデックスのサイズが小さくなりました。 (Peter Geoghegan, Heikki Linnakangas) (12)

内部ページと最大/最小リーフページを指し示す個所で、インデックスキーの変化しない部分を省略する格納方法をとるようになりました。これはインデックスアクセスの局所性も改善します。

以前のバージョンから pg_upgrade で移行してきたインデックスは、インデックス再構築をしない限り、本変更の恩恵を得られません。

    • ロックのオーバーヘッドを減らすことで Btreeインデックスの挿入速度が改善されました。 (Alexander Korotkov) (12)

特に多CPUコアのサーバで大きな性能改善が報告されています。

    • GiSTインデックスで INCLUDE句による非キー列の付加がサポートされました。 (Andrey Borodin) (12)

これは指定した非キー列を含む問い合わせをインデックスオンリースキャンで実行できるようにするための機能で、Btreeインデックスでは以前から対応されていました。

    • SP-GiSTインデックスで、KNN探索がサポートされました。 (Andrey Borodin) (12)

KNN探索(K近傍探索)は以下のような距離が近いものを探す処理で使われます。

(以下のようにテーブル、インデックスが定義されているとして)
db=# CREATE TABLE t_point_spgist (p point, dsc text);
db=# CREATE INDEX ON t_point_spgist USING spgist (p) ;

(以下の検索に SP-GiSTインデックスが利用可能になります)
db=# SELECT * FROM t_point_spgist ORDER BY p <-> '(0,0)';
    • GiST、GIN、SP-GiST のインデックスを作成するときに、WAL出力量が減りました。 (Anastasia Lubennikova, Andrey V. Lepikhov) (12)
    • 多数の列を持つインデックスについて、インデックスオンリースキャンがより効率的になりました。 (Konstantin Knizhnik) (12)

列数に対して O(N^2) のオーダーで処理を行う個所があり、インデックススキャンよりも遅くなるケースが報告されていました。

    • GiSTインデックスの VACUUM走査の性能が改善されました。 (Andrey Borodin, Konstantin Kuznetsov, Heikki Linnakangas) (12)

BtreeインデックスのVACUUM処理と同様に、物理順にページを走査するように変更されました。

    • GiSTインデックスに対する VACUUM で空リーフページを削除するようになりました。 (Andrey Borodin) (12)

これは Btreeインデックスに対しては以前から実現できていた動作です。インデックス再構築をせずに物理サイズの肥大化を抑止するのに役立ちます。

    • ALTER INDEX 等でインデックスを改名するときのロックが軽減されました。 (Peter Eisentraut) (12)

ACCESS EXCLUSIVEロックであったものが、より弱い SHARE UPDATE EXCLUSIVEロックになりました。

プランナ
    • CREATE STATISTICS で複数列に対して最頻値 (mcv) の統計情報を作成できるようになりました。 (Tomas Vondra) (12)

これにより、いくつかの WHERE句条件の複合効果の推定を必要とする、複数列をテストする問い合わせの最適化が改善します。列が相関し、不均一な分布の場合には、mcv を含む複数列統計情報がよりよい推定を可能にするはずです。

    • 共通テーブル式 (CTE) を外部の問い合わせにインライン化できるようになりました。 (Andreas Karlsson, Andrew Gierth, David Fetter, Tom Lane) (12)

具体的には、副作用がなく、再帰的でなく、問い合わせ内で一度しか参照さない場合にCTE は自動的にインライン化されます。インライン化は、MATERIALIZED を指定すれば抑止でき、また、NOT MATELIALIZED を指定すれば複数回参照される CTE にも強制できます。以前は、CTE はインライン化されず、常に問い合わせの残りより前に評価されていました。

以下に例を示します。

(11 の場合)
=# EXPLAIN WITH t AS (SELECT * FROM t1)
     SELECT * FROM t2 JOIN t USING (c2);
                              QUERY PLAN
-----------------------------------------------------------------------
 Hash Join  (cost=5700.00..11421.00 rows=100000 width=41)
   Hash Cond: (t.c2 = t2.c2)
   CTE t
     ->  Seq Scan on t1  (cost=0.00..1834.00 rows=100000 width=37)
   ->  CTE Scan on t  (cost=0.00..2000.00 rows=100000 width=36)
   ->  Hash  (cost=1834.00..1834.00 rows=100000 width=37)
         ->  Seq Scan on t2  (cost=0.00..1834.00 rows=100000 width=37)
(7 rows)

(12 の場合)
=# EXPLAIN WITH t AS (SELECT * FROM t1)
     SELECT * FROM t2 JOIN t USING (c2);
                              QUERY PLAN
-----------------------------------------------------------------------
 Hash Join  (cost=3866.00..9421.00 rows=100000 width=41)
   Hash Cond: (t2.c2 = t1.c2)
   ->  Seq Scan on t2  (cost=0.00..1834.00 rows=100000 width=37)
   ->  Hash  (cost=1834.00..1834.00 rows=100000 width=37)
         ->  Seq Scan on t1  (cost=0.00..1834.00 rows=100000 width=37)
(5 rows)
    • プリペアドステートメントに対して汎用プランを使用するタイミングを制御できるようになりました。 (Pavel Stehule) (12)

これは設定 plan_cache_mode で制御できます。自動(auto)、常に汎用プラン(force_generic_plan)、常にカスタムプラン(force_custom_plan)を指定できます。

    • 単一の子しか持たないパーティションテーブルおよび UNION ALL の問い合わせについて最適化が改善されました。 (David Rowley) (12)

以下例のように余計な Append 処理が省略されるようになりました。

=# d t1
           Partitioned table "public.t1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 c1     | integer |           |          |
 c2     | text    |           |          |
Partition key: RANGE (c1)
Number of partitions: 1 (Use d+ to list them.)

(11 の場合)
=# EXPLAIN SELECT * FROM t1;
                           QUERY PLAN
-----------------------------------------------------------------
 Append  (cost=0.00..2334.00 rows=100000 width=37)
   ->  Seq Scan on t2  (cost=0.00..1834.00 rows=100000 width=37)
(2 rows)

(12 の場合)
=# EXPLAIN SELECT * FROM t1;
                        QUERY PLAN
-----------------------------------------------------------
 Seq Scan on t2  (cost=0.00..1834.00 rows=100000 width=37)
(1 row)
    • CHECK制約を持たないドメイン(DOMAIN)の処理が改善されました。 (Tom Lane) (12)

単純に型のエイリアスとして使用されるドメインは、プランナでの最適化の問題を発生させなくなりました。

    • 引数が定数の場合に、LEAST および GREATEST の呼び出しを事前評価するようになりました。 (Vik Fearing) (12)
    • オプティマイザの IS NOT NULL 条件つきの部分インデックスが問い合わせで使用できるかを検証する動作が改善されました。 (Tom Lane, James Coleman) (12)

キャストや大きい「x IN (array)」句を伴う問い合わせを呼び出す場合により多く、インデックスを使用可能と判断するようになりました。

    • 各列に定義された照合順序 (collation) 使用して ANALYZE の統計情報を計算するようになりました。 (Tom Lane) (12)

以前は、データベースのデフォルトの照合順序がすべての統計情報で使用されていました。これにより、デフォルト以外の照合順序を持つ列に対するオプティマイザの動作が改善する可能性があります。

    • ctid列の不等式比較の選択度の推定が改善されました。 (Edmund Horner) (12)
    • tid型の列の結合の最適化が改善されました。 (Tom Lane) (12)

これらの変更により、おもに ctid列の自己結合の効率が改善します。以下のような問い合わせで ctid列に Tid Scan が使われない動作が報告されていました。

db=# DELETE FROM t32 WHERE ctid IN (
       SELECT ctid FROM t32 WHERE v ~ 'abcde' );
    • いくつかの Btree比較演算子およびサポート関数が漏洩なし(LEAKPROOFが真)の指定を持つように修正されました。 (Tom Lane) (12)

これにより、以前はセキュリティバリアビューまたは行単位セキュリティがあると適用されなかった最適化が可能になります。

PostgreSQL はこれらのセキュリティ機構が有効であるとき、プランナ統計情報の使用を LEAKPROOF属性が真の演算子に限定していますが、安全であるはずの組み込み演算子で LEAKPROOF属性が付与されていないものがあり、劣ったプランになる動作が報告されていました。

性能
    • サーバが実行時コンパイル (JIT) を有効にしてビルドされている場合、その使用がデフォルトで有効(jit = on)になりました。 (Andres Freund) (12)

なお、JIT機能は configure のデフォルトとしては無効で、これを有効にしてビルドするには明示的に –with-llvm を指定する必要があります。

    • SQL の構文解析におけるキーワード検索が高速化されました。 (John Naylor, Joerg Sonnenberger, Tom Lane) (12)
    • position() および関連関数でマルチバイト文字の検索性能が改善されました。 (Heikki Linnakangas) (12)
    • TOAST化された値が最小限だけ伸張されるようになりました。 (Paul Ramsey) (12)

これは TOAST化されたフィールドの最初の部分のみを検査する必要がある動作に役立ちます。

    • ALTER TABLE … SET NOT NULL が不要なテーブルスキャンを回避するようになりました。 (Sergei Kornilov) (12)

テーブルの既存の制約により列に NULL が許されないと認識できる場合には、最適化が可能になります。

    • セッションのタイムゾーンが UTC の場合に ALTER TABLE … SET DATA TYPE がテーブルの書き替えなしに timestamp と timestamptz 間の変更ができるようになりました。 (Noah Misch) (12)

UTC タイムゾーンでは、これらの 2 つのデータ型にはバイナリ互換性があります。

    • 文字列を int2 または int4 整数に変換する速度が改善されました。 (Andres Freund) (12)

汎用のライブラリ関数を使っていたものが独自の実装に切り替えられました。

    • SERIALIZABLE分離モードでパラレルクエリが使用できるようになりました。 (Thomas Munro) (12)

以前は SERIALIZABLE では並列処理ができませんでした。

    • ランダムI/O に pread() および pwrite() を使用するようになりました。 (Oskari Saarenmaa, Thomas Munro) (12)

これにより、I/O に必要なシステムコールの回数を削減できます。

  • FreeBSD でプロセスタイトルを設定する速度が改善されました。 (Thomas Munro) (12)
モニタリング
    • トランザクションのうち一定割合に限って SQL文のログを取得できるようになりました。 (Adrien Nayrat) (12)

設定パラメータ log_transaction_sample_rate でこれを制御します。

    • CREATE INDEX と REINDEX の進捗状況が報告されるようになりました。 (Alvaro Herrera, Peter Eisentraut) (12)

進捗状況は pg_stat_progress_create_index システムビューで参照できます。

    • CLUSTER および VACUUM FULL の進捗状況が報告されるようになりました。 (Tatsuro Yamada) (12)

進捗状況は pg_stat_progress_cluster システムビューで参照できます。

    • pg_checksums で進捗状況を報告させることができるようになりました。 (Michael Banck, Bernd Helmle) (12)

これは –progress オプションで有効になります。

    • pg_stat_database にチェックサムエラーのカウンタが加わりました。 (Magnus Hagander) (12)
    • グローバルオブジェクトをシステムビュー pg_stat_database で追跡できるようになりました。 (Julien Rouhaud) (12)

グローバルオブジェクトは pg_stat_database.datid の値がゼロとして表示されます。

    • アーカイブディレクトリの内容を一覧表示する機能が追加されました。 (Christoph Moench-Tegeder) (12)

このために pg_ls_archive_statusdir() 関数が提供されます。

    • 一時ディレクトリの内容を一覧表示する機能が追加されました。 (Nathan Bossart) (12)

これを行う関数 pg_ls_tmpdir() は、オプションでテーブルスペースを指定することもできます。

    • pg_stat_sslシステムビューにクライアント認証に関する情報が追加されました。 (Peter Eisentraut) (12)

新しい列は client_serial および issuer_dn です。また、clientdn列が分かりやすくするため client_dn に改名されました。

    • 権限のないユーザに pg_stat_sslビューの行の表示を制限するようになりました。 (Peter Eisentraut) (12)
    • サーバの起動時に、サーバのバージョン番号を含むログメッセージを出力するようになりました。 (Christoph Berg) (12)

以下にログ例を示します。

2019-10-09 11:08:13.373 UTC [1378] LOG:  starting PostgreSQL 12.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
    • 新しい接続がすぐに閉じられた場合に「incomplete startup packet」ログを出力しないようになりました。 (Tom Lane) (12)

これにより、ある種の方式の監視による不要で大量のログを回避できます。

    • application_name が設定されている場合に log_connections 設定に基づくのログメッセージにアプリケーション名を含めるようになりました。 (Don Seiler) (12)

以下にログ例を示します。

2019-10-09 11:07:04.427 UTC [1362] LOG:  connection received: host=[local]
2019-10-09 11:07:04.430 UTC [1362] LOG:  connection authorized: user=postgres database=postgres application_name=psql
    • walreceiver が application_name のデフォルト値として、設定されているなら cluster_name を設定するようになりました。(Peter Eisentraut) (12)
    • pg_stat_replication に最後に受信したスタンバイのメッセージのタイムスタンプの列reply_time が追加されました。 (Lim Myungkyu) (12)
    • WALセグメントの fsync の待機イベントが追加されました。 (Konstantin Knizhnik) (12)

pg_stat_activity の wait_event_type列が IO である場合の wait_event列の値として WALSync が出力されます。

認証
    • GSSAPI 暗号化に対応しました。 (Robbie Harwood, Stephen Frost) (12)

この機能により、SSL のような別の暗号化機能を設定することなく、GSSAPI認証を使用して TCP/IP接続を暗号化できます。これに伴って、pg_hba.conf に hostgssenc および hostnogssenc レコードタイプが追加されました。これは、既存の hostssl および hostnossl レコードタイプと同様に、GSSAPI暗号化を使用している/していない接続を指定するために使用できます。

また、新たに libpq の gssencmodeオプションと pg_stat_gssapiシステムビューも追加されました。

    • pg_hba.conf の clientcertオプションでデータベースのユーザ名が クライアント証明書のコモンネームと一致するかをチェックできるようになりました。 (Julian Markwort, Marius Timmer) (12)

この新しいチェックは clientcert=verify-full で有効になります。

    • DNS の SRVレコードを使用して LDAPサーバを検出できるようになりました。 (Thomas Munro) (12)

これにより、ldapserver を指定する必要がなくなります。PostgreSQL がOpenLDAP とともにコンパイルされている場合のみ対応しています。

サーバ設定
    • pg_checksums を使用してデータベースクラスタのチェックサムを有効/無効にする機能が追加されました。 (Michael Banck, Michael Paquier) (12)

これらの操作を行うには、サービスをシャットダウンする必要があります。

(チェックサムを後から有効にする操作例)
$ pg_ctl stop -D /data/pgdata
waiting for server to shut down.... done
server stopped
$ pg_checksums --enable -D /data/pgdata
Checksum operation completed
Files scanned:  961
Blocks scanned: 3005
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster
    • 設定 autovacuum_vacuum_cost_delay のデフォルト値が 20ms から 2ms に減りました。 (Tom Lane) (12)

デフォルトでは自動バキューム操作がより速く(しかし、より高負荷で)進められるようになります。

    • 設定 vacuum_cost_delay に小数値を用いてミリ秒以下の遅延を指定できるようになりました。 (Tom Lane) (12)
(500マイクロ秒を指定する例)
db=# SET vacuum_cost_delay TO '0.5';
SET
db=# SHOW vacuum_cost_delay;
 vacuum_cost_delay
-------------------
 500us
(1 row)
    • 時間を指定する設定パラメータにマイクロ秒(us)の単位を使用できるようになりました。 (Tom Lane) (12)

ただし、今のところ vacuum_cost_delay、autovacuum_vacuum_cost_delay 以外の時間指定パラメータはミリ秒単位の整数で保持するので、マイクロ秒指定をしてもミリ秒単位に丸められます。

db=# SET statement_timeout TO '1001us';
SET
db=# SHOW statement_timeout;
 statement_timeout
-------------------
 1ms
(1 row)
    • 整数の設定パラメータに小数値を含んだ入力が可能になりました。 (Tom Lane) (12)

たとえば、整数パラメータである work_mem に対して、SET work_mem = ‘30.1GB’ という入力が可能になりました。値は必要な単位変換後に整数に丸められます。

=# SET work_mem to '30.1GB';
SET
=# SHOW work_mem;
 work_mem
----------
 30822MB
(1 row)
    • 浮動小数点の設定パラメータに単位を定義できるようになりました。 (Tom Lane) (12)

今のところ autovacuum_vacuum_cost_delay、vacuum_cost_delay の 2つだけで利用されています。

(設定パラメータでデータ型が real で単位が定義されているものを確認)
=# SELECT name, unit, vartype FROM pg_settings
     WHERE vartype = 'real' AND unit != '';
             name             | unit | vartype
------------------------------+------+---------
 autovacuum_vacuum_cost_delay | ms   | real
 vacuum_cost_delay            | ms   | real
(2 rows)
    • WALファイルの再利用を制御するパラメータ wal_recycle、wal_init_zero が追加されました。 (Jerry Jelinek) (12)

それぞれ、WAL再利用をするか、新たな WALファイルをゼロ埋めして初期化するかを指定するものです。WALファイルの再利用を避けることは、ZFS のようなコピーオンライトのファイルシステムで有益です。

    • サーバの TCPタイムアウト時間を指定する設定パラメータ tcp_user_timeout が追加されました。 (Ryohei Nagaura) (12)
    • 使用する SSLプロトコルのバージョン範囲を指定できるようになりました。 (Peter Eisentraut) (12)

パラメータは ssl_min_protocol_version と ssl_max_protocol_versionです。

    • サーバで使用される SSLライブラリバージョンを報告する参照用パラメータ ssl_library が追加されました。 (Peter Eisentraut) (12)
    • 使用する共有メモリのタイプを指定する設定パラメータ shared_memory_type が追加されました。 (Andres Freund) (12)

これにより、必要に応じて System V 共有メモリを選択できます。

ストリーミングレプリケーション

    • reload でいくつかのリカバリパラメータを変更できるようになりました。 (Peter Eisentraut) (12)

reload で変更できるパラメータは archive_cleanup_command、promote_trigger_file、recovery_end_command、recovery_min_apply_delay です。

    • 接続ごとにストリーミングレプリケーションのタイムアウト(wal_sender_timeout)を設定できるようにしました。 (Takayuki Tsunakawa) (12)

以前は、これはサービス全体でのみ設定できました。

    • スタンバイをプライマリへ昇格させる pg_promote() 関数が追加されました。 (Laurenz Albe, Michael Paquier) (12)

以前は、この操作は pg_ctl を使用するか、トリガーファイルを作成することによってのみ可能でした。

    • レプリケーションスロットのコピーが可能になりました。 (Masahiko Sawada) (12)

物理レプリケーションスロットのコピーには pg_copy_physical_replication_slot()、論理レプリケーションスロットのコピーには pg_copy_logical_replication_slot() を用います。

    • max_wal_senders は max_connections の一部としてカウントされないようになりました。 (Alexander Kukushkin) (12)
    • recovery_target_timeline に ‘current’ と設定することで明示的に現在のタイムラインを指定できるようになりました。 (Peter Eisentraut) (12)

これまでは空文字列が現在のタイムラインという意味のデフォルト値になっていました。

    • 2相トランザクションのステータスファイルが破損している場合、リカバリを失敗させるようになりました。 (Michael Paquier) (12)

以前は、警告がログに記録されるだけでリカバリが続行されて、トランザクションが失われる可能性がありました。

ユーティリティコマンド

    • REINDEX に CONCURRENTLY オプションが追加されました。このオプションにより書き込みをロックせずにインデックスを再作成できます。 (Michael Paquier, Andreas Karlsson, Peter Eisentraut) (12)

reindexdbアプリケーションの –concurrently オプションによっても同様に指定できます。

    • 生成列がサポートされました。 (Peter Eisentraut) (12)

生成列はテーブルに指定した式の値が自動的に格納される機能です。生成列の内容は、INSERT や UPDATEコマンドで指定されるのではなく、式(同じテーブル内の他の列への参照を含む)から計算されます。

(生成列を含むテーブルを作成/height_in にインチ単位の値が自動計算される)
db=# CREATE TABLE t_people (
       id int primary key,
       height_cm float4,
       height_in float4 GENERATED ALWAYS AS (height_cm / 2.54) STORED);
CREATE TABLE

(値を挿入)
db=# INSERT INTO t_people (id, height_cm) VALUES (1, 156), (2, 168);
INSERT 0 5

(height_in の値が自動計算されている)
db=# SELECT * FROM t_people ;
 id | height_cm | height_in
----+-----------+-----------
  1 | 156       | 61.417324
  2 | 168       | 66.14173
    • COPY FROM の構文に WHERE句を追加されました。 (Surafel Temesgen) (12)

これにより入力データを簡単にフィルタリングできます。以下のように書くことができます。

db=# COPY t83 FROM '/tmp/t83.dat' WHERE id < 100;
COPY
    • 列挙値をより柔軟に追加できるようになりました (Andrew Dunstan, Tom Lane, Thomas Munro) (12)

以前は列挙型を作成した同じトランザクションの一部でない限りALTER TYPE … ADD VALUE … をトランザクションブロック内で呼び出すことができませんでした。

現在は、新しい列挙値がコミットされる前には参照できないことを除いて、後のトランザクションブロック内で呼び出すことができます。

(バージョン12で以下が実行できるようになります)
db=# CREATE TYPE typ_status AS ENUM ('GREEN', 'RED');
db=# BEGIN;
db=# ALTER TYPE typ_status ADD VALUE 'YELLOW';
db=# COMMIT;

(バージョン11では ALTER TYPE で以下のエラーが発生しました)
ERROR:  ALTER TYPE ... ADD cannot run inside a transaction block
    • トランザクションを終了し、新しいトランザクションを開始するコマンドCOMMIT AND CHAIN、ROLLBACK AND CHAIN が追加されました。 (Peter Eisentraut) (12)
    • VACUUM と CREATE TABLE に末尾の空のページを切り捨てしないオプションが追加されました。 (Takayuki Tsunakawa) (12)

このために VACUUM文にオプション TRUNCATE が追加されました。同様にテーブルのストレージオプションに vacuum_truncate とtoast.vacuum_truncate が追加されました。これらのオプションを使用すると、VACUUM処理のロックを軽減できますが、オペレーティングシステムにディスク領域を戻すことができなくなります。

    • VACUUM 時にインデックスクリーンアップ処理をスキップできるようになりました。 (Masahiko Sawada) (12)

この変更により、VACUUM文にオプション INDEX_CLEANUP が追加されました。同様にテーブルのストレージオプションに vacuum_index_cleanup が追加されました。これらのオプションを使用すると、スペースを再利用する機能が低下し、インデックスが膨張する可能性がありますが、バキュームの主な目的が古いタプルを凍結することである場合に役立ちます。

    • すぐにロックできないテーブルに対して VACUUM および ANALYZE処理をスキップする機能を追加しました (Nathan Bossart) (12)

このために VACUUM 文と ANALYZE 文にオプション SKIP_LOCKED が追加されました。

    • VACUUM および ANALYZE でブール引数によるオプションの指定が可能になりました。 (Masahiko Sawada) (12)
(以下の書き方ができるようになりました)
db=# VACUUM (FREEZE on, VERBOSE off);
VACUUM
    • TRUNCATE、VACUUM、ANALYZE による、ユーザが権限を持たないテーブルに対するロック要求を防ぐようになりました。 (Michael Paquier) (12)

ユーザのクエリを妨げる可能性のある不正なロックを防止します。

    • EXPLAIN にデフォルト以外のオプティマイザ設定を出力するオプションSETTINGS が追加されました。 (Tomas Vondra) (12)

この出力は、auto_explain.log_settings を設定して auto_explain を使用するときにも取得できます。

(使用例)
db=# SET enable_indexscan TO off;
db=# explain (SETTINGS on) SELECT * FROM t1 WHERE id = 1;
                              QUERY PLAN
----------------------------------------------------------------------
 Bitmap Heap Scan on t1  (cost=4.29..8.31 rows=1 width=37)
   Recheck Cond: (id = 1)
   ->  Bitmap Index Scan on t1_pkey  (cost=0.00..4.29 rows=1 width=0)
         Index Cond: (id = 1)
 Settings: enable_indexscan = 'off'
(5 rows)
    • CREATE AGGREGATE 文に OR REPLACE オプションが追加されました。 (Andrew Gierth) (12)
    • ALTER TABLE でシステムテーブルのオプション変更が可能になりました。 (Peter Eisentraut) (12)

システムテーブルの pg_class.reloptions に設定される項目(fillfactor や自動バキューム設定など)の変更ができるようになりました。なお、変更するのに allow_system_table_mods = on の設定は引き続き必要です。

    • 外部キーのデフォルトの制約名を命名するときに、すべてのキー列の名前を使用するようになりました。 (Peter Eisentraut) (12)

以前は、制約名に最初の列名のみが含まれていたため、複数列の外部キーがあいまいになっていました。

以下に例を示します。

(以下のようなテーブルを作成)
=# CREATE TABLE users (tenant_id int, id int, PRIMARY KEY (tenant_id, id));
=# CREATE TABLE posts (tenant_id int, id int, PRIMARY KEY (tenant_id, id));
=# CREATE TABLE comments (
     tenant_id int, id int, post_id int, commenter_id int,
     FOREIGN KEY (tenant_id, post_id) REFERENCES posts,
     FOREIGN KEY (tenant_id, commenter_id) REFERENCES users);

(バージョン11での結果)
=# d comments
                 Table "public.comments"
    Column    |  Type   | Collation | Nullable | Default
--------------+---------+-----------+----------+---------
 tenant_id    | integer |           |          |
 id           | integer |           |          |
 post_id      | integer |           |          |
 commenter_id | integer |           |          |
Foreign-key constraints:
    "comments_tenant_id_fkey" FOREIGN KEY (tenant_id, post_id) REFERENCES posts(tenant_id, id)
    "comments_tenant_id_fkey1" FOREIGN KEY (tenant_id, commenter_id) REFERENCES users(tenant_id, id)

(バージョン12での結果)
=# d comments
                 Table "public.comments"
    Column    |  Type   | Collation | Nullable | Default
--------------+---------+-----------+----------+---------
 tenant_id    | integer |           |          |
 id           | integer |           |          |
 post_id      | integer |           |          |
 commenter_id | integer |           |          |
Foreign-key constraints:
    "comments_tenant_id_commenter_id_fkey" FOREIGN KEY (tenant_id, commenter_id) REFERENCES users(tenant_id, id)
    "comments_tenant_id_post_id_fkey" FOREIGN KEY (tenant_id, post_id) REFERENCES posts(tenant_id, id)

データ型

    • ユニコードの各種処理について Unicode 12.1.0 の規格に追従しました。 (Peter Eisentraut) (12)

ユニコードの正規化や結合文字の処理について修正されています。psql から誤った形式の出力がされることがありえました。

    • 新しい言語に対応するため Snowball語幹辞書を更新しました。 (Arthur Zakirov) (12)

これにより全文検索でアラビア語、インドネシア語、アイルランド語、リトアニア語、ネパール語、タミル語の語幹処理がサポートされます。

    • ビット単位では等しくない文字列の等価性を報告する照合順序を作れるようになりました。 (Peter Eisentraut) (12)

この機能は、大文字と小文字やアクセントの有無を区別しない等価比較を定義できる非決定的な照合順序をサポートします。これにより、例えばテキスト列の大文字と小文字を区別しない一意性制約が、以前よりも簡単に作成できるようになります。ICU照合順序でのみサポートされます。

    • バージョンの古い ICUライブラリでの ICU照合属性に対応しました。 (Peter Eisentraut) (12)

これにより、すべての ICU バージョンにわたって一貫した方法で照合規則のカスタマイズが可能となります。

    • データ型の名前を他のテキスト型とよりシームレスに比較できるようになりました。 (Tom Lane) (12)

型名は、デフォルト照合順序の C を持つ型のテキスト上のドメインのように動作するようになりました。これにより、型同士の比較がより効率的に処理されます。

関数

    • SQL/JSON Path言語に対応しました。 (Nikita Glukhov, Teodor Sigaev, Alexander Korotkov, Oleg Bartunov, Liudmila Mantrova) (12)

これにより、SQL標準言語を使用して JSON値に対する複雑なクエリを実行できます。

    • 双曲線関数のサポートが追加されました。 (Latitia Avrot) (12)

また、SQL標準に準拠するために、log() のエイリアスとして log10() が追加されました。

    • より正確なアルゴリズムを使用することで、variance() などの統計の集約関数の精度が改善されました。 (Dean Rasheed) (12)
    • date_trunc() にタイムゾーンを制御する引数が追加されました。 (Vik Fearing, Tom Lane) (12)

これは AT TIME ZONE句を使用するよりも速くて簡単です。

    • to_timestamp()/to_date()関数がテンプレートの不一致により寛容になりました。 (Artur Zakirov, Alexander Korotkov, Liudmila Mantrova) (12)

新たな動作は Oracle の同名の関数により一致したものになります。

    • XML関数のさまざまな不具合が修正されました。 (Pavel Stehule, Markus Winand, Chapman Flack) (12)

具体的には XMLTABLE の xpath()、xmlexists() で、ノードに何も出力されない場合がある不具合、予期しないエラーがスローされる不具合、XML特殊文字の必要なエスケープが行われていなかった不具合が修正されました。

    • XMLEXISTS と XMLTABLE で BY VALUE句が使えるようになりました。 (Chapman Flack) (12)

これは SQL標準であり、PostgreSQL の実装にも影響しませんが、これまで不必要に除かれていました。

    • current_schema() と current_schemas() がパラレルワーカによって実行されないようになりました。これらはパラレルセーフではないためです。 (Michael Paquier) (12)
    • RECORD と RECORD[] が、RECORD を返すテーブル関数の問い合わせの列定義リストで列型として使用できるようになりました。 (Elvis Pranskevichus) (12)
(例)
db=# SELECT * FROM unnest(ARRAY[ROW(1, ROW(2,3))]) AS q(a int, b RECORD);
 a |   b
---+-------
 1 | (2,3)
(1 row)

(11バージョンでは以下のエラーになる)
ERROR:  column "b" has pseudo-type record

PL/pgSQL

    • PL/pgSQL関数内で SQLコマンドと同名の変数が使えるようになりました。 (Tom Lane) (12)

たとえば、COMMENT という SQL を実行する PL/pgSQL 関数内で、comment という変数を使えるようになります。以前はこの組み合わせでパースエラーが発生していました。

    • PL/pgSQL に新たな付加的な警告およびエラーの検査が追加されました。 (Pavel Stehule) (12)

これらは設定パラメータ plpgsql.extra_warnings および plpgsql.extra_errors に指定するものです。’strict_multi_assignment’ は INTO句の列数と代入元の値の数の一致を検査します。’too_many_rows’ INTO句を持つクエリが正確に 1行を返すかを検査します。

クライアントインタフェース

    • libpq の TCPタイムアウトを制御する接続パラメータ tcp_user_timeout が追加されました。 (Ryohei Nagaura) (12)

切断検出までの時間を調整するのに役立ちます。

    • libpq および psqlコマンドでエラーメッセージに SQLSTATE値のみを報告させることができるようになりました。 (Didier Gautheron) (12)
(psqlでの例)
db=# set VERBOSITY sqlstate
db=# SELECT 1/0;
ERROR:  22012
    • クエリ結果で使用されるメモリを報告できる libpq関数 PQresultMemorySize() が追加されました。 (Lars Kanis, Tom Lane) (12)
    • libpq の「options」接続パラメータから非表示/デバッグのフラグが削除されました。 (Peter Eisentraut) (12)

これにより options パラメータを postgres_fdw から設定できるようになります。

    • ecpg で bytea型の変数を作成できるようになりました。 (Ryo Matsumura) (12)

これにより、ECPG クライアントは、エンコードされた形式を使用することなく、byteaデータを直接やりとりできるようになりました。

  • ECPG で PREPARE AS がサポートされました。 (Ryo Matsumura) (12)

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

    • vacuumdb がトランザクションID周回の限度(age)に基づいて vacuum対象のテーブルを選択できるようになりました。 (Nathan Bossart) (12)

–min-xid-age で vacuum したいテーブルのトランザクションID の age の最小値を、–min-mxid-age で vacuum したいテーブルのマルチトランザクションID の age の最小値を指定します。

    • vacuumdb のロック待機、全可視ページのスキップを無効にできるようになりました。 (Nathan Bossart) (12)

それぞれ –skip-locked と –disable-page-skipping オプションで無効にできます。

    • コマンドラインユーティリティでカラー出力ができるようになりました。 (Peter Eisentraut) (12)

これを有効にするには、環境変数 PG_COLOR を always または auto に設定します。任意の色を使用する場合は、ANSI エスケープコードを使用して環境変数 PG_COLORS を調整します。例えば、デフォルトの動作は PG_COLORS=”error=01;31:warning=01;35:locus=01″ です。

psql
    • psqlコマンドに csvフォーマット出力が追加されました。 (Daniel Verite) (12)

これは pset format csv もしくはコマンドラインの –csv オプションにより指定できます。

    • psqlコマンドの SQLコマンドヘルプの help の出力にマニュアルページへのURLが追加されました。 (Peter Eisentraut) (12)
(例)
db=# h CHECKPOINT
Command:     CHECKPOINT
Description: force a write-ahead log checkpoint
Syntax:
CHECKPOINT

URL: https://www.postgresql.org/docs/12/sql-checkpoint.html

URL は英語ドキュメントのページです。URL の「.org」を「.jp」に置換すると日本PostgreSQLユーザ会の日本語ページになります。日本語版12ドキュメント公開後にはこの方法が使用できます。

    • psqlコマンドの conninfo で IPアドレスが表示されるようになりました。 (Fabien Coelho) (12)
    • 下記のSQLでタブを使った補完機能が改善されました。 (Dagfinn Ilmari Mannsaker, Tatsuro Yamada, Michael Paquier, Tom Lane, Justin Pryzby) (12)
 CREATE TABLE
 CREATE TRIGGER
 CREATE EVENT TRIGGER
 ANALYZE
 EXPLAIN
 VACUUM
 ALTER TABLE
 ALTER INDEX
 ALTER DATABASE
 ALTER INDEX .. ALTER COLUMN
pgbench
    • クエリによって生成される値を pgbenchの変数に割り当てることが可能になりました。 (Fabien Coelho, Alvaro Herrera) (12)

このためのコマンドは gset です。

    • pgbench の –rateオプションの精度が改善されました。 (Tom Lane) (12)
    • pgbench でのエラー発生時のメッセージと終了ステータスが改善されました。 (Peter Eisentraut) (12)

ベンチマーク実行中のエラーは新しい終了ステータス 2 を使い、従来の pgbench の初期化中の既存エラーは終了ステータス 1 を使います。従来はベンチマーク実行中にエラーが発生すると、そのタイミングでエラーメッセージを出力してそのまま実行を続けて、最後に普通に実行結果を出力して、終了ステータス 0 で終了していました。

pg_dump
    • pg_dump で COPY の代わりに INSERT コマンドを使ったデータ入力ができるようになりました。一つの INSERT で複数行のデータ入力が可能です。 (Surafel Temesgen, David Rowley) (12)

これは –rows-per-insert オプションで指定できます。

    • pg_dump 時のリストア中に INSERT .. ON CONFLICT DO NOTHING を使うことでコンフリクトによる失敗を回避できるようになりました。 (Surafel Temesgen) (12)

これは –on-conflict-do-nothing オプションで有効にできます。

    • 並列 pg_dump の操作の順序と、後続の並列 pg_restore で使用される順序が、切り離されました。 (Tom Lane) (12)

これまでは並列 pg_restore はダンプされた順序にしたがってリストアをしていましたが、それは並列リストアのための最善の順序ではありません。

特に元のダンプが並列に取得されたものでない場合に、より完全に並列化された pg_restore による並列リストアが可能になりました。並列 pg_dump のスケジューリングも改善されました。

    • pg_dump と pd_dumpall で extra_float_digits設定が指定できるようになりました。 (Andrew Dunstan) (12)

–extra-float-digits オプションで指定できます。

これは主として異なるサーババージョンの間で正確に比較できるダンプの作成に有用です。ダンプがリストアされた時に精度が失われる可能性があるので、通常の使用には非推奨です。

  • pg_dumpall に指定データベースを除外する –exclude-database オプションが追加されました。 (Andrew Dunstan) (12)

サーバアプリケーション

    • 「pg_ctl logrotate」コマンドによるログファイルローテーション制御が可能となりました。 (Kyotaro Horiguchi, Alexander Kuzmenkov, Alexander Korotkov) (12)

以前は SQL関数かシグナルでのみ可能でした。

    • pg_ctl start 実行時に新しいサーバプロセスを適切にデタッチするようになりました。 (Paul Guo) (12)

これまで、pg_ctl start を実行するスクリプトをサーバプロセス起動後に割り込み終了すると、サーバプロセスも終了する振る舞いがありました。本修正により、これを回避します。

    • pg_upgrade にファイルシステムのクローン機能を使う –clone オプションが追加されました。 (Peter Eisentraut) (12)

–clone オプションは –link オプションに比べて、新しいクラスタが起動した後でも古いクラスタが変更されない利点があります。

    • pg_upgrade でソケットディレクトリを使うための仕様が追加されました。 (Daniel Gustafsson) (12)

これは –socketdir により制御できます。デフォルトは現在のディレクトリです。

    • pg_checksums で fsync を無効にできるようになりました。 (Michael Paquier) (12)

これは –no-sync オプションで制御できます。

    • pg_rewind で fsync を無効に出来るようになりました。 (Michael Paquier) (12)

これは –no-sync オプションで制御できます。

    • pg_test_fsync が Windows 上での open_datasync 時間で正確なレポートをするよう修正されました。 (Laurenz Albe) (12)

これまでは同時実行に対して安全でない条件でテストされていました。

ソースコード

    • CREATE ACCESS METHOD で新しいテーブル型の作成が可能になりました。 (Andres Freund, Haribabu Kommi, Alvaro Herrera, Alexander Korotkov, Dmitry Dolgov) (12)

これにより異なるユースケースにストレージを最適化することが可能となる新しいテーブルアクセスメソッドの開発が可能となりました。既存の heapアクセスメソッドはデフォルトとして残ります。

    • オプティマイザの関数に対する推定・インライン・インデックスを改善するためのプランナサポート関数インターフェースが追加されました。 (Tom Lane) (12)

これによって、関数の引数によって決定可能な関数特有の選択性、コスト、行数推定を提供するプランナサポート関数を作成する拡張が可能となりました。また、サポート関数は単純化された表記法とインデックス条件も提供して、最適化の可能性を大きく広げます。

    • 手動で割り当てられた OID の再付番が単純化され、そのような OID を管理する新しいプロジェクト方針が確立されました。 (John Naylor, Tom Lane) (12)

新しい関数などの新しい組み込みオブジェクトに手動で割り当てた OID のパッチは現在では 8000 から 9000 までの間の OID からランダムに選択されるべきです。

開発サイクルの最後の時点で、コミットされたパッチで使用された OID は新しいrenumber_oids.pl スクリプトによって、現在は 4000 番台のどこかのより小さい番号に再付番されます。この方法によって異なる進行中のパッチの間での OID の衝突の確率が大幅に減少します。

一方、OID の外部での使用については特に方針はありませんが、他のプロジェクトにおいてプライベートな手動での OID 割り当てが必要となった場合は、7000番台の使用を推奨します。これにより、最近マージされたパッチとの競合を避けられると共に、コアプロジェクトで 7000番台まで到達するまでには長い時間の余裕ができます。

    • Cygwin バイナリのビルドで静的ライブラリの代わりに動的ライブラリを使うようになりました。 (Marco Atzeri) (12)
    • configure スクリプトの –disable-strong-random オプションが削除されました。 (Michael Paquier) (12)

これからは強い乱数源が必要になります。

    • strerror や strerror_r と同様に、printf ファミリー関数でも、PostgreSQLコード内でプラットフォームをまたがった振る舞いが同一になりました。 (Tom Lane) (12)

特に、printf が %m をどこでも理解するようになりました。Windows上で、strerror が Winsock エラーコードを扱うようになります。これまでバックエンドではそのようにしていましたがフロントエンドではそうなっていませんでした。また、Windows上で、strerror_r の戻り値は常に GNU の習慣に従います。

    • Windows 上でのビルドに C99 準拠のコンパイラと MSVC 2013 以降が必要となりました。 (Andres Freund) (12)
    • プレーンテキスト文書のファイル出力に lynx ではなく pandoc を使用するようになりました。 (Peter Eisentraut) (12)

この変更は make dist の間に生成される INSTALL ファイルと、稀にしか使われないプレインテキストの postgres.txt 出力ファイルにのみ影響します。Pandoc は lynx より良い主力を生成し、ロケールやエンコーディングの問題を回避します。Pandoc のバージョンは 1.13 以降が必要です。

  • PostgreSQLドキュメントでイメージファイルが使用可能となりました。 (Jurgen Purtz) (12)

追加モジュール

    • より多くの場合で ORDER BYソートや LIMIT句を postgres_fdw 外部サーバにプッシュするようになりました。 (Etsuro Fujita) (12)
    • postgres_fdwクエリに対するオプティマイザコストの考慮が改善されました。 (Etsuro Fujita) (12)
    • postgres_fdwテーブルを参照する更新可能ビューの WITH CHECK OPTION を適切に扱うようになりました。 (Etsuro Fujita) (12)

postgres_fdwテーブルの CHECK OPTION を無視する一方、そのようなテーブルへのビューについてはローカルと見做し、CHECK OPTION の検査を強制するように変更されました。

以前は CHECK OPTION対象の値を返す RETURNING句を伴うINSERT と UPDATE のみが検査されていました。

    • pg_stat_statements_reset() がより細かい粒度を扱えるようになりました。 (Haribabu Kommi, Amit Kapila) (12)

指定したデータベース、ユーザ、クエリの統計リセットが可能です。

    • auto_explain のログレベルが制御可能となりました。 (Tom Dunstan, Andrew Dunstan) (12)

デフォルトのログレベルは LOG です。

    • unaccentモジュールの規則が更新されました。新たな発音記号とシンボルに対応しています。 (Hugh Ranalli, Michael Paquier) (12)
    • unaccentモジュールが結合された文字としてエンコードされたいくつかのアクセントを扱えるようになりました。 (Hugh Ranalli) (12)
    • unaccentモジュールでギリシャ文字からアクセントの削除が可能になりました。 (Tasos Maschalidis) (12)
    • amcheckモジュールの bt_index_parent_check() 関数に、ツリーのルートから各インデックスのタプルをチェックするパラメータが追加されました。 (Peter Geoghegan) (12)
    • oid2nameコマンドと vaccumloコマンドのオプション指定を他のコマンドに合わせるように改善しました。 (Tatsuro Yamada) (12)

例えば oid2name ではデータベースサーバのホスト指定が -H でしたが、他コマンドと同様に -h 形式に変更されました。従来の記法も非推奨ですが使用可能です。