このページでは PostgreSQL 9.5 (2016年1月7日リリース)に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン9.5への移行/互換性のない変更点
全ての以前のリリースからデータの移行を行うためには、pg_dumpを使用したダンプ/リストア、または、pg_upgrade の使用が必要です。バージョン9.5には、前リリースとの互換性に影響を与える変更がいくつか含まれます。以下の非互換性に注意してください。
- SQL標準に適合するように演算子の優先順位が変更されました (Tom Lane) (9.5)
<=、>=、<> の優先順位が <, >、= と同じに下げられました。IS検査(x IS NULL など)の優先順位がこれら6つの比較演算子のすぐ下まで下げられました。
NOTで始まる複数キーワード演算子は基底演算子と同じ優先順位を持つようになります(例えば、NOT BETWEEN は BETWEEN と同じ優先順位となります)。NOTは左辺要素を尊重するけれどもその基底演算子は右辺要素を尊重するといったように、これまで一貫性に欠けた優先順位になっていました。新たな設定パラメータ operator_precedence_warning で本優先順位変更で異なった解析結果になる問い合わせについての警告を有効にできます。
例を示します。
(9.4 の場合) db1=# SELECT false = true IS NULL; ?column? ---------- t (1 row) (9.5 の場合/WARNING メッセージは operator_precedence_warning により出る) db1=# SET operator_precedence_warning TO on; SET db1=# SELECT false = true IS NULL; WARNING: operator precedence change: IS is now lower precedence than = LINE 1: SELECT false = true IS NULL; ^ ?column? ---------- f (1 row)
- pg_ctl のデフォルトシャットダウンモードが smart から fast に変更されました。 (Bruce Momjian) (9.5)
停止時のデフォルト動作が、既存のデータベースセッションが終了するのを待つのでなく、トランザクションをエラー終了させて強制切断させるようになります。
- PL/pgSQLの代入でのデータ型変換が、テキストI/O変換ではなく、代入キャストの動作となりました。 (Tom Lane) (9.5)
この変更により、boolean型から文字列への変換で、t や f ではなく、true や false が生じます。他の型変換はおそらくこれまでより多くの場合で成功するようになります。例えば、数値 3.9 をinteger変数に代入すると、これからはエラーになるのでなく 4 が代入されます。当該の変換元と変換先の型について代入級キャストが定義されていないときには、PL/pgSQL は従来通りのテキストI/O変換の動作となります。
- 接続文字列の中のサーバむけコマンドラインオプションでバックスラッシュで文字をエスケープできるようになりました。 (Andres Freund) (9.5)
これまでは、オプション文字列中の空白文字が常にオプション区切になっていて、オプション内容に空白文字を含める方法がありませんでした。オプション内容にバックスラッシュ()を含めるにはこれからは \\ と書く必要があります。
$ psql "host=localhost dbname=db1 options='-c default_transaction_isolation=repeatable\\\\ read'"
上記のように指定ができます。9.4以前では空白を含むオプション内容文字列(本例では「repeatable read」)を渡す方法がありませんでした。
- GSSAPI の include_realm パラメータのデフォルト値が 1 に変更されました。 (Stephen Frost) (9.5)
そのため、デフォルトでは GSS および SSPI のプリンシパル名からレルムは取り除かれません。
- 設定パラメータ checkpoint_segments が min_wal_size と max_wal_size で置き換えられました。 (Heikki Linnakangas) (9.5)
これまで checkpoint_segments を調整していたのであれば、以下の式でおおよそ同等の設定が得られます。
max_wal_size = (3 * checkpoint_segments) * 16MB
max_wal_size のデフォルト設定は、以前の checkpoint_segments のデフォルト値よりもずっと大きいことに注意してください。そのため、これらを調整することはもはや必要ないかもしれません。
- Linux の OOM killer を、コンパイル時のオプション LINUX_OOM_SCORE_ADJ、LINUX_OOM_ADJ に代えて、環境変数 PG_OOM_ADJUST_FILE、PG_OOM_ADJUST_VALUE で制御するようになりました。 (Gurjeet Singh) (9.5)
- 以前リリースで非推奨とされていた設定パラメータ ssl_renegotiation_limit が廃止されました。 (Andres Freund) (9.5)
理論上はSSL再ネゴシエーションは良い考えですが、実際には差引マイナスと考えられるほど多くのバグを引き起こしており、さらに、関連する標準の将来バージョンから除去されることになっています。そのため、PostgreSQL から本機能のサポートを外すこととなりました。設定パラメータ ssl_renegotiation_limit は未だ在りますが、0(無効)以外には設定できませんし、ドキュメントにも記載されません。
- 既に非推奨かつ使用不能となっていた設定パラメータ autocommit が除去されました。 (Tom Lane) (9.5)
- システムカタログ pg_authid のフィールド rolcatupdate が不用であるため除去されました。 (Adam Brightwell) (9.5)
- システムビュー pg_stat_replication のフィールド sent が、有効な値を持たないとき、0 でなく NULL となりました。 (Magnus Hagander) (9.5)
- json および jsonb の配列抽出演算子で、JSON配列を後ろから数える、負の添え字が可能となりました。 (Peter Geoghegan, Andrew Dunstan) (9.5)
db1=# select '[1, 2, 3, 4]'::jsonb -> -2; ?column? ---------- 3 (1 row)
上記のように使用できます。
これまでこれら演算子は負の添え字に NULL を返しました。
変更点
サーバ
インデックス
- BRINインデックス方式が追加されました。 (Álvaro Herrera) (9.5)
BRINインデックスは、ヒープブロック範囲の最大値、最小値といった摘要データのみを格納します。そのため、非常にサイズが小さく、更新コストも軽微です。
データの物理配置が(CLUSTER命令を実行した後のように)対象カラム値が近い行が隣接している配置になっているなら、かなりの検索速度向上を実現します。
- GiSTインデックスを使った、境界ボックスでインデックス付けされるオブジェクト(polygon や circle)の距離によるフィルタを正確に行う問い合わせが可能になりました。 (Alexander Korotkov, Heikki Linnakangas) (9.5)
以下のような問い合わせが記述可能になり、GiSTインデックスが使われます。
db1=# CREATE INDEX idx_geo_c1 ON t_geo1 USING gist (circle1); db1=# SELECT * FROM t_geo1 ORDER BY circle1 <-> '0,0'::point ; id | circle1 ------+------------- 9755 | <(0,1),5> 9556 | <(1,8),11> 3034 | <(6,1),6> 6008 | <(1,5),5> 6763 | <(10,2),10> (5 rows) db1=# EXPLAIN SELECT * FROM t_geo1 ORDER BY circle1 <-> '0,0'::point ; QUERY PLAN -------------------------------------------------------------------------------------- Limit (cost=0.15..0.59 rows=5 width=28) -> Index Scan using idx_geo_c1 on t_geo1 (cost=0.15..884.15 rows=10000 width=28) Order By: (circle1 <-> '(0,0)'::point) (3 rows)
これまで、このようなSQLでインデックスを利用するには、サブクエリで行を境界ボックスの距離で並び替えて、その結果を正確な距離計算でフィルタする必要がありました。
- GiSTインデックスでインデックスオンリースキャンが可能になりました。 (Anastasia Lubennikova, Heikki Linnakangas, Andreas Karlsson) (9.5)
- GINの待機リストサイズを制御する設定パラメータ gin_pending_list_limit が追加されました。 (Fujii Masao) (9.5)
本パラメータはインデックスごとにインデックスのストレージパラメータとして設定することも可能です。これまで待機リストサイズは work_mem で制御されていましたが、適切な work_mem値が待機リストサイズむけには大きすぎることがよくあり、扱いにくいものとなっていました。
- hashインデックスを作るときにWALログ書きこみされないという警告が出るようになりました。 (Bruce Momjian) (9.5)
以下のメッセージが出ます。
db1=# CREATE INDEX idx_hash ON t1 USING hash (id); WARNING: hash indexes are not WAL-logged and their use is discouraged
性能一般
- 短縮キーにより、varchar型、text型、numeric型フィールドのソート速度が改善されました。 (Peter Geoghegan, Andrew Gierth, Robert Haas) (9.5)
- ソートをインラインで実行できるように基盤が拡張されました。 (Peter Geoghegan) (9.5)
SQLから呼び出しできない内部用の比較関数が CREATE INDEX、REINDEX、CLUSTER に適用されます。
- ハッシュ結合の性能が改善されました。 (Tomas Vondra, Robert Haas) (9.5)
- 共有バッファのページ置き換えの同時実行性が改善されました。 (Robert Haas, Amit Kapila, Andres Freund) (9.5)
- インデックススキャン中のページロックとピン取得が減りました。 (Kevin Grittner) (9.5)
主な恩恵はインデックスのバキュームがあまりブロックされなくなることです。
- バックエンド毎のバッファピンの追跡でメモリ利用効率が改善されました。 (Andres Freund) (9.5)
- ロックのスケーラビリティが改善されました。 (Andres Freund) (9.5)
これは内部的なロック (LWLock) 実装の改訂です。特に多CPUコアマシンで動作させるときに効果があります。
- オプティマイザが左結合(外部結合)された副問い合わせの不要な参照を取り除けるようになりました。 (David Rowley) (9.5)
以下の SQL は t3bテーブルについてスキャンも結合に必要ありませんので、9.5 では t3aテーブルのスキャンだけを行うプランになります。RIGHT JOIN についても同様に修正されています。
db1=# explain SELECT t3a.* FROM t3a LEFT JOIN (SELECT * FROM t3b GROUP BY id) AS b ON t3a.id = b.id; QUERY PLAN -------------------------------------------------------- Seq Scan on t3a (cost=0.00..22.70 rows=1270 width=36)
db1=# explain SELECT t3a.* FROM t3a LEFT JOIN t3b USING (id); QUERY PLAN -------------------------------------------------------- Seq Scan on t3a (cost=0.00..22.70 rows=1270 width=36) (1 row)
なお、サブクエリが無い以下SQLは 9.4 でも不要なスキャンと結合は除外されます。
適切な場所においては、問い合わせの制約をウィンドウ関数を伴う副問い合わせにプッシュダウンできるようになりました。
以下に例を示します。9.5 では、dep = 'Sales' という条件が最初のスキャンで適用されていて、処理対象の件数を早い段階で減らすことができています。
db1=# explain SELECT * FROM (SELECT dep, sum(salary) OVER (PARTITION BY dep) depsalary, min(salary) OVER (PARTITION BY dep || 'A', dep) depminsalary FROM t4) emp WHERE dep = 'Sales'; (9.5 における結果) QUERY PLAN ---------------------------------------------------------------------------- Subquery Scan on emp (cost=25.17..25.35 rows=6 width=44) -> WindowAgg (cost=25.17..25.29 rows=6 width=36) -> Sort (cost=25.17..25.18 rows=6 width=36) Sort Key: ((t4.dep || 'A'::text)) -> WindowAgg (cost=0.00..25.09 rows=6 width=36) -> Seq Scan on t4 (cost=0.00..25.00 rows=6 width=36) Filter: (dep = 'Sales'::text) (7 rows) (9.4 における結果) QUERY PLAN ------------------------------------------------------------------------------------- Subquery Scan on emp (cost=162.89..203.49 rows=6 width=44) Filter: (emp.dep = 'Sales'::text) -> WindowAgg (cost=162.89..188.99 rows=1160 width=36) -> Sort (cost=162.89..165.79 rows=1160 width=36) Sort Key: ((t4.dep || 'A'::text)), t4.dep -> WindowAgg (cost=80.64..103.84 rows=1160 width=36) -> Sort (cost=80.64..83.54 rows=1160 width=36) Sort Key: t4.dep -> Seq Scan on t4 (cost=0.00..21.60 rows=1160 width=36) (9 rows)
- LEAKPROOFでない関数を、その関数がビューの出力列を受け取らないなら、セキュリティバリアビューにプッシュダウンできるようになりました。 (Dean Rasheed) (9.5)
- プランナが、WHERE句に照合する関数の呼び出しがあったとき、真偽値を返す関数の式インデックスから得た統計情報を使うようになりました。 (Tom Lane) (9.5)
以下に例を示します。関数条件の選択率は固定値 0.3333333 で、10000行の t1 テーブルに対する予想結果行数は 3333行です。しかし、式インデックスがあると、より正確な選択率が使用されます。9.4 以前の場合、最後の explain SELECT 結果でも予想結果行数3333行となります。
db1=# explain SELECT * FROM t1 WHERE f_match(v); QUERY PLAN --------------------------------------------------------- Seq Scan on t1 (cost=0.00..2684.00 rows=3333 width=37) Filter: f_match(v) (2 rows) db1=# CREATE INDEX idx_t1_f_match ON t1 (f_match(v)); db1=# ANALYZE; db1=# explain SELECT * FROM t1 WHERE f_match(v); QUERY PLAN ---------------------------------------------------------------------------- Index Scan using idx_t1_f_match on t1 (cost=0.29..28.62 rows=62 width=37) Index Cond: (f_match(v) = true) Filter: f_match(v) (3 rows)
- ANALYZEで列のデータ型が等価関数を持たなくても基本的な統計(null比率、列の平均長)の計算をするようになりました。 (Oleksandr Shulgin) (9.5)
- CRC(巡回冗長検査)計算が高速化されました。また、CRC-32C多項式を使うようになりました。 (Abhijit Menon-Sen, Heikki Linnakangas) (9.5)
- ビットマップインデックススキャンの性能が改善されました。 (Teodor Sigaev, Tom Lane) (9.5)
- 不要なメモリコピーを避けることで CREATE INDEX が高速化されました。 (Robert Haas) (9.5)
- バッファマッピングのパーティション数が 16 から 128 に増やされました。 (Amit Kapila, Andres Freund, Robert Haas) (9.5)
これは並列性の高い負荷に対して性能を改善します。
監視
- 新たなストレージパラメータlog_min_autovacuum_duration によるテーブル単位での自動バキュームのログ制御が追加されました。 (Michael Paquier) (9.5)
- 新たな設定パラメータcluster_name が追加されました。 (Thomas Munro) (9.5)
通常 postgresql.conf に設定されるこの文字列によりクライアントはクラスタを識別できます。この名称は全サーバプロセスのプロセスタイトルにも出て、同じクラスタに属するプロセス群を識別するのを容易にします。
$ ps x PID TTY STAT TIME COMMAND 12341 pts/0 S 0:00 /home/postgres/pgsql/9.5.0/bin/postgres 12342 ? Ss 0:00 postgres: my cluster: logger process 12344 ? Ss 0:00 postgres: my cluster: checkpointer process 12345 ? Ss 0:00 postgres: my cluster: writer process 12346 ? Ss 0:00 postgres: my cluster: wal writer process 12347 ? Ss 0:00 postgres: my cluster: autovacuum launcher process 12348 ? Ss 0:00 postgres: my cluster: stats collector process 12351 ? Ss 0:00 postgres: my cluster: postgres db1 [local] idle (後略)
上記は 'my cluster' と設定した場合のプロセス名の例です。
- スーパーユーザ以外が log_disconnections を接続当初に変更できないようになりました。 (Fujii Masao) (9.5)
$ psql "user=appuser dbname=db1 options='-c log_disconnections=on'"
上記のような接続時の指定であれば一般ユーザで変更が可能でした。
- SSLサーバ証明書で存在するならサブジェクト別名(Subject Alternative Names, SANs)を確認するようになりました。 (Alexey Klyukin) (9.5)
サブジェクト別名があるならコモンネーム(Common Name)に加えて各サブジェクト別名についても確認が行われます。
- SSL接続情報を報告するシステムビュー pg_stat_ssl が追加されました。 (Magnus Hagander) (9.5)
- 実装独立の方式で SSL情報を返す libpq関数がいくつか追加されました。 (Heikki Linnakangas) (9.5)
OpenSSL関数を呼ぶ PQgetssl() 関数は未だ使用することができますが、libpq の将来バージョンは別の SSL実装に対応するかもしれないため、これからは非推奨とみなされます。可能であれば、SSL情報取得にSSL実装独立な新たな関数PQsslAttribute()、PQsslAttributeNames()、PQsslInUse() を使ってください。
- libpq であらゆる OpenSSL のスレッドコールバックを尊重するようになりました。 (Jan Urbanski) (9.5)
これまでは上書きされていました。
サーバ設定
- 設定パラメータ checkpoint_segments が min_wal_size と max_wal_size で置き換えられました。 (Heikki Linnakangas) (9.5)
この変更により、不要になった後も WALファイルを維持するという方法を取らなくとも、多数の WALファイルを割り当てできます。それゆえに、max_wal_size のデフォルトは、従来の checkpoint_segments のデフォルトよりもずっと大きい 1GB です。
また、スタンバイサーバが WAL領域の消費を max_wal_size で制限するように努めてリスタートポイント処理を実行することにも注意してください。これまでは checkpoint_segments 設定には連動していませんでした。
- Linux の OOM killer を、コンパイル時のオプション LINUX_OOM_SCORE_ADJ、LINUX_OOM_ADJ に代えて、環境変数 PG_OOM_ADJUST_FILE、PG_OOM_ADJUST_VALUE で制御するようになりました。 (Gurjeet Singh) (9.5)
これまでの OOM制御基盤はコンパイル時のオプションを必要としました。これらはサポートされなくなります。環境変数による新たな動作は(Linuxプラットフォームにおける)全てのビルドで利用できます。
- 設定パラメータ track_commit_timestamp を有効にすることで、トランザクションコミットのタイムスタンプを記録できるようになりました。 (Álvaro Herrera, Petr Jelínek) (9.5)
タイムスタンプ情報は関数 pg_xact_commit_timestamp() と pg_last_committed_xact()を使って参照できます。
- local_preload_libraries が ALTER ROLE ... SET ... で設定できるようになりました。 (Peter Eisentraut, Kyotaro Horiguchi) (9.5)
- 自動バキュームワーカが処理中に設定パラメータ変更に反応できるようになりました。 (Michael Paquier) (9.5)
- 設定パラメータ debug_assertions が読み取り専用になりました。 (Andres Freund) (9.5)
これは、コンパイル時にアサート有効にしたならもはや off にできないようにして、より効果的なコード最適化を可能にする意味があります。本変更では postgres -A オプションも削除されます。
- effective_io_concurrency を効果の無いシステムにおいても設定できるようになりました。 (Peter Eisentraut) (9.5)
これまではビルド時点で対応する機能を持たないとされたシステムでは、値を設定するとエラーをひき起こしました。
- サーバの設定ファイル内容を表示するシステムビュー pg_file_settings が追加されました。 (Sawada Masahiko) (9.5)
システムビュー pg_settings に、変更されたけれどもデータベース再起動まで反映されない内容があるかを示す pending_restart列が追加されました。
ALTER SYSTEM にて設定値を ALTER SYSTEM RESET でリセットできるようになりました。
レプリケーションとリカバリ
- レプリケーション進行を観測する仕組みを追加しました。ロジカルレプリケーションで個々の変更の起点を識別する方法も含まれます。 (Andres Freund) (9.5)
pg_replication_* という名称の関数やシステムビューがいくつか追加されています。レプリケーションスロットを使用しているときに役立ちます。
- マルチトランザクションのコミットログの切り捨て処理を適切にWAL記録されるように作り直されました。 (Andres Freund) (9.5)
コードがより単純でより頑健になりました。
- リカバリ後の動作を制御する recovery.conf パラメータ recovery_target_action が追加されました。 (Petr Jelínek) (9.5)
これは旧来のパラメータ pause_at_recovery_target を置き換えます。
- archive_mode の新しい値 always が追加されました。 (Fujii Masao) (9.5)
always の場合、スタンバイ動作やリカバリ中であっても受け取った WAL ファイルをアーカイブするようになります。
- WAL読み込みの失敗したあとのリトライを制御する設定パラメータwal_retrieve_retry_interval が追加されました。 (Alexey Vasiliev, Michael Paquier) (9.5)
これは特にウォームスタンバイ構成のとき役立ちます。
- WALにフルページイメージを圧縮して格納できるようになりました。 (Rahila Syed, Michael Paquier) (9.5)
この機能を使うと WAL記録とWAL再生に余計に CPU時間を費やされる一方、WAL量を減らすことができます。新たな設定パラメータwal_compression で制御します。今のところデフォルトは off です。
- スタンバイが昇格するとき、WALファイルを .partialサフィックスと共にアーカイブするようになりました。 (Heikki Linnakangas) (9.5)
- レプリケーション命令をログ記録する設定パラメータ log_replication_commands が追加されました。 (Fujii Masao) (9.5)
デフォルトでは IDENTIFY_SYSTEM などのレプリケーション命令はたとえ log_statement を all に設定してもログ記録されません
- レプリケーションスロットを保持しているプロセスを pg_replication_slots で報告するようになりました。 (Craig Ringer) (9.5)
active_pid 列が追加されています。
- recovery.conf の primary_conninfo設定で接続URI(例: postgres://)が使えるようになりました。 (Alexander Shulgin) (9.5)
問い合わせ
- INSERT で制約違反が生じたのを UPDATE に転換したり、無視したりできるようになりました。 (Peter Geoghegan, Heikki Linnakangas, Andres Freund) (9.5)
INSERT ... ON CONFLICT DO NOTHING/UPDATE という構文が追加されました。これは人気のある UPSERT命令の PostgreSQL における実装となります。
- GROUP BY 分析機能に GROUPING SETS、CUBE、ROLLUP が加わりました。 (Andrew Gierth, Atri Sharma) (9.5)
- UPDATE で複数対象カラムに一つの副問い合わせ結果から値を設定できるようになりました。(Tom Lane) (9.5)
UPDATE tab SET (col1, col2, ...) = (SELECT ...) という構文で実現されます。
- ロックされた行を読み飛ばす SELECT のオプション SKIP LOCKED が追加されました。 (Thomas Munro) (9.5)
NOWAIT のようにロック行に対してエラーを出すことはありません。
- テーブルの部分集合を返す SELECT のオプション TABLESAMPLE が追加されました。 (Petr Jelínek) (9.5)
この機能は SQL標準のテーブルサンプリング方式をサポートします。加えて、ユーザ定義のサンプリング方式に対応しています。
- ミスタイプしたカラム名に対してエラーメッセージにてヒントが表示されるようになりました。 (Peter Geoghegan, Robert Haas) (9.5)
ユーティリティコマンド
- EXPLAIN がソート順についてより詳細に出力するようになりました。 (Marius Timmer, Lukas Kreft, Arne Scheffer) (9.5)
出力に COLLATE、DESC、USING および NULLS FIRST/LAST が含まれます。
- VACUUM がピンのために読み飛ばしたページ数をログ出力するようになりました。 (Jim Nasby) (9.5)
- TRUNCATE が pg_stat* タプルカウンタを適切に更新するようになりました。 (Alexander Shulgin) (9.5)
REINDEX
- REINDEX が SCHEMAオプションでスキーマ全体についてインデックス再作成できるようになりました。 (Sawada Masahiko) (9.5)
- REINDEX に VERBOSE オプションが追加されました。 (Sawada Masahiko) (9.5)
- REINDEX DATABASE/SCHEMA で、VERBOSE が使われない限り、オブジェクト名を出力しないようになりました。 (Simon Riggs) (9.5)
- REINDEX から現在用いられない FORCEオプションが取り除かれました。 (Fujii Masao) (9.5)
オブジェクト操作
- 行レベルセキュリティ制御が加わりました。 (Craig Ringer, KaiGai Kohei, Adam Brightwell, Dean Rasheed, Stephen Frost) (9.5)
本機能は、あるテーブルに対しどのユーザが追加、変更、参照できるかの行ごとの制御を可能にします。新しい命令 CREATE/ALTER/DROP POLICY、ALTER TABLE ... ENABLE/DISABLE ROW SECURITY によって制御されます。
- テーブルを作った後に ALTER TABLE ... SET LOGGED / UNLOGGED で WAL書き出し状態を変更できるようになりました。 (Fabrízio de Royes Mello) (9.5)
- CREATE TABLE AS、CREATE INDEX、CREATE SEQUENCE、および、CREATE MATERIALIZED VIEW に IF NOT EXISTS 句が追加されました。 (Fabrízio de Royes Mello) (9.5)
- ALTER TABLE ... RENAME CONSTRAINT が IF EXISTS に対応しました。 (Bruce Momjian) (9.5)
- いくつかの DDL命令でユーザ名を指定する箇所にカレントユーザ、セッションユーザの意味で CURRENT_USER、SESSION_USER を使用できるようになりました。 (Kyotaro Horiguchi, Álvaro Herrera) (9.5)
現在、ALTER USER、ALTER GROUP、ALTER ROLE、GRANT、および、ALTER object OWNER TO の各命令にて対応しています。
- ドメインの制約へのコメントに対応しました。 (Álvaro Herrera) (9.5)
- トリガ/外部キーを作成/変更する命令のいくつかでロックレベルが下がりました。 (Simon Riggs, Andreas Karlsson) (9.5)
- 対象テーブルに対する INSERT権限で LOCK TABLE ... ROW EXCLUSIVE MODE が可能になりました。 (Stephen Frost) (9.5)
これまでこの命令は UPDATE、DELETE、TRUNCATE のいずれか権限が必要でした。
- テーブルとドメインで CHECK制約を名前順に適用するようになりました。 (Tom Lane) (9.5)
これまでは順番は不確定でした。
- CREATE/ALTER DATABASE で datistemplate と datallowconn が操作可能になりました。 (Vik Fearing) (9.5)
CREATE/ALTER DATABASE に IS_TEMPLATE(テンプレートである)、ALLOW_CONNECTIONS(接続を許す)というオプションが加わります。これによりシステムカタログ pg_database の手動操作なしにこれらデータベースごとの設定を変更できます。
外部テーブル
- IMPORT FOREIGN SCHEMA 命令が追加されました。 (Ronan Dunklau, Michael Paquier, Tom Lane) (9.5)
この命令はリモートサーバに在るテーブル群に対応したローカルの外部テーブルを自動で作成します。
- CHECK制約を外部テーブルに置けるようになりました。 (Shigeru Hanada, Etsuro Fujita) (9.5)
外部テーブルに対するチェック制約を設定しても、実際に値を検査する動作は行われません。しかしながら、「制約による排除」などの問い合わ
- 外部テーブルが継承に参加できるようになりました。 (Shigeru Hanada, Etsuro Fujita) (9.5)
これを自然に働かせるため、実際には外部テーブルに対して効果の無い操作であるとしても、外部テーブルが無効なチェック制約を持てるように、また、ストレージと OID属性の設定も可能となりました。
- 外部データラッパとカスタムスキャンで結合プッシュダウンの実装が可能になりました。 (KaiGai Kohei) (9.5)
イベントトリガ
- ddl_command_end イベントトリガが導入されたときは常に DDL動作の調査するための詳細を取得するようになりました。 (Álvaro Herrera) (9.5)
この情報は集合を返す関数 pg_event_trigger_ddl_commands() で、あるいはそれでは不十分であるなら C言語データ構造の解析を通して利用できます。
- テーブルのイベントトリガが ALTER TABLE で書換え可能になりました。 (Dimitri Fontaine) (9.5)
- データベースレベルの COMMENT、SECURITY LABEL、および、GRANT/REVOKE のイベントトリガに対応しました。 (Álvaro Herrera) (9.5)
- pg_event_trigger_dropped_objects の出力列をいくつか追加しました。 (Álvaro Herrera) (9.5)
これにより削除操作の処理を容易にします。
データ型
- xmlデータ型が空もしくは全て空白文字の内容を受け入れできるようになりました。 (Peter Eisentraut) (9.5)
これはSQL/XML仕様で必要とされています。
- macaddr型の入力に「xxxx-xxxx-xxxx」形式が使えるようになりました。 (Herwin Weststrate) (9.5)
- interval型で精度とフィールド定義について非SQL標準の構文が禁止されました。 (Bruce Momjian) (9.5)
標準では、このような型定義は、例えば INTERVAL MINUTE TO SECOND(2) というように書かなければいけません。PostgreSQL はこれまで INTERVAL(2) MINUTE TO SECOND と書くことを許していましたが、これからは標準の方法で書かなければいけません。
- inet型、cidr型に対する演算子の選択率見積関数が追加されました。また、テキスト検索関数の見積関数について改善されました。 (Emre Hasegeli, Tom Lane) (9.5)
- ロールや名前空間の OID 入力や、見栄えよい表示を簡単にするためのデータ型 regrole、regnamespace が追加されました。 (Kyotaro Horiguchi) (9.5)
JSON
- jsonb関数 jsonb_set()、jsonb_pretty() が追加されました。 (Dmitry Dolgov, Andrew Dunstan, Petr Jelínek) (9.5)
- jsonb生成関数 to_jsonb()、jsonb_object()、jsonb_build_object()、jsonb_build_array()、jsonb_agg()、jsonb_object_agg() が追加されました。 (Andrew Dunstan) (9.5)
json型むけには同等の関数が既にありました。
- jsonb型、json型の間の明示的なキャストの必要性が減りました。 (Tom Lane) (9.5)
- jsonb から、text、text配列、integer の値を引き算できるようになりました。 (Dmitry Dolgov, Andrew Dunstan) (9.5)
- jsonb 用の || 演算子が追加されました。 (Dmitry Dolgov, Andrew Dunstan) (9.5)
- JSONのヌル値をJSONドキュメントから取り除く関数 json_strip_nulls()、jsonb_strip_nulls() が追加されました。 (Andrew Dunstan) (9.5)
関数
- numeric 値の generate_series() が追加されました。 (Plato Malugin) (9.5)
- array_agg() と ARRAY() が入力に配列を取れるようになりました。 (Ali Akbar, Tom Lane) (9.5)
- 配列の添え字を返す関数 array_position()、array_positions() が追加されました。 (Pavel Stehule) (9.5)
- point と polygon の距離演算子 <-> が追加されました。 (Alexander Korotkov) (9.5)
- SIMILAR TO と SUBSTRING でマルチバイト文字のエスケープが可能になりました。 (Jeff Davis) (9.5)
これまではシングルバイト文字のみエスケープとして使用可能でした。
- 任意のソート可能なデータ型と、一様でないバケット幅に対応した、width_bucket()の別形が追加されました。 (Petr Jelínek) (9.5)
- pg_read_file() や関連の関数にオプション引数 missing_ok が追加されました。 (Michael Paquier, Heikki Linnakangas) (9.5)
- 関数呼び出しで => で名前のついたパラメータを指定できるようになりました。 (Pavel Stehule) (9.5)
これまでは := だけが利用できました。これにより => がユーザ定義演算子である可能性を排除することが必要となります。ユーザ定義演算子 => の作成では PostgreSQL 9.0 から警告が出ていました。
- PostgreSQL による丸め関数を使うプラットフォームに POSIX 準拠の丸め処理が追加されました。 (Pedro Gimeno Fortea) (9.5)
システム情報関数
- オブジェクトを識別する OID を返す関数 pg_get_object_address()、OID に基づきオブジェクト情報を返す関数 pg_identify_object_as_address() が追加されました。 (Álvaro Herrera) (9.5)
- pg_stat_activity のビュー問い合わせ、pg_cancel_backend() の実行、pg_terminate_backend() の実行において、セキュリティチェックが緩められました。 (Stephen Frost) (9.5)
これまでは対象のセッションを所有している特定のロールだけがこれら操作を実行できました。これからはこれらロールのメンバーであれば十分とします。
- 統計スナップショットのタイムスタンプを出力する関数 pg_stat_get_snapshot_timestamp() が追加されました。 (Matt Kelly) (9.5)
- マルチトランザクションID の年代を計算する関数 mxid_age() が追加されました。 (Bruce Momjian) (9.5)
集約関数
- inet / cidr データ型に対する min() / max() 集約が追加されました。 (Haribabu Kommi) (9.5)
- いくつかの集約関数でサポートされているなら累算器に128ビット整数を使うようになりました。 (Andreas Karlsson) (9.5)
サーバサイド言語
- PL/Python で複合型への対応が改善されました。 (Ed Behn, Ronan Dunklau) (9.5)
これにより PL/Python 関数が複合型の配列を返せるようになります。
- PL/Python の浮動小数点値の変換でデータ損失が減りました。 (Marko Kreen) (9.5)
- SQLデータ型と手続き言語のデータ型との変換処理が定義可能になりました。 (Peter Eisentraut) (9.5)
この変更で新たな命令 CREATE/DROP TRANSFORM が加わります。また、hstore型、ltree型への、あるいはこれら型からの、PL/Perl および PL/Pythonとの任意選択の変換も追加されます。
PL/pgSQLサーバサイド言語
- PL/pgSQL 配列の性能が改善されました。 (Tom Lane) (9.5)
- PL/pgSQL に ASSERT文が追加されました。 (Pavel Stehule) (9.5)
- より多くの PL/pgSQLキーワードが識別子として使用可能になりました。 (Tom Lane) (9.5)
クライアントアプリケーション
- pg_archivecleanup、pg_test_fsync、pg_test_timing、pg_xlogdump が contrib から src/bin に移動しました。 (Peter Eisentraut) (9.5)
これらプログラムはほとんどのインストールでデフォルトで導入されるようになります。
- フェイルバック後にマスタサーバを再同期させることができる、pg_rewind が追加されました。 (Heikki Linnakangas) (9.5)
- pg_receivexlog で物理レプリケーションスロットを管理できるようになりました。 (Michael Paquier) (9.5)
新たなオプション --create-slot、--drop-slot により制御します。
- 新たな --synchronous オプションで pg_receivexlog が WAL を同期書き込みできるようになりました。 (Furuya Osamu, Fujii Masao) (9.5)
このオプションが無いと、WALファイルはクローズ時しか fsyncされません。
- 新たなオプション --jobs により vacuumdb が並列にバキュームできるようになりました。 (Dilip Kumar) (9.5)
- vacuumdb で複数の接続が必要であるとき、同じパスワードの入力を繰り返しプロンプトで要求しないようになりました。 (Haribabu Kommi, Michael Paquier) (9.5)
- reindexdb に --verbose オプションが追加されました。 (Sawada Masahiko) (9.5)
- MS Windows 上で、pg_basebackup が tarフォーマットのときテーブル空間マッピングファイルを使い、シンボリックリンクと100文字以上の長さのファイルパスに対応しました。 (Amit Kapila) (9.5)
- pg_xlogdump におおまかな統計を表示するオプション --stats が追加されました。 (Abhijit Menon-Sen) (9.5)
psql
- psql で AsciiDoc を出力できるようになりました。 (Szymon Guz) (9.5)
- psql の ECHO変数に失敗した命令だけ表示する errorsモードが追加されました。 (Pavel Stehule) (9.5)
この振る舞いは psql の -b オプションでも指定できます。
- psql の unicode linestyle で、カラム区切り、ヘッダ、境界線の制御ができるようになりました。 (Pavel Stehule) (9.5)
一重線または二重線に対応しています。デフォルトは一重線(single)です。
- psql の PROMPT変数に複数行にわたる文の現在の行番号を表示する新オプション %l が追加されました。 (Sawada Masahiko) (9.5)
- psetオプションにページャ起動を制御する pager_min_lines が追加されました。 (Andrew Dunstan) (9.5)
- ページャ起動を判断するときに使われる psql の行数カウントが改善されました。 (Andrew Dunstan) (9.5)
- --output または --log-file で指定されたファイルに書き込みできない場合、psql は失敗するようになります。 (Tom Lane, Daniel Verite) (9.5)
これまで、このようなケースでは事実上指定が無視されていました。
- search_path を設定するときの psqlタブ補完が追加されました。 (Jeff Janes) (9.5)
今のところ最初のスキーマのみタブ補完できます。
- トリガとルールについて psql のタブ補完が改善されました。 (Andreas Karlsson) (9.5)
psqlバックスラッシュコマンド
- psql の ? ヘルプに variables と options のセクションが追加されました。 (Pavel Stehule) (9.5)
? variables は psql の特別変数一覧を、? options はコマンドラインオプション一覧を表示します。? commands は、従来の出力で現在もデフォルトとなっているメタコマンド一覧を表示します。これらのヘルプはコマンドラインオプション「--help=セクション名」でも得られます。
- psql の db+ でテーブルスペースサイズが表示されるようになりました。 (Fabrízio de Royes Mello) (9.5)
- psql の dT+ でデータ型の所有者が表示されるようになりました。 (Magnus Hagander) (9.5)
- psql の watch で iming の情報を出力できるようになりました。 (Fujii Masao) (9.5)
また、--echo-hidden 指定のときには watch 問い合わせのエコー出力がなくなりました。
- psql の sf、ef コマンドが ECHO_HIDDEN を尊重するようになりました。 (Andrew Dunstan) (9.5)
- psql の set、unset、および、:variable(変数参照)に対するタブ補完が改善されました。 (Pavel Stehule) (9.5)
- psql の c コマンドでロール名のタブ補完が可能になりました。 (Ian Barwick) (9.5)
pg_dump
- pg_dump が --snapshot オプションで他セッションとスナップショットを共有できるようになりました。 (Simon Riggs, Michael Paquier) (9.5)
pg_export_snapshot() またはロジカルレプリケーションスロットの作成によりエクスポートされたスナップショットを指定できます。これは複数の pg_dumpプロセス間で一貫したスナップショットを共有するのに使えます。
- tarアーカイブフォーマットにおいて 8GB を超えるサイズのテーブルに対応しました。 (Tom Lane) (9.5)
tarフォーマットの POSIX標準では 8GB を超える tarアーカイブの要素を許可していませんが、ほとんどの近代的な tar の実装ではこれを可能とする拡張をサポートしています。
必要なら拡張フォーマットを使用するようになります。
- pg_dump が常にサーバと pg_dump のバージョンを表示するようになりました。 (Jing Wang) (9.5)
これまでは --verbose モードのときだけバージョン情報が表示されていました。
- 永らく無視されてきた -i / --ignore-version オプションが pg_dump、pg_dumpall、pg_restore から除去されました。 (Fujii Masao) (9.5)
pg_ctl
- pg_ctl で複数の -o オプションに対応しました。これらの値は連結されます。 (Bruce Momjian) (9.5)
- MS Windows でのログ出力において、pg_ctl のイベントソースを制御できるようになりました。 (MauMau) (9.5)
これは別に postgresql.conf に設定を持つサーバではなく、pg_ctl のみ制御します。
- サーバの監視するアドレスにワイルドカード値(IPv4では 0.0.0.0、IPv6では ::)が設定された場合、pg_ctl は文字通りにワイルドカードアドレスを試みるのではなくループバックアドレスを使用します。 (Kondo Yuta) (9.5)
この修正は主にWindowsに影響を及ぼします。他のプラットフォームでは pg_ctl のローカル接続は Unixドメインソケットを使うことを優先します。
pg_upgrade
- pg_upgrade が contrib から src/bin に移動しました。 (Peter Eisentraut) (9.5)
この変更に関連して、pg_upgrade_supportモジュールで提供されていた機能はサーバコアに移動されました。
- pg_upgrade で複数の -o / -O オプションに対応しました。これらの値は連結されます。 (Bruce Momjian) (9.5)
- pg_upgrade におけるデータベースのロケール設定の確認が改善されました。 (Heikki Linnakangas) (9.5)
- pg_upgrade は 8.3クラスタからのアップグレードをサポートしなくなりました。 (Bruce Momjian) (9.5)
pgbench
- pgbench が contrib から src/bin に移動しました。 (Peter Eisentraut) (9.5)
- 「excluding connections establishing」のTPS値の計算が修正されました。 (Tatsuo Ishii, Fabien Coelho) (9.5)
pgbenchのスレッド数がクライアント接続数よりも少ないときには常に接続確立のオーバーヘッドが誤計算されていました。これは明らかにバグですが、TPS値がこれまでの結果と比較できなくなるため、9.5より前のバージョンへの修正は行われません。
- 指定時間以上要した pgbenchトランザクションをカウントできるようになりました。 (Fabien Coelho) (9.5)
これは新たなオプション --latency-limit で制御されます。
- pgbenchの setrandom で正規分布/指数分布による生成が可能になりました。 (Kondo Mitsumasa, Fabien Coelho) (9.5)
- pgbench の set 命令で複数の演算子を含む算術演算を扱えるようになりました。また、サポートされる演算子に %(剰余) が加わりました。 (Robert Haas, Fabien Coelho) (9.5)
ソースコード
- WALレコードフォーマットが単純になりました。 (Heikki Linnakangas) (9.5)
これにより外部ツールがどのブロックが変更されたかをより容易に追跡できます。
- トランザクションコミットとアボートのWAL記録の表現が改善されました。 (Andres Freund) (9.5)
- 原子的メモリ操作の API が追加されました。 (Andres Freund) (9.5)
- カスタムパス、カスタムスキャン方式が可能になりました。 (KaiGai Kohei, Tom Lane) (9.5)
これにより拡張でオプティマイザとエグゼキュータをより大幅に制御できます。
- 外部データラッパでフィルタ後のロックが可能になりました。 (Etsuro Fujita) (9.5)
- 外部テーブルを INSERT ... ON CONFLICT DO NOTHING 問い合わせに含めることができます。 (Peter Geoghegan, Heikki Linnakangas, Andres Freund) (9.5)
これを扱えるようにするため外部テーブルラッパの修正が必要です。外部テーブルに対する INSERT ... ON CONFLICT DO UPDATE はサポートされません。
- hash_create() のシンプルバイナリキーハッシュ関数を選ぶ API が改善されました。 (Teodor Sigaev, Tom Lane) (9.5)
- 並列実行基盤が改善されました。 (Robert Haas, Amit Kapila, Noah Misch, Rushabh Lathia, Jeevan Chalke) (9.5)
- Alpha (CPU)、Tru64 (OS) への移植が削除されました。 (Andres Freund) (9.5)
- ARMv5 とより古い CPU むけのスワップバイト命令によるスピンロック実装が削除されました。 (Robert Haas) (9.5)
ARMv5の弱いメモリ順序付けではこのロック実装は安全ではありません。アトミックに対応した新しいgcc実装にてスピンロック対応は依然として可能です。
- 極端に長い(100文字超)ファイルパスが tar ファイルに書かれたときエラーを出します。 (Peter Eisentraut) (9.5)
tar はこのような長すぎるパスに対応しません。
- カラム pg_seclabel.provider、pg_shseclabel.provider のインデックス演算子クラスが text_pattern_ops に変更されました。 (Tom Lane) (9.5)
これは、異なるデフォルト照合順序をもつクラスタの別データベースで、これらインデックスが問題を惹き起こすことを防ぎます。
- スピンロックを実現する基本命令がコンパイラのバリア機能に変更されました。 (Robert Haas) (9.5)
ソースコード (Windows)
- Windows 8、Windows Server 2012、および以降の Windows systems で高精度タイムスタンプが可能となりました。 (Craig Ringer) (9.5)
- MS Windows では共有ライブラリを bin にインストールします。 (Peter Eisentraut, Michael Paquier) (9.5)
- MSVCビルドでは src/test/modules を contrib と一緒にインストールします。 (Michael Paquier) (9.5)
- configure の --with-extra-version オプションを MSVCビルドでも受け付けるようになりました。 (Michael Paquier) (9.5)
- PGFILEDESC を MSVC contribビルドに渡します。 (Michael Paquier) (9.5)
- 全ての MSVC ビルドされたバイナリにはアイコンが、また、全ての Windows バイナリにバージョン情報が添加されます。 (Noah Misch) (9.5)
MinGW では既にそのようにアイコンが与えられていました。
- getopt_long() 内部実装にオプション引数対応が加わりました。 (Michael Paquier, Andres Freund) (9.5)
これは MSVC で使われます。
追加モジュール
- pg_stat_statements に時間の最小、最大、平均、標準偏差の統計が追加されました。 (Mitsumasa Kondo, Andrew Dunstan) (9.5)
- pgcrypto に PGP Armorヘッダから抽出をする pgp_armor_headers()関数が加わりました。 (Marko Tiikkaja, Heikki Linnakangas) (9.5)
- unaccent で空の置き換え文字列が可能となりました。 (Mohammad Alhashash) (9.5)
これは発音区別記号が複数文字に分かれて表現される言語で有用です。
- unaccent で複数文字からなる変換元文字が可能になりました。 (Tom Lane) (9.5)
これは発音区別記号が複数文字に分かれて表現される言語で有用です。また、より複雑なunaccent辞書も可能にします。
- 追加的なテーブルサンプリング方式を可能とする contribモジュール tsm_system_rows、tsm_system_time が追加されました。 (Petr Jelínek) (9.5)
- pageinspectモジュールに GINインデックスを解析する関数が追加されました。 (Heikki Linnakangas, Peter Geoghegan, Michael Paquier) (9.5)
- pg_buffercache の表示にバッファピンについての情報が追加されました。 (Andres Freund) (9.5)
- pgstattuple が pgstattuple_approx() でより少ない負荷でおおよその答えを報告できるようになりました。 (Abhijit Menon-Sen) (9.5)
- dummy_seclabel、test_shm_mq、test_parser、および、worker_spi が、contrib から src/test/modules に移動しました。 (Álvaro Herrera) (9.5)
これらモジュールはサーバテストだけのためのものであって、PostgreSQL をパッケージングする際のビルドやインストールでは必要とされません。