このページでは PostgreSQL 10(2017/10/5リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
最終更新:2021/10/26
バージョン10の主な拡張点
バージョン10での主な拡張箇所は以下の通りです。
- パブリッシュ/サブスクライブによる論理レプリケーション
- 宣言的テーブルパーティショニング
- 改善された並列問い合わせ
- 著しい全般の性能改善
- SCRAM-SHA-256に基づくより強いパスワード認証
- 改善された監視と制御
バージョン10への移行/互換性のない変更点
-
pg_upgrade で PostgreSQL をメジャーバージョンアップした場合は Hash インデックスを
再構築する必要があります。(Mithun Cy, Robert Haas, Amit Kapila) (10) -
WAL格納ディレクトリが pg_xlog から pg_wal にリネームされました。
また、トランザクション状態格納ディレクトリも pg_clog から pg_xact にリネームされました。(Michael Paquier) (10) - xlog に関連する SQL関数、ツール、オプションの名称が wal に変更されました。 (Robert Haas) (10)
- WAL に関する関数とビュー名で使われていた location というワードが lsn に変更されました。 (David Rowley) (10)
- 問い合わせの SELECTリスト内に現れる集合を返す関数の実装が変更されました。 (Andres Freund) (10)
Hashインデックスの改良のために必要な措置です。
pg_upgrade コマンドはこの作業を補助するスクリプトを自動生成します。
PostgreSQL利用者はしばしばこれらディレクトリ内のファイルを不要ファイルと考えて手動削除しようとする場合がありました。
これは、復元不可能なデータ損失を招きます。
このディレクトリ名称変更によって、そのような失敗の回避を試みます。
たとえば、pg_switch_xlog() は pg_switch_wal() に、pg_receivexlog は pg_receivewal になり、--xlogdir オプションは --waldir オプションに変わります。
これは、pg_xlog ディレクトリ名が変更されることを受けての変更です。xlog というワードはユーザが利用する場面では使われなくなりました。
これまで 2つの用語が混在していました。
集合を返す関数は、LATERALのFROM句の項目に置かれたかのように、SELECTリスト内のスカラ式を評価する前に評価されるようになりました。
これにより、複数の集合を返す関数が存在する場合に、より穏当なセマンティクスが可能になります。
関数が行数の異なる結果を返す場合、行数が少ないほうの結果は、NULL を追加することによって最も行数の多い結果に一致するように拡張されます。
これまでは、すべての関数が同時に終了するまで結果を繰り返し、関数の周期の最小公倍数に等しい行数を生成していました。
さらに、CASE およびCOALESCE 内で集合を返す関数が使用できなくなりました。
(9.6 以前の動作例) =# SELECT generate_series(1, 2), generate_series(1, 3); generate_series | generate_series -----------------+----------------- 1 | 1 2 | 2 1 | 3 2 | 1 1 | 2 2 | 3 (6 rows) (10 の動作例) =# SELECT generate_series(1, 2), generate_series(1, 3); generate_series | generate_series -----------------+----------------- 1 | 1 2 | 2 | 3 (3 rows)
=# CREATE TABLE p (c int); CREATE TABLE =# CREATE TABLE t () INHERITS (p); CREATE TABLE =# ALTER TABLE p ADD PRIMARY KEY (c); ALTER TABLE (9.6 以前の動作例) =# \d t Table "public.t" Column | Type | Modifiers --------+---------+----------- c | integer | Inherits: p (10 の動作例) =# \d t Table "public.t" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- c | integer | | not null | Inherits: p
外側の文、あるいは他の書き込み可能CTEにより更新された同テーブルを更新する書き込み可能CTEを伴う場合、BEFORE STATEMENT または AFTER STATEMENT トリガが 2 回以上起動されます。
また、外部キー強制動作 (ON DELETE CASCADE など) の影響を受けるテーブルに文単位トリガがあった場合、トリガが外部 SQL 文ごとに起動される可能性があります。
これは SQL 標準に反するため、変更されました。
シーケンスのリレーションでは、lastvalue、log_cnt、および is_calledという nextval() によって編集可能なフィールドのみが格納されるようになりました。
開始値や増加量などのほかのシーケンスプロパティは、pg_sequence カタログの対応する行に保持されます。
ALTER SEQUENCE の更新は完全にトランザクション処理され、コミットするまでシーケンスがロックされます。
nextval() と setval() 関数はトランザクション扱いされないままです。
この変更によってもたらされた主な非互換性は、シーケンスのリレーションから選択すると、上記の 3 つのフィールドのみが返されるようになったことです。
シーケンスのほかのプロパティを取得するには、アプリケーションが pg_sequence を調べなければなりません。新しいシステムビューpg_sequences もこの目的のために使用でき、既存のコードとより互換性のある列名が提供されます。
シーケンスの psql の \d コマンドの出力も再設計されています。
(9.6 以前の動作例) =# CREATE SEQUENCE s; CREATE SEQUENCE =# SELECT * FROM s; sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- s | 1 | 1 | 1 | 9223372036854775807 | 1 | 1 | 0 | f | f (1 row) (10 の動作例) =# CREATE SEQUENCE s; CREATE SEQUENCE =# SELECT * FROM s; last_value | log_cnt | is_called ------------+---------+----------- 1 | 0 | f (1 row) =# SELECT * FROM pg_sequence WHERE seqrelid = 's'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+---------------------+--------+----------+---------- 16405 | 20 | 1 | 1 | 9223372036854775807 | 1 | 1 | f (1 row) =# SELECT * FROM pg_sequences WHERE sequencename = 's'; schemaname | sequencename | sequenceowner | data_type | start_value | min_value | max_value | increment_by | cycle | cache_size | last_value ------------+--------------+---------------+-----------+-------------+-----------+---------------------+--------------+-------+------------+------------ public | s | postgres | bigint | 1 | 1 | 9223372036854775807 | 1 | f | 1 | (1 row)
これにより、pg_basebackup の -X/--xlog-method のデフォルトが stream に変更されました。以前の動作を再現するために、オプション値 none が追加されました。pg_basebackup のオプション -x が削除されました (代わりに、-X
fetch を使用します)。
これまで、論理レプリケーション接続は pg_hba.conf の database カラムに replicationキーワードを指定していました。
今回のリリースで replication キーワードは物理レプリケーションのみで指定され、論理レプリケーションはデータベース名や all等のキーワードを指定できるようになりました。
この変更はサードパーティー製の論理レプリケーションプラグインを使っているユーザにのみ影響します。
以前はいくつかの pg_ctl の動作は完了を待たず、-w を使用する必要がありました。
これは、ハードコードされた、文書化されていないファイル名 dh1024.pem を置き換えます。dh1024.pem はデフォルトでは検査されません。
カスタムDHパラメータを使用する場合は、このオプションを設定する必要があります。
コンパイルされた DH パラメータのサイズが 1024 から 2048 ビットに増やされ、DH鍵共有がブルートフォース攻撃に対してより強くなりました。しかし、いくつかの古い SSL実装、とくに Java Runtime Environment バージョン 6 のいくつかのリビジョンでは、1024ビットより長い DHパラメータを受けつけないため、
SSL経由で接続することができません。このような古いクライアントをサポートする必要がある場合は、コンパイルされたデフォルトの代わりにカスタムの 1024ビットDHパラメータを使用してください。
password_encryption サーバパラメータは、off または plain をサポートしなくなりました。CREATE / ALTER USER ... PASSWORD では、UNENCRYPTED オプションがサポートされなくなりました。同様に、createuser から --unencrypted オプションが削除されました。
以前のバージョンから移行された暗号化されていないパスワードは、このリリースでは暗号化されて格納されます。
password_encryption のデフォルト設定はまだ md5 です。
これらは min_parallel_relation_size を置き換えます。これは、あまりにも一般的であることが判明したためです。
これらの設定は実際にはファイル名のリストですが、以前は異なる構文解析ルールをもつSQL識別子のリストとして扱われていました。
この設定をデフォルト値から変更すると、親テーブルを参照する問い合わせで子テーブルが含まれなくなりました。ただし、SQL 標準ではそれらを含む必要があります。これは PostgreSQL 7.1 以降のデフォルトです。
この機能では、PL/Python で複合型の配列の処理に後方互換性のない変更が必要となります。以前は、[[col1, col2], [col1, col2]] などの書式で複合値の配列を返すことができました。
これは 2 次元配列として解釈されます。
あいまいさを解決するために、配列の複合型をリストではなく Python タプルとして記述する必要があります。
つまり、代わりに [(col1, col2), (col1, col2)] と記述します。
この機能は、新しいサーバパラメータ pltcl_start_proc と pltclu_start_proc に置き換えられます。これは、使いやすく、ほかの PL で利用できる機能と同じにするためです。
8.0 より前のサーバからダンプする必要があるユーザは、PostgreSQL 9.6 以前のダンププログラムを使用する必要があります。
結果の出力は引き続き新しいサーバで正常に読み込めます。
これによってコンパイルオプションの --disable-integer-datetimes が取り除かれました。浮動小数点 timestamp は殆ど利点がなく、PostgreSQL 8.3 以来デフォルトで無効でした。
フロントエンド/バックエンドプロトコルの version 1.0 が取り除かれました。 (Tom Lane) (10)
このモジュールは、PostgreSQL 8.3 以前のリリースで用意された全文検索との互換性を提供していました。
これらは PostgreSQL 9.1 から非推奨となっていました。
これらのコマンドの代わりに CREATE EXTENSION および DROP EXTENSION 文を使ってください。
C 言語関数を提供する拡張機能は Version-1 呼び出し規約に準拠しなければならなくなりました。Version-0 は 2001 年から非推奨となっています。
変更点
サーバ
並列問い合わせ
- 並列のB-treeインデックススキャンに対応しました。(Rahila Syed, Amit Kapila, Robert Haas, Rafia Sabih) (10)
- 並列のビットマップヒープスキャンに対応しました。(Dilip Kumar) (10)
- マージ結合を並列に実行できるようになりました。(Dilip Kumar) (10)
- 関連しないいくつかの副問い合わせを並列に実行できるようになりました。 (Amit Kapila) (10)
- パラレルワーカがあらかじめソートされたデータを返せるようになりました。 (Rushabh Lathia) (10)
- 手続き言語関数において並列問い合わせが使われる箇所が増えました。(Robert Haas, Rafia Sabih) (10)
- 並列問い合わせに使うことができるワーカプロセス数を制限するmax_parallel_workersサーバパラメータが追加されました。 (Julien Rouhaud) (10)
この変更でB-treeインデックスページを各パラレルワーカから検索できるようになりました。
これにより一つのインデックススキャンを各パラレルワーカにヒープの異なる部分を担当するように割り当てできるようになりました。
並列問い合わせ以外にワーカプロセスを確保するために、このパラメータをmax_worker_processesよりも小さく設定する使い方ができます。
インデックス
- WALにハッシュインデックス対応が加わりました。(Amit Kapila) (10)
- ハッシュインデックスの性能を改善しました。 (Amit Kapila, Mithun Cy, Ashutosh Sharma) (10)
- INET、CIDRデータ型に対して SP-GiSTインデックス対応が追加されました。(Emre Hasegeli) (10)
- BRINインデックスの要約をより積極的に行うオプションが追加されました。 ( lvaro Herrera(10)
- インデックス範囲のBRIN要約を削除し、再び加える関数が追加されました。 ( lvaro Herrera(10)
- BRINインデックススキャンが有益かどうかの判断の精度が改善されました。 (David Rowley, Emre Hasegeli) (10)
- インデックス空間をより効率的に再利用することで、より速いGiSTの挿入と更新が可能になりました。(Andrey Borodin) (10)
- GINインデックスのバキュームの間のページロック取得が減りました。 (Andrey Borodin) (10)
これはハッシュインデックスをクラッシュセーフかつレプリケーション可能にします。
これまでのこれらの使用に関する(クラッシュセーフではなく、レプリケーションできない、という)警告は取り除かれました。
新たな CREATE INDEX のオプションは新たなページ範囲が作られたときに以前の BRINページ範囲の自動要約を可能にします。
新たなSQL関数 brin_summarize_range()は指定された範囲の BRINインデックス要約を更新し、brin_desummarize_range()はそれを削除します。
これは UPDATE と DELETE のために今やより小さくなった範囲の要約を更新するのに役立ちます。
従来はBRIN使用コストを過剰に楽観的に見積もっていました。
ロック
- テーブルパラメータを変更するのに求められるロック取得が減りました。(Simon Riggs, Fabr zio Mell)(10)
- 述語ロックの昇格閾値を調整できるようになりました。 (Dagfinn Ilmari Manns k)(10)
例えば、テーブルの effective_io_concurrency設定の変更がより軽量なロックで可能になりました。
ロック昇格が二つの新たなサーバパラメータmax_pred_locks_per_relation、max_pred_locks_per_page を通して制御できるようになります。
オプティマイザ
- 相関率と値の種類数を計算するための複数列オプティマイザ統計が追加されました。(Tomas Vondra, David Rowley, lvaro Herrera(10)
- 行単位セキュリティの影響を受ける問い合わせの性能が改善されました。(Tom Lane) (10)
そのために新たなコマンド CREATE STATISTICS、ALTER STATISTICS、DROP STATISTICS が追加されました。この機能は問い合わせのメモリ使用を見積りするのと、別々の列の統計を結びつけるときに役立ちます。
オプティマイザはRLSフィルタ条件を置けるところでより多くの知識をもつようになり、RLS条件を強制しても安全で場合により良いプラン生成が可能になりました。
性能
- numeric型の計算を使った合計を計算する集約関数が高速化されました。 (Heikki Linnakangas) (10)
- 基数木を使うことにより文字エンコーディング変換の性能が改善されました。 (Kyotaro Horiguchi, Heikki Linnakangas) (10)
- プランノード呼び出しオーバーヘッドと同様に、問い合わせ実行時の式評価のオーバーヘッドが削減されました。 (Andres Freund) (10)
- グループ化セットでハッシュ集約を使えるようにしました。 (Andrew Gierth) (10)
- いくつかの結合タイプの最適化でユニーク保証を使うようにしました。 (David Rowley) (10)
- macaddrデータ型のソート性能が改善されました。 (Brandur Leach) (10)
- 何千ものリレーションを参照するセッションでの統計観測のオーバヘッドが軽減されました。 (Aleksander Alekseev) (10)
SUM()、AVG()、およびSTDDEV()のいくつかの別形が含まれます。
これは特に多数の行を処理する問い合わせに役立ちます。
監視
- プラン作成と実行の時間のEXPLAINにおける表示について明示的な制御が可能になりました。 (Ashutosh Bapat) (10)
デフォルトではプラン作成と実行の時間は EXPLAIN ANALYZE では表示され、他の場合には表示されません。新たな EXPLAIN オプションの SUMMARY はこれについて明示的な制御ができます。
「SUMMARY off」指定で末尾に「Planning time:」と「Execution time:」を出さなくした例:
db1=# EXPLAIN (ANALYZE, SUMMARY off) SELECT * FROM tbl; QUERY PLAN -------------------------------------------------------------------------------------------------- Seq Scan on tbl (cost=0.00..22.70 rows=1270 width=36) (actual time=0.017..0.020 rows=3 loops=1) (1 row)
新たなロール pg_monitor、pg_read_all_settings、pg_read_all_stats、および、pg_stat_scan_tablesがあらかじめ用意されています。
これらロールはpsqlで「\du」としても出力されず、「\duS」の一覧にあらわれます。
これまではリフレッシュしたときに統計コレクタに報告されないケースがありました。バグ修正ですがバックポートしにくい箇所が含まれていました。
監視/ログ
- log_line_prefix のデフォルト値がサーバログの各行に現在タイムスタンプ(ミリ秒を含む)とプロセスIDを含むように変更されました。 (Christoph Berg) (10)
- ログおよびWALのディレクトリ内容を返す関数が追加されました。 (Dave Page) (10)
- ログコレクタの現在の stderr と csvlog出力のファイル名を読み取る関数 pg_current_logfile()が追加されました。 (Gilles Darold) (10)
- postmaster起動時のサーバログで各待ち受けソケットについてアドレスとポート番号を報告するようになりました。 (Tom Lane) (10)
以前のデフォルトは空でした。
新たな関数 pg_ls_logdir() および pg_ls_waldir() は適切な権限があれば非スーパーユーザでも実行できます。
また、待ち受けソケットのバインド失敗がログ出力されるとき、バインドを試みた特定アドレスがログに含まれるようになります。
起動メッセージ例: 2017-10-24 14:35:02.468 JST [6984] LOG: listening on IPv4 address "127.0.0.1", port 5432 2017-10-24 14:35:02.533 JST [6984] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432" 2017-10-24 14:35:02.630 JST [6984] LOG: redirecting log output to logging collector process 2017-10-24 14:35:02.630 JST [6984] HINT: Future log output will appear in directory "log". 起動失敗メッセージ例: 2017-10-24 14:39:47.346 JST [7147] LOG: could not bind IPv4 address "10.10.10.72": Address already in use 2017-10-24 14:39:47.346 JST [7147] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. 2017-10-24 14:39:47.346 JST [7147] WARNING: could not create listen socket for "10.10.10.72" 2017-10-24 14:39:47.346 JST [7147] FATAL: could not create any TCP/IP sockets
「autovacuum launcher started」や「logical replication launcher shutting down」はDEBUG1レベルのメッセージとなります。
また、client_min_messages のデバッグレベルにおいても冗長度を変更しました。
監視/pg_stat_activity
- pg_stat_activity に低レベル待機状態の報告が加わりました。 (Michael Paquier, Robert Haas, Rushabh Lathia) (10)
この変更で多数の低レベル待機状態の報告が可能になりました。この中にはラッチ待機、ファイルの読み/書き/同期、クライアントの読み/書き、および、同期レプリケーションが含まれます。
待機状態を表示させた例:
=# SELECT pid, wait_event_type, wait_event, state FROM pg_stat_activity ; pid | wait_event_type | wait_event | state ------+-----------------+---------------------+--------------------- 7316 | Activity | AutoVacuumMain | 7318 | Activity | LogicalLauncherMain | 7474 | | | idle in transaction 7354 | Client | ClientRead | idle 7357 | | | active 7475 | Lock | transactionid | active 7476 | | | idle in transaction 7519 | LWLock | lock_manager | active 7314 | Activity | BgWriterHibernate | 7313 | Activity | CheckpointerMain | 7315 | Activity | WalWriterMain | (10 rows)
これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。
pg_stat_activity.backend_type の出力例:
db1=# SELECT pid, backend_type FROM pg_stat_activity ; pid | backend_type ------+--------------------- 7316 | autovacuum launcher 7318 | background worker 7320 | client backend 7354 | client backend 7357 | client backend 7314 | background writer 7313 | checkpointer 7315 | walwriter (8 rows)
これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。
pg_stat_activity.backend_type の出力例:
db1=# SELECT pid, backend_type FROM pg_stat_activity ; pid | backend_type ------+--------------------- 7316 | autovacuum launcher 7318 | background worker 7320 | client backend 7354 | client backend 7357 | client backend 7314 | background writer 7313 | checkpointer 7315 | walwriter (8 rows)
これは出力をより一貫したものにします。
認証
- パスワードのネゴシエーションと格納に SCRAM-SHA-256 のサポートが追加されました。 (Michael Paquier, Heikki Linnakangas) (10)
- password_encryptionサーバパラメータが boolean から enum に変更されました。 (Michael Paquier) (10)
- pg_hba.conf の内容を表示するビュー pg_hba_file_rules が追加されました。 (Haribabu Kommi) (10)
- 複数のRADIUSサーバに対応しました。 (Magnus Hagander) (10)
これは既存の md5 によるネゴシエーションと格納の方式よりも良いセキュリティを提供します。
これは追加的なパスワードハッシュオプションに対応するのに必要でした。これからは md5 か plain かを指定するようになります。
現在有効な設定状態ではなくファイル内容を表示します。
サーバ設定
- SSL設定が設定リロードで更新できるようになりました。 (Andreas Karlsson, Tom Lane) (10)
- bgwriter_lru_maxpages の最大値が事実上無制限になりました。 (Jim Nasby) (10)
しかしながら、SSL設定のリロードは、サーバのSSLキーがパスフレーズを必要とする場合、パスフレーズのプロンプトを再度出す手段が無いので、動作しません。この場合、PostgreSQLを再起動しない限り、元の設定が適用されます。
信頼性
- ファイルを作成または削除(unlink)した後に、その親ディレクトリにfsyncを実行するようになりました。 (Michael Paquier) (10)
これは電源障害後のデータ損失のリスクを削減します。
信頼性/WAL
- 不要なチェックポイントと WALアーカイブを、これら処理がなければアイドル状態のシステムにおいては、実行しないようになりました。 (Michael Paquier) (10)
- WALに詳細情報を追加する wal_consistency_checkingサーバパラメータが追加されました。 (Kuntal Ghosh, Robert Haas) (10)
- 設定可能な最大WALセグメントサイズが 1GB に増えました。 (Beena Emerson) (10)
これはスタンバイサーバでWALの正常性チェックを可能にします。あらゆる正常性チェック失敗はスタンバイ上で致命的エラーをひき起こします。
より大きいWALセグメントサイズで、より少ない archive_command の起動とより少ない WALファイル制御を実現できます。
レプリケーションとリカバリ
- スタンバイサーバにテーブルを論理レプリケートする機能が追加されました。 (Petr Jelinek) (10)
- synchronous_standby_names での出現順序にかかわりなくスタンバイサーバからのコミット承認を待てるようになりました。 (Masahiko Sawada) (10)
- ストリーミングでのバックアップとレプリケーションに必要な設定変更が削減されました。 (Magnus Hagander, Dang Minh Huong) (10)
- pg_hba.confのデフォルトでローカルホスト接続からのレプリケーションが使用可能になりました。 (Michael Paquier) (10)
- pg_stat_replicationにレプリケーション遅延時間を報告する列が追加されました。 (Thomas Munro) (10)
- recovery.confでリカバリ停止点をログシーケンス番号(LSN)で指定できるようにしました。 (Michael Paquier) (10)
- pg_stop_backup()で、全WALがアーカイブされるのを待機することをしない動作モードが設けられました。 (David Steele) (10)
- 一時レプリケーションスロットを作成できるようになりました。 (Petr Jelinek) (10)
- Access Exclusiveロックのより良い追跡で、ホットスタンバイのリプレイの性能が改善されました。 (Simon Riggs, David Rowley) (10)
- 2相コミットのリカバリ性能が高速化されました。 (Stas Kelvich, Nikhil Sontakke, Michael Paquier) (10)
論理レプリケーションは、異なる PostgreSQLメジャーバージョン間でのレプリケーションや選択的レプリケーションを含め、物理レプリケーションよりも柔軟に構成できます。
これまではサーバは常に synchronous_standby_names の先頭に現れるアクティブなスタンバイを待機しました。新たな synchronous_standby_namesキーワード「ANY」は、順序にかかわりなく任意の数のスタンバイを待つことを可能にします。
これはクォーラムコミットとして知られています。
これまではpg_hba.confのレプリケーション接続の行はデフォルトではコメントアウトされていました。
新たな列はwrite_lag、flush_lag、および、replay_lagです。
これまでは停止点はタイムスタンプかXIDでしか指定できませんでした。
pg_stop_backup()のオプションの第2引数でこの振る舞いを制御します。
一時スロットはセッション終了またはエラーで自動的に削除されます。
問い合わせ
- XML整形されたデータを行の集合に変換する XMLTABLE関数を追加しました。 (Pavel Stehule, Alvaro Herrera) (10)
- 標準の行生成構文を UPDATE ... SET (column_list) = row_constructor で使えるようにしました。 (Tom Lane) (10)
row_constructorはキーワードROWで始めることができるようになりました。これまでは省略する必要がありました。また、row_constructor内に table_name.* が生じた場合は、他での row_constructor の使用のように、複数列に展開されるようになります。
(9.6.x以前のバージョンでは以下の書き方がエラーになりました) db1=# UPDATE t61 SET (c1, c2) = ROW (2, 2) WHERE id = 1; ERROR: syntax error at or near "ROW" (10では以下のような書き方もできます) db1=# UPDATE t61 SET (id, c1, c2) = ROW (t61a.*) FROM t61a WHERE t61.id = t61a.id; UPDATE 1
これまでは、このような文字は [[:alpha:]] などのロケール依存文字クラスに属するものとして認識されませんでした。
ユーティリティコマンド
- 自動的にパーティション制約を作り、タプルの挿入と更新の振り分けを行う、テーブルパーティショニング構文が追加されました。 (Amit Langote) (10)
- AFTERトリガに行の変更を記録する遷移テーブルが追加されました。 (Kevin Grittner, Thomas Munro) (10)
- 制限的な行単位セキュリティポリシーが可能になりました。 (Stephen Frost) (10)
- 外部キー制約を作るとき、REFERENCES権限のチェックを被参照テーブルにだけ行うようになりました。 (Tom Lane) (10)
- スキーマのデフォルトのアクセス権限が設定可能になりました。 (Matheus Oliveira) (10)
- ある整数データ型に一致するシーケンスを作る CREATE SEQUENCE ASコマンドが追加されました。 (Peter Eisentraut) (10)
この構文は範囲パーティショニングとリストパーティショニングに対応します。
遷移テーブルはサーバサイド言語で書かれたトリガからアクセスできます。
これまでは全てのセキュリティポリシーは許容的で、マッチする任意のポリシーはアクセスを許すことを意味しました。制限的ポリシーでは許可されたアクセスにマッチしなければなりません。これらのポリシータイプを組み合わせることもできます。
これまでは参照するテーブルのREFERENCES権限も必要でした。これはSQL標準の誤読から生じました。外部キー(あるいは何らか他のタイプの)制約を作るには、制約されるテーブルに所有権が必要で、加えてREFERENCES権限が必要というのはあまり意味がありません。
これは ALTER DEFAULT PRIVILEGES コマンドを使って行われます。あるロールでスキーマを作ったときの、作られたスキーマのデフォルト権限を設定できます。
これは基となる列の値の範囲に一致するシーケンスの作成を簡単にします。
(以下のように使用します) db1=# CREATE SEQUENCE seq68 AS smallint; CREATE SEQUENCE db1=# SELECT * FROM pg_sequence WHERE seqrelid = 'seq68'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+--------+--------+----------+---------- 16450 | 21 | 1 | 1 | 32767 | 1 | 1 | f (1 row)
このトリガには COPYで読み取られたデータ行が与えられます。
その名前をもつ関数が一つだけしかないなら、以下例のように引数なしで関数名だけの DROP FUNCTION 等が可能です。この振る舞いはSQL標準で必要とされているものです。
(例) db1=# CREATE FUNCTION my_function_70(int, text, timestamptz) RETURNS boolean LANGUAGE sql AS $$ SELECT true; $$; CREATE FUNCTION db1=# ALTER FUNCTION my_function_70 IMMUTABLE; ALTER FUNCTION db1=# DROP FUNCTION my_function_70; DROP FUNCTION
(以下の書き方ができるようになります) db1=# DROP FUNCTION my_function_71a, my_function_71b, my_function_71c; DROP FUNCTION
この情報は log_autovacuum_min_duration 設定に基づくログ出力にも含まれるようになります。
データ型
- テキスト検索がJSONとJSONBに対応しました。 (Dmitry Dolgov) (10)
- 新たなデータ型macaddr8 として EUI-64形式の MACアドレスに対応しました。 (Haribabu Kommi) (10)
- 挿入する列に数値を割り当てるための構文 GENERATED .. AS IDENTITY が追加されました。 (Peter Eisentraut) (10)
関数ts_headline()とto_tsvector()がこれらのデータ型に対して使用できるようになりました。
これは既存の EUI-48形式の MACアドレスの対応(macaddr型)を補完します。
これはSERIAL列と似ていますが、こちらの方がSQL標準準拠です。
(以下のように使用できます) db1=# CREATE TABLE t77 (id int GENERATED ALWAYS AS IDENTITY, v text); CREATE TABLE db1=# INSERT INTO t77 (v) VALUES ('AA'), ('BB'), ('CC'); INSERT 0 3 db1=# SELECT * FROM t77; id | v ----+---- 1 | AA 2 | BB 3 | CC (3 rows)
ALTER TYPE ... RENAME VALUE ... で以下のように改名できます。
db1=# CREATE TYPE enum78 AS ENUM ('X', 'Y', 'Z'); db1=# CREATE TABLE t78 (c enum78); db1=# INSERT INTO t78 VALUES ('X'),('Y'),('Z'); db1=# ALTER TYPE enum78 RENAME VALUE 'Z' TO 'ZZ'; db1=# SELECT * FROM t78; c ---- X Y ZZ (3 rows)
これまでは anyarray として宣言された列(特に pg_statsビューの内のもの)が配列でなく JSON文字列に変換されていました。
これまではこのような場合、結果として int8型の値が float8型に変換されて、money型とfloat8型の演算子が使われていました。新たな振る舞いは起こりうる精度損失を回避します。しかし、money型の int8型での除算は、他の整数除算の場合のように商を切り捨てするようになったことに注意してください。一方、従来の振る舞いでは丸めていました。
関数
- 簡易化したregexp_match()関数が追加されました。 (Emre Hasegeli) (10)
- jsonb の削除演算子として、削除するキー配列を取る版が追加されました。 (Magnus Hagander) (10)
これは regexp_matches() と似ていますが、最初のマッチからの結果だけを返すので集合を返す必要がなく、単純な場合により簡単に使えます。
-
(以下のように使用できます)
db1=# SELECT '{"a":10, "b":20, "c":30}'::jsonb - '{a,c}'::text[];
?column?
-----------
{"b": 20}
(1 row)
- json_populate_record()と関連する関数がJSONの配列とオブジェクトを再帰的に処理するようになりました。 (Nikita Glukhov) (10)
この変更で、あて先のSQL型の配列型フィールドが適切にJSON配列から変換され、複合型フィールドは適切にJSONオブジェクトから変換されます。これまでこのような場合は、JSON値のテキスト表現が array_in() または record_in() に与えられて、その構文が入力関数の期待と一致しないために、失敗していました。
(10で以下のような処理が可能になりました) db1=# CREATE TYPE typ84 AS (k1 int, v1 int); db1=# CREATE TABLE t84 (id int, v typ84); db1=# SELECT * from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1": 10}}'); id | v ----+-------- 1 | (1,10) (1 row) db1=# SELECT (v).v1 from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1":10}}'); v1 ---- 10 (1 row)
txid_current()とは異なり、トランザクションIDが割り当てされていないときにトランザクションIDを新たに割り当てようとしないため、本関数はスタンバイサーバでも実行できます。
これは突発切断後において、前トランザクションがコミット済で応答を受け取れなかっただけなのか、コミットもされていないのかを検査するのに有益です。
例えば、これまでは to_date('2009-06-40','YYYY-MM-DD') は受け入れられて 2009-07-10 を返しました。これからはエラーが生じます。
サーバサイド言語
- PL/Pythonの cursor()関数と execute()関数をそれらのプランオブジェクト引数のメソッドとして呼べるようになりました。 (Peter Eisentraut) (10)
- PL/pgSQLの GET DIAGNOSTICS文が配列要素に値を取り込むめるようになりました。 (Tom Lane) (10)
よりオブジェクト指向プログラミング的なスタイルが可能になります。
これまでは、構文上の制限であて先の変数を配列要素にすることが妨げられていました。
PL/Tcl
- PL/Tcl関数が複合型と集合を返せるようになりました。 (Karl Lehenbauer) (10)
- PL/Tclにサブトランザクションコマンドが追加されました。 (Victor Wagner) (10)
- サーバパラメータpltcl_start_proc、pltclu_start_proc が追加されました。 (Tom Lane) (10)
これにより PL/Tclの問い合わせが関数全体の中断なしに失敗できるようになります。
PL/Tcl開始に際して初期化関数が呼ばれるようにできます。
クライアントインタフェース
- libpqの接続文字列とURIで複数のホスト名またはアドレスを指定できるようになりました。 (Robert Haas, Heikki Linnakangas) (10)
libpqはリスト中の最初の応答するサーバに接続します。
(以下のように複数サーバを記述できます) $ psql 'host=dbhost1,dbhost2 port=5432,5432 dbname=db1 user=user1'
libpqの接続パラメータ target_session_attrs で、'any' でなく 'read-write' を指定すると、読み書き可能な接続に限定されます。
ホットスタンバイサーバでなくマスタサーバでなければならないという指定に応用できます。なお、ALTER ROLE ... SET default_transaction_read_only TO on; としてあるロールで接続を試みた場合も、接続に失敗するようになります。
以下例では、5432ポートの PostgreSQLに接続すると readonlyになる場合には、2番目の 5433ポートの PostgreSQL に接続されます。
$ psql 'host=127.0.0.1,127.0.0.1 port=5432,5433 dbname=db1 user=u1 target_session_attrs=read-write'
これまでは環境変数を通してのみ指定できました。
これまでは MD5で暗号化されたパスワードのみが PQencryptPassword() を使って作成できました。新たな関数は SCRAM-SHA-256 で暗号化されたパスワードも作成できます。
今後は ecpgバージョンが PostgreSQL配布バージョン番号と一致します。
クライアントアプリケーション
psql
- psqlが条件分岐に対応しました。 (Corey Huinker) (10)
- psql に \gxメタコマンドを追加しました。 (Christoph Berg) (10)
- psqlの変数参照をバッククォート実行の文字列内でも利用可能になりました。 (Tom Lane) (10)
この機能は psql にメタコマンド \if、\elif、\else、\endif を加えます。主としてスクリプト作成に役立ちます。
これは拡張モード(\x)で問い合わせを実行(\g)します。
これは特に新たな psql の条件分岐コマンドにおいて役立ちます。
(psqlスクリプトでの使用例) \set param 123 \echo `judge is:` \echo `/opt/bin/judge.sh :param` \if `/opt/bin/judge.sh :param` \i special_proc.sql \endif
特例として真偽値を持つ特別変数に対する空または省略された新たな値での \set は、依然として値を on に設定した効果を持ちます。ただし、この場合でも特別変数に空文字が保持されることはなくなります。
(以下は9.6.x以前バージョンではエラーが出ませんでした) db1=# \set FETCH_COUNT xxx invalid value "xxx" for "FETCH_COUNT": integer expected (以下は9.6.x以前のバージョンですと変数値が空文字列になっていました) db1=# \set AUTOCOMMIT db1=# \echo :AUTOCOMMIT on
また、特別変数に対する \unset は、これからは明示的に値をそのデフォルト値に設定します。
変数 VERSION_NUM、VERSION_NAME、SERVER_VERSION_NUM、SERVER_VERSION_NAME が利用できます。
これまではこれらは一つの Modifiers 列の中に示されていました。
これからは全てのメッセージを stdout でなく stderr に出力するようになり、メッセージの文言もより一貫性をもったものになります。
pgbench
- pgbench にログファイルのプレフィックスを制御するオプション --log-prefixが追加されました。 (Masahiko Sawada) (10)
- pgbenchで複数行にわたるメタコマンドが書けるようになりました。 (Fabien Coelho) (10)
- pgbench で -Mオプションの、他のコマンドラインオプションと関連する位置の制限が取り除かれました。 (Tom Lane) (10)
行末にバックスラッシュを書いて次行に継続できるようになります。
以前は -M はベンチマークスクリプトを規定するオプション(-f や -b) より先に現れる必要がありました。
サーバアプリケーション
- pg_receivewal の圧縮を指定するオプション -Z / --compress を追加しました。 (Michael Paquier) (10)
- pg_recvlogical に終了点を指定するオプション --endpos が追加されました。 (Craig Ringer) (10)
- initdb のオプション --noclean、--nosync が --no-clean、--no-sync と綴るように改名されました。 (Vik Fearing, Peter Eisentraut) (10)
これまでは --startpos オプションだけが在りました。
従来のオプション綴りにも未だ対応しています。
pg_dump/pg_restore
- pg_restore がスキーマを除外できるようになりました。 (Michael Banck) (10)
- pg_dump に --no-blobs オプションが追加されました。 (Guillaume Lelarge) (10)
- pg_dumpall にロールのパスワードを無視するオプション --no-role-passwords が追加されました。 (Robins Tharakan, Simon Riggs) (10)
- スタンバイサーバからのダンプでの同期スナップショットの使用に対応しました。 (Petr Jelinek) (10)
- pg_dump と pg_dumpall で生成された出力ファイルに対して fsync() を発行するようになりました。 (Michael Paquier) (10)
新たに -N / --exclude-schema オプションが追加されます。
これはラージオブジェクトをダンプから除外します。
これにより非スーパーユーザからの pg_dumpall が可能になります。本オプションが無いとパスワードが読めないためにエラーになります。
これにより pg_dump の -j オプションをスタンバイサーバに対しても使用できるようになります。
プログラム終了前に出力が安全にディスク上に格納されるという、より良い安全性を提供します。この動作は新たな --no-sync オプションで無効にできます。
pg_basebackup
- pg_basebackup が tarモード(-Ft)で WALストリーミング(-Xs)ができるようになりました。(Magnus Hagander) (10)
- pg_basebackup が一時レプリケーションスロットを使うようになりました。 (Magnus Hagander) (10)
- pg_basebackup と pg_receivewal において、必要とされる場所での fsync実行について、より注意深く行われるようになりました。 (Michael Paquier) (10)
- pg_basebackup に fsync を無効にするオプション --no-sync が追加されました。 (Michael Paquier) (10)
- pg_basebackup のどのディレクトリを読み飛ばすかの制御が改良されました。 (David Steele) (10)
このとき WAL はベースバックアップとは別の tar ファイルに格納されます。
pg_basebackup がデフォルトオプションでWALストリーミングを使うとき、一時レプリケーションスロットはデフォルトで使われます。
潜在的な OSダウン時のデータ損失の可能性を減らす意図の改修です。
pg_ctl
- pg_ctl の昇格操作むけ待機オプションが追加されました。 (Peter Eisentraut) (10)
- pg_ctl に待機(--wait)、待機無し(--no-wait)のロングオプションが追加されました。 (Vik Fearing) (10)
- pg_ctlのサーバオプション(-o)にロングオプション(--options)が追加されました。 (Peter Eisentraut) (10)
- pg_ctl start --wait が接続を試みるのではなく、postmaster.pid を監視してサーバの準備完了を検出するようになりました。 (Tom Lane) (10)
- postmasterの起動/停止を待機するときの pg_ctl の応答時間が短縮されました。 (Tom Lane) (10)
- 待たされている操作がタイムアウト内に完了しなかった場合、pg_ctl が非ゼロステータスで終了することを保証しました。 (Peter Eisentraut) (10)
-w で昇格完了を待つことができるようになります。
postmaster はその接続受付状態を postmaster.pid に報告するように変更されました。そして、pg_ctl はそのファイルを調べて起動が完了したかを検出します。これは従来の方法よりも効率的で信頼でき、起動当初の pg_ctl による接続試行がログに記録されずに済みます。
pg_ctl は postmaster の状態変更を待つときに、これからは1秒に1回ではなく、1秒に10回検査します。
start、promote 操作は、このような場合に終了ステータスに 0 でなく 1 を返すようになりました。stop操作は以前から常にそのようになっていました。
ソースコード
- 二要素のリリースバージョン番号に変更されました。 (Peter Eisentraut, Tom Lane) (10)
- pgindent の振る舞いが改良されました。 (Piotr Stefaniak, Tom Lane) (10)
- ICUライブラリが照合順序の対応にオプションで使用できるようになりました。 (Peter Eisentraut) (10)
- Windows上で自動的に全ての PG_FUNCTION_INFO_V1関数を DLLEXPORTされたものと印付けするようになりました。 (Laurenz Albe) (10)
- SPI関数のSPI_push()、SPI_pop()、SPI_push_conditional()、SPI_pop_conditional()、SPI_restore_connection() は必要ないため除去されました。 (Tom Lane) (10)
- 共有メモリを動的に割り当てできるようになりました。 (Thomas Munro, Robert Haas) (10)
- 効果的な固定サイズ割り当てのためにスラブのようなメモリアロケータが追加されました。 (Tomas Vondra) (10)
- Linux と FreeBSD において SysVセマフォではなく POSIXセマフォを使用するようになりました。 (Tom Lane) (10)
- 64-bitでの原子性の対応が改善されました。 (Andres Freund) (10)
- ARM64 の 64bitの原子的操作が有効になりました。 (Roman Shaposhnik) (10)
- 可能であれば遅延の計測にclock_gettime()を使うように切り替えました。 (Tom Lane) (10)
- 暗号による保護の用途で使われるより頑健な乱数生成器が加わりました。 (Magnus Hagander, Michael Paquier, Heikki Linnakangas) (10)
- WaitLatchOrSocket()がWindowsでソケット接続を待つことができるようになりました。 (Andres Freund) (10)
- tupconvert.c の関数はもはやタプルを単にそれらの中に異なる複合型のOIDを組み込むようには変換しなくなりました。 (Ashutosh Bapat, Tom Lane) (10)
- SCO と Unixware への移植対応が取り除かれました。 (Tom Lane) (10)
- 文書のビルド手順が全面的に書き換えられました。 (Alexander Lakhin) (10)
- PostgreSQL文書をビルドするのに XSLT を使用するようになりました。 (Peter Eisentraut) (10)
- デフォルトで XSLT のスタイルシートを使って HTML文書をビルドするようになりました。 (Peter Eisentraut) (10)
リリース番号はこれからは三要素(例えば 9.6.3)でなく二要素になります(例えば、10.1)。メジャーバージョンは一番目の数だけが増え、マイナーリリースは二番目に数だけが増えます。リリースブランチは単一の数で参照されます(例えば 9.6 でなく 10)。これまでは最初の二つの数がメジャーリリース、最後の数がマイナーリリースでした。
FreeBSDプロジェクトによる最近の改良に基づく pg_bsd_indent の新バージョンに切り替えられました。これはおかしなCコード整形の判断をする多数の小さなバグを修正します。最も特記すべきは、たとえ結果としてコードが右端を超えて延びても、(複数行の関数呼び出しのような)括弧内の複数行が開き丸括弧でインデントが揃えられるようになったことです。
ICUライブラリはバージョン間での照合順序の変更がわかるバージョン付けをしています。これはconfigureオプション --with-icu で有効にできます。デフォルトでは未だオペレーティングシステム固有の照合順序ライブラリを使います。
yum.postgresql.org サイトでの配布物では --with-icu オプションが使われています。
サードパーティコードで extern関数宣言を使っている場合、DLLEXPORTマーカーをそれらの宣言に加える必要があります。
これら関数の機能はこれからは自動的に行われます。外部モジュールが直ちにアップデートを必要としないように、これら関数はその名前の何もしないマクロとなりますが、最終的にはこれらも取り除かれるはずです。
本変更の副作用は、SPI_palloc() と付随する関数がこれからはアクティブなSPI接続を必要とすることです。接続が無い場合、これからは単純な palloc() に縮退しません。従来の振る舞いは必ずしも便利ではなく予期せぬメモリリークの危険性が生じました。
これにより、プラットフォームで SysVセマフォ使用量の上限に注意したり、調整したりする必要がなくなります。
clock_gettime() が使えないときには gettimeofday が依然として使われます。
強い乱数生成器が見つからないと、configure は --disable-strong-random が指定されていない限り、失敗します。しかしながら、このオプション付きですと強いランダム生成器を必要とする pgcrypto関数は使用できません。
多数派の呼び出し元は複合型OIDについて考慮しませんが、結果タプルが複合Datumとして使われる場合、正しいIDがその中に挿入されるのを確かめる手順となります。
これまでは Jade、DSSSLおよびJadeTexが使われていました。
追加モジュール
- file_fdw がファイル同様にプログラム出力結果から読み取りできるようになりました。 (Corey Huinker, Adam Gomaa) (10)
- postgres_fdwで、可能であれば集約関数をリモートサーバにプッシュするようになりました。 (Jeevan Chalke, Ashutosh Bapat) (10)
- postgres_fdwで、より多くの場合に結合をリモートサーバにプッシュするようになりました。 (David Rowley, Ashutosh Bapat, Etsuro Fujita) (10)
- postgres_fdwテーブルのOID列を適切にサポートしました。 (Etsuro Fujita) (10)
- btree_gist と btree_gin でenum型のインデックスが可能になりました。 (Andrew Dunstan) (10)
- UUIDデータ型に対する btree_gistインデックスに対応しました。 (Paul Jungwirth) (10)
- B-treeインデックスの妥当性を検査できる amcheck が追加されました。 (Peter Geoghegan) (10)
- pg_stat_statements で無視された内容が ? ではなく$N と表示されるようになりました。 (Lukas Fittl) (10)
- cubeのゼロ次元キューブの扱いが改善されました。 (Tom Lane) (10)
- pg_buffercacheがより少ないロックで実行可能になりました。 (Ivan Kartyshov) (10)
- pgstattupleにハッシュインデックスの統計情報を参照する関数pgstathashindex()が追加されました。 (Ashutosh Sharma) (10)
- pgstattupleの関数の使用を制御するのに GRANT で権限を与えるようにしました。 (Stephen Frost) (10)
- pgstattuple がハッシュインデックスを調べるときのロック取得が軽減されました。 (Amit Kapila) (10)
- pageinspect にページのチェックサムを表示する関数page_checksum()が追加されました。 (Tomas Vondra) (10)
- pageinspectにページイメージからページ要素を出力する関数bt_page_items()が追加されました。 (Tomas Vondra) (10)
- pageinspectがハッシュインデックス対応しました。 (Jesper Pedersen, Ashutosh Sharma) (10)
これはリモートサーバから渡されなければならないデータ量を減らし、集約計算の負担を要求元サーバから取り除きます。
これまではOID列は常にゼロを返しました。
これにより enum が排他制約に使用できます。
データベース管理者がこれらの関数を非スーパーユーザで実行可能にできるようになります。
リリースノートに記載の無い変更点
- 標準SQLで特別な構文が定義されている CURRENT_DATE のようなパラメータレス関数の実装が改善された変更の影響で、SELECT 文で表示される列名が変更されました。以前のバージョンでは、関数名と異なる実装依存の列名や他と同一の列名でしたが、本バージョンでは関数名通りの列名となりました。
SELECT文で表示される列名の変更があった関数は下記の通りです。
関数名 | PostgreSQL 9.6.x での出力列名 -------------------+------------------------------- current_date | date current_time | timetz current_timestamp | now localtime | time localtimestamp | timestamp current_role | current_user user | current_user current_catalog | current_database