
このページでは PostgreSQL 9.4 (2014年12月18日リリース)に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
バージョン 9.4 への移行/互換性のない変更点
- 多次元配列の入力チェックが厳格になりました。(Bruce Momjian) (9.4)
これまでは以下のようなデータが受け入れられていましたが、9.4 からは、
要素数が揃っていないとエラー( ERROR: malformed array literal )となります。
db=# SELECT '{{1}, {2,3}}'::int[]; int4 ------------------ {{1,NULL},{2,3}} (1 row)
9.3 以前から、以下のように要素数の多い副配列が先にあらわれるとエラーになっていましたので、
9.4 で一貫性のある振る舞いになったといえます。
=# SELECT '{{1,2,3}, {2,3}}'::int[]; ERROR: multidimensional arrays must have array expressions with matching dimensions
これまでは JSON へ整形する文字列中の全てのバックスラッシュは、エスケープされていました。9.4 から、u と 16進数4桁 が後に続くバックスラッシュはエスケープされません。
(元の文字列) db1=# INSERT INTO t1 VALUES (1, 'u00aa and '); db1=# SELECT * FROM t1; id | v ----+--------------- 1 | u00aa and (1 row) (9.4 で JSON に変換) db1=# SELECT row_to_json(t1.*) FROM t1; row_to_json ------------------------------- {"id":1,"v":"u00aa and \ "} (1 row) (9.3 で JSON に変換) =# SELECT row_to_json(t1.*) FROM t1; row_to_json -------------------------------- {"id":1,"v":"\u00aa and \ "} (1 row)
これまでは DateStyle 設定に基づく PostgreSQL の表現形式にて変換していました。必要であれば、JSON変換関数に渡す前に日付時刻値を text 型に明示的にキャストすることで以前の振る舞いを実現できます。
(9.4 で JSON に変換) db1=# SELECT to_json(now()); to_json ------------------------------------ "2014-12-19T20:56:34.995251+09:00" (1 row) (9.3 で JSON に変換) db1=# SELECT to_json(now()); to_json --------------------------------- "2014-12-19 20:56:40.868847+09" (1 row)
抽出の適用を全くしないという意味で一貫性のある振る舞いとなります。
(通常の使われ方) db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{A,X}'::text[]; ?column? ---------- 100 (1 row) (9.4 で空配列を与えると左辺値全体が返る) db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{}'::text[]; ?column? --------------------------------- {"A":{"X":100,"Y":200},"B":"b"} (1 row) (9.3 で空配列を与えると NULL が返る) db1=# SELECT '{"A":{"X":100,"Y":200},"B":"b"}'::json #> '{}'::text[]; ?column? ---------- (1 row)
一貫性がある振る舞いであるほか、左辺が妥当な JSONデータである限り、決してエラーにならないことで式インデックスを安全に作れるようになります。
(9.3 での実行例。9.4 では NULL が返り、エラーにはならない) db1=# SELECT '["a", "b"]'::json -> 'a'; ERROR: cannot extract field from a non-object
これまでは FXモード以外では書式中の連続空白は、単一の空白と同様に振る舞っていました。
(9.3 の場合、書式に 'DD Mon YYYY' が指定されたのと同じ扱い) db1=# SELECT to_timestamp('05 Dec 2014', 'DD Mon YYYY'); ERROR: invalid value "Ec " for "Mon" (9.4 の場合) db1=# SELECT to_timestamp('05 Dec 2014', 'DD Mon YYYY'); to_timestamp ------------------------ 2014-12-05 00:00:00+09 (1 row)
これまでは、位置と重みの情報を除去された語彙素がデフォルト位置にあるかのように扱われていて、有用性が疑わしいランク値を生成していました。
バージョンアップにより、同じ条件でも ts_rank_cd() が返すランク値が変る可能性があります。
引数に修飾のない文字列リテラルや NULL を指定できなくなりました。適切な配列データ型にキャストすることが必要となります。なお、VARIADIC でない引数については従来から変更ありません。
また、9.3 以前でも 9.4 でも引数に "any" が使えるのは C言語関数のみとなります。
row_to_json(tab.*) などで出力されるカラム名に呼び出し時点のカラム別名が使われるようになります。これまで、SQLで与えられた別名でなくテーブルの本当のカラム名が使われてしまうことがしばしばありました。
DISCARD ALL または DISCARD SEQUENCE コマンドを実行すると、保持している curval()、lastval() で返すための値が破棄されます。
他に「Planning time」も出力するため、プラン時間を含まないにも関わらず「total runtime」とするのは混乱を招きそうであるため、変更されました。
これまでは interval型の形式で出力していました。なお、差分時間でなく 'Japan' など、時間帯名で指定されていた場合には、従来通り、そのまま時間帯名が出力されます。
また、本変更は SHOW TimeZone 、SET TimeZone という書き方をした場合も同様に適用されています。
db1=# SET TIME ZONE '+9'; (9.3 の場合) db1=# SHOW TIME ZONE; TimeZone ---------- 09:00:00 (1 row) (9.4 の場合) db1=# SHOW TIME ZONE; TimeZone ---------- <+09>-09 (1 row)
AFTER 行トリガーがある場合、トリガが読むかもしれないので、更新動作でテーブルの全カラムを返さなければいけません。これまで外部テーブルはトリガーを持てませんでしたので、外部テーブルラッパーで RETURNING 節を考慮しない最適化をしているかもしれません。
これまで許されていましたが、リストア時にエラーをひき起こしていました。
recovery_target や recovery_target_xxx という設定項目が該当します。これまでは優先順位が文書化されていませんでした。
archive_command、restore_command、COPY TO/FROM PROGRAM、あるいは pgbench の shell に与えるコマンド文字列が本変更の対象となります。ダブルクオートを維持するために "" と記述していた
部分が " で済むことになり、コマンド文字列を修正する必要があります。
カラム単位のルールは PostgreSQL 7.3 以来サポートされておらず、不要な項目でした。
ビルド時に --with-krb5 を指定し、pg_hba.conf の認証メソッドに krb5 を指定する方式が廃止となります。本方式は PostgreSQL 8.3 以来、非推奨である旨が告知されていました。代替に GSSAPI認証を使う設定をして Kerberos認証を使うことができます。
従来は文字列として扱われていました。
従来は、一部のパラメータに限って、空文字列がデフォルトを使うという意味に解釈されていました。
従来は空配列は長さゼロの 1次元配列が返っていました。テキスト表現ではいずれも「{}」であって違いありませんが、配列操作に対する振る舞いが異なります。
本変更は組み込みの配列演算子と振る舞いを揃えるものです。
db1=# SELECT '{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[]; ?column? ---------- {} (1 row) (9.3 の場合) db1=# SELECT array_dims('{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[]); array_dims ------------ [1:0] (1 row) (9.4 の場合) db1=# SELECT array_dims('{{1,2},{3,4}}'::int[] - '{1,2,3,4}'::int[]); array_dims ------------ (1 row)
従来は -u と --user でしたが、他のツールとの一貫性に欠けていました。
バージョン 9.4 の変更点
サーバの変更
- バックグラウンドワーカプロセスを動的に登録、開始、終了できるようになりました。(Robert Haas) (9.4)
- 共有メモリセグメントを動的に割り当てできるようになりました。(Robert Haas, Amit Kapila) (9.4)
- クラッシュリカバリ、あるいは immediate シャットダウンの際に、即座に停止しない子プロセスに KILL シグナル送るようになりました。(MauMau, Álvaro Herrera) (9.4)
- データベースのシステム識別子のランダム性が改善されました。(Tom Lane) (9.4)
- VACUUM が、削除済(dead)状態だがまだ除去できない行について統計情報収集プロセスに適切に報告するようになりました。(Hari Babu) (9.4)
worker_spi 拡張モジュールで本仕様の使用方法が例示されています。
test_shm_mq 拡張モジュールで本仕様の使用方法が例示されています。
これにより、シャットダウン後に子プロセスが残ってしまう可能性を減らし、また、いくつかの子プロセスが止まってしまった場合でもクラッシュリカバリを確実に進められるようにします
システム識別子はストリーミングレプリケーションプロトコルにて使われます。
これまでは有効(live)行であるものと報告されていました。
インデックスの変更
- GINインデックスの物理サイズが減少しました。(Alexander Korotkov, Heikki Linnakangas) (9.4)
- 複合キーでの GINインデックス照会の速度が改善されました。(Alexander Korotkov, Heikki Linnakangas) (9.4)
- GiST インデックスが inet型、cidr型に対応しました。(Emre Hasegeli) (9.4)
- B-tree インデックスのページ削除における稀な競合状態が修正されました。(Heikki Linnakangas) (9.4)
- 割り込みされた B-tree インデックスのページ分割処理の扱いがより頑健になりました。(Heikki Linnakangas) (9.4)
pg_upgrade を使ってアップグレードした場合、動作しますが、従来のサイズの大きい GIN 形式のままです。REINDEX で新たな形式でインデックスを作り直す必要があります。
これらのインデックスは、サブネット・スーパーネットの照会や並べ替えのための比較を性能向上させます。
一般的なパフォーマンス
- 複数のバックエンドプロセスから WALバッファに同時並列に書き込みできるようになりました。(Heikki Linnakangas) (9.4)
- 条件によっては WAL に更新行のうち変更された部分だけを書き込むようになりました。(Amit Kapila) (9.4)
- WINDOW関数として使われる集約関数の性能が改善されました。(David Rowley, Florian Pflug, Tom Lane) (9.4)
- numeric型を状態値に使う集約処理の性能が改善されました。(Hadi Moshayedi) (9.4)
- テーブルが CLUSTER または VACUUM FULL コマンドで書き直されたときにタプルを凍結しようとするようになりました。(Robert Haas, Andres Freund) (9.4)
- デフォルトがシーケンスの nextval() であるカラムに対する COPY の速度が改善されました。(Simon Riggs) (9.4)
- 一つの接続で多数のシーケンスにアクセスする場合の性能が改善されました。(David Rowley) (9.4)
- メモリ上でソートやインデックス構築をする際のタプル数の固定上限が拡大されました。(Noah Misch) (9.4)
- PL/pgSQL 手続き言語の DO ブロックによるメモリ割り当てが小さくなりました。(Tom Lane) (9.4)
- プランナが AND/OR 節が混在する中から、より積極的に制約節を抽出するようになりました。(Tom Lane) (9.4)
- プランナが、揮発性の WHERE節を DISTINCT サブクエリにプッシュダウンしないようになりました。(Tom Lane) (9.4)
本変更は並列書き込み性能を改善します。
結果として WAL出力量が圧縮されます。
これにより、後でタプルをフリーズするのを避けることができます。
WHERE 節のプッシュダウンは概してプラン改善に効果的ですが、クエリによっては節の評価がより頻繁でコストとなると推定されます。そのため、節が VOLATILE 関数を含むときにはプッシュダウンを実施しません。
プッシュダウンとは、より末端で条件を適用するようにすることで、以下のようなクエリに対して、 SELECT * FROM (SELECT * FROM t6 JOIN t7 USING (id)) v WHERE c = 1; 以下のようなプランではなく、 QUERY PLAN ------------------------------------ Hash Join Hash Cond: (t6.id = t7.id) Join Filter: (t6.c = 1) -> Seq Scan on t7 -> Hash -> Seq Scan on t6 (6 rows) 以下のようなプランにすることを指す。 QUERY PLAN -------------------------------------- Nested Loop -> Seq Scan on t6 Filter: (c = 1) -> Index Scan using t7_pkey on t7 Index Cond: (id = t6.id) (5 rows)
少数のテーブルにだけアクセスする接続に対してメモリ消費を減らします、また、多数のテーブルにアクセスする接続に対しては性能を向上させます。
モニタリング
- WALアーカイバの活動を報告する pg_stat_archiver システムビューが追加されました。(Gabriele Bartolini) (9.4)
- n_mod_since_analyze カラムが pg_stat_all_tables ほか関連するシステムビューに追加されました。(Mark Kirkwood) (9.4)
- backend_xid カラム、backend_xmin カラムが、pg_stat_activity に追加され、backend_xmin カラムが pg_stat_replication に追加されました。(Christian Kruse) (9.4)
本カラムは ANALYZE が行われて以降のタプルの変更回数の推計値を表示します。この推計値が自動 ANALYZE の駆動を決めるために使われます。
SSL
- SSL ECDH(楕円曲線ディフィー・ヘルマン) 鍵交換がサポートされました。(Marko Kreen) (9.4)
- ssl_ciphers 設定のデフォルト値が改善されました。(Marko Kreen) (9.4)
楕円曲線鍵でサーバ認証ができるようになります。RSA鍵よりも高速で安全です。新たな設定パラメータ ssl_ecdh_curve で曲線名を指定します。
「DEFAULT:!LOW:!EXP」はより明快な「HIGH:MEDIUM」になり、「!MD5」と「@STRENGTH」は不適切であるため外されています。
(9.3) 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH' ↓ (9.4) 'HIGH:MEDIUM:+3DES:!aNULL'
これまでは、ssl_ciphers 設定で指定した順番が、クライアント側のほとんど場合に設定不能なデフォルトの好みによってたいてい無視されていました。新たな設定パラメータ ssl_prefer_server_ciphers を off にすることで従来のクライアント側優先の振る舞いに戻すこともできます。
サーバ設定
- postgresql.conf の設定を変更できる ALTER SYSTEM コマンドが追加されました。(Amit Kapila) (9.4)
- 自動VACUUM におけるメモリ利用量を調整できる autovacuum_work_mem 設定パラメータが追加されました。(Peter Geoghegan) (9.4)
- Linux 上で huge memory page を使用できるようにする huge_pages設定パラメータが追加されました。(Christian Kruse, Richard Poole, Abhijit Menon-Sen) (9.4)
- バックグラウンドワーカーの数を制限する max_worker_processes 設定パラメータが追加されました。(Robert Haas) (9.4)
- 接続開始時にロードするライブラリを指定する session_preload_libraries設定パラメータが追加されました。(Peter Eisentraut) (9.4)
- ヒントビットの変更も WAL出力するようにする wal_log_hints 設定パラメータが追加されました(Sawada Masahiko) (9.4)
- work_mem と maintenance_work_mem のデフォルト設定値が4倍に増えました。(Bruce Momjian) (9.4)
- effective_cache_size のデフォルト値が増やされ、4GB になりました。(Bruce Momjian, Tom Lane) (9.4)
- log_line_prefix 設定パラメータで printf 形式の空白パディングが指定可能になりました(David Rowley) (9.4)
従来はファイルを編集するほかありませんでした。
巨大なメモリを持つシステムでの性能改善につながります。
スタンバイサーバでプライマリと異なるバックグラウンドワーカプロセスの制限をかけたい場合に役立ちます(max_connections はプライマリの値以上でなければいけないため、より限定的には制約できないため)。
local_preload_libraries 設定パラメータと違い、$libdir/plugins ディレクトリ以外にある共有ライブラリでもロードできます。また、スーパーユーザであればSET コマンドで設定できる superuser コンテキストです。
チェックサムを有効にしているとき以外では、ヒントビットは通常 WAL記録されません。本設定は外部配布されている拡張モジュール pg_rewind と組み合わせるとき有用です。
それぞれ 4MB と 64MB が新たなデフォルト値となります。
以下の postgresql.conf 設定をすると、 log_line_prefix = '%t %6p %4l ' 以下のようにログに指定桁数の空白埋めがされます。 2014-12-21 16:15:24 JST 26208 1 ERROR: syntax error at or near "test" at character 1 2014-12-21 16:15:24 JST 26208 2 STATEMENT: test; 2014-12-21 16:15:26 JST 26208 3 ERROR: syntax error at or near "test" at character 1 2014-12-21 16:15:26 JST 26208 4 STATEMENT: test;
以下ログ例の「DETAIL: 〜」と「on tuple (0,1)」が 9.4 で追加された部分です。「Wait queue:」が待っているプロセス群の PID です。行ロックであれば、どのタプルで待っているかも ctid 形式で表示されます。
LOG: process 26924 still waiting for AccessExclusiveLock on tuple (0,1) of relation 16416 of database 16412 after 1000.290 ms DETAIL: Process holding the lock: 26913. Wait queue: 26917, 26924. STATEMENT: SELECT * FROM t3 FOR UPDATE;
これまでは LOG レベルで出力されていましたが、接続ごとにロードされる場合には、冗長でした。
これまで Windows の ANSI コードページ(1252) にて出力されていました。
レプリケーションとリカバリ
- スタンバイノードの活動を調整するレプリケーションスロットが導入されました。(Andres Freund, Robert Haas) (9.4)
- レプリケーションを遅延させる recovery.conf の設定パラメータ
recovery_min_apply_delay が追加されました。(Robert Haas, Fabrízio de Royes Mello, Simon Riggs) (9.4) - recovery.conf に recovery_target 設定パラメータが追加されました。(MauMau, Heikki Linnakangas) (9.4)
- リカバリターゲットの処理が改善されました。(Heikki Linnakangas) (9.4)
- pg_switch_xlog() が古い WAL ファイル上の使われない末尾領域をクリアするようになりました。(Heikki Linnakangas) (9.4)
- recovery.conf で指定する各種リカバリ用外部コマンドからの失敗コードを報告するようになりました。(Peter Eisentraut) (9.4)
- WAL リプレイ時のスピンロックが削減されました。(Heikki Linnakangas) (9.4)
- トランザクション実行における WALレコードの書き出しがより頻繁になりました。(Andres Freund) (9.4)
レプリケーションスロットにより、スタンバイサーバが必要としなくなるまでプライマリ上の WALファイルなどのリソースを保持することができます。
レプリケーション適用を遅延させることでユーザ操作ミスに対する復旧に
役立ちます。
'immediate' を指定すると整合性のある状態に達し次第 WAL リカバリを停止します。
停止を判定する pg_last_xact_replay_timestamp() が報告するタイムスタンプが、コミットされる予定のトランザクションでなく、コミット済みのレコードを反映するようになりました。指定のリス
トアポイントよりも早すぎる時点でリプレイが止まってしまうのを防ぎます。
これにより WAL ファイルの圧縮率を改善します。
これによりスタンバイサーバの起動が早くなり、より積極的にリソースのクリーンアップができるようになります。
ロジカルデコーディング
- WALデータのロジカルデコーディングがサポートされました。(Andres Freund) (9.4)
- wal_level 設定パラメータに論理変更セットを WAL に組み入れる 'logical' 設定が加わりました。(Andres Freund) (9.4)
- 論理レプリケーション制御用にテーブル単位の属性 REPLICA IDENTITY が追加されました。(Andres Freund) (9.4)
- テーブル単位のストレージパラメータに user_catalog_table が追加されました。(Andres Freund) (9.4)
- ロジカルデコーディングデータを受け取る pg_recvlogical ツールが追加されました。(Andres Freund) (9.4)
- SQL レベルでのロジカルデコーディングを例示する test_decoding モジュールが追加されました。(Andres Freund) (9.4)
データベースの論理レベルでの変更内容をカスタマイズ可能な書式で連続的に出力することができます。
行識別に何を使うかを指定するもので、ALTER TABLE コマンドで設定することができます。
ロジカル変更セット出力にあたり、管理用のテーブルであるかを識別するために使用します。
クエリ
- WITH ORDINALITY 構文が追加されました。(Andrew Gierth, David Fetter) (9.4)
SELECT コマンド FROM 節の複数行を返す関数に指定して行番号を付加するもので、SQL標準で規定された機能です。
(使用例) db1=# SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY; unnest | ordinality --------+---------- a | 1 b | 2 c | 3 d | 4 e | 5 f | 6 (6 rows)
(使用例) db1=# SELECT * FROM ROWS FROM(generate_series(1,4), generate_series(11,15)); generate_series | generate_series -----------------+----------------- 1 | 11 2 | 12 3 | 13 4 | 14 | 15 (5 rows)
(使用例) db1=# SELECT * FROM generate_series(1,3); generate_series ----------------- 1 2 3 (3 rows) db1=# SELECT FROM generate_series(1,3); -- (3 rows)
ユーティリティコマンド
- シーケンスの状態を破棄する DISCARD SEQUENCES コマンドが追加されました。(Fabrízio de Royes Mello, Robert Haas) (9.4)
- COPY FROM コマンドに FORCE NULL オプションが追加されました。(Ian Barwick, Michael Paquier) (9.4)
- トランザクションブロックの外で意味をなさないコマンドを実行したとき、WARNING を出すようになりました。(Bruce Momjian) (9.4)
また、DISCARD ALL コマンドはシーケンスの状態も破棄するようになります。
CSV モードでクオートされた文字列が指定された NULL を表す文字列と一致していた場合に、それを NULL に変換します。
SET LOCAL、SET CONSTRAINTS、SET TRANSACTION、ABORT コマンドが該当します。
EXPLAIN
- EXPLAIN ANALYZE コマンドがプラン作成時間も出力するようになりました。(Andreas Karlsson) (9.4)
- EXPLAIN コマンドが HashAgg、GroupAgg と Group プラン要素にてグルーピングしているカラムを出力するようになりました。(Tom Lane) (9.4)
(9.4) postgres=# EXPLAIN SELECT i, count(*) FROM t1 GROUP BY i; QUERY PLAN ------------------------------------------------------------ HashAggregate (cost=28.45..30.45 rows=200 width=4) Group Key: i -> Seq Scan on t1 (cost=0.00..22.30 rows=1230 width=4) (3 rows) (9.3以前) postgres=# EXPLAIN SELECT i, count(*) FROM t1 GROUP BY i; QUERY PLAN ------------------------------------------------------------- HashAggregate (cost=28.45..30.45 rows=200 width=4) -> Seq Scan on t1 (cost=0.00..22.30 rows=1230 width=4) (2 rows)
postgres=# EXPLAIN ANALYZE SELECT * FROM table1 WHERE i BETWEEN 100000 AND 200000; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on table1 (cost=2086.96..47807.93 rows=98198 width=4) (actual time=21.496..1544.865 rows=100001 loops=1) Recheck Cond: ((i >= 100000) AND (i <= 200000)) Rows Removed by Index Recheck: 8797574 Heap Blocks: exact=332 lossy=39367 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -> Bitmap Index Scan on table1_index (cost=0.00..2062.41 rows=98198 width=0) (actual time=21.399..21.399 rows=100001 loops=1) Index Cond: ((i >= 100000) AND (i <= 200000)) Planning time: 0.200 ms Execution time: 1553.015 ms (8 rows)
ビュー
- マテリアライズドビューで他トランザクションからの参照をブロックせずに
リフレッシュできるようになりました。(Kevin Grittner) (9.4) - たとえ更新不能カラムが含まれていてもビューが自動的に更新可能となります。(Dean Rasheed) (9.4)
その場合、REFRESH MATERIALIZED VIEW CONCURRENTLY 構文を使います。
これまでは、式やリテラル、関数呼び出しのような更新不能のカラムが含まれている場合には、自動で更新可能にはなりませんでした。
(使用例) postgres=# CREATE TABLE t1 (i int, t text); CREATE TABLE postgres=# INSERT INTO t1 VALUES (1, 'abc'), (2, 'def'); INSERT 0 2 postgres=# CREATE VIEW v1 AS SELECT 'literal'::text as literal, * FROM t1; CREATE VIEW postgres=# SELECT * FROM v1; literal | i | t ---------+---+----- literal | 1 | abc literal | 2 | def (2 rows) postgres=# INSERT INTO v1 (i, t) VALUES (3, 'ghi'); INSERT 0 1 postgres=# SELECT * FROM v1; literal | i | t ---------+---+----- literal | 1 | abc literal | 2 | def literal | 3 | ghi (3 rows) postgres=# UPDATE v1 SET t = 'cba' WHERE i = 1; UPDATE 1 postgres=# SELECT * FROM v1; literal | i | t ---------+---+----- literal | 2 | def literal | 3 | ghi literal | 1 | cba (3 rows) postgres=# DELETE FROM v1 WHERE i = 2; DELETE 1 postgres=# SELECT * FROM v1; literal | i | t ---------+---+----- literal | 3 | ghi literal | 1 | cba (2 rows)
追加された WITH CHECK OPTION 節で指定します。
オブジェクト操作
- 外部テーブルにトリガーを付加できるようになりました。(Ronan Dunklau) (9.4)
- オブジェクト群をまとめてテーブルスペース移動させることができるようになりました。(Stephen Frost) (9.4)
- ALTER TABLE ... ALTER CONSTRAINT 構文で外部キー制約が DEFERRABLE かどうかを変更できるようになりました。(Simon Riggs) (9.4)
- ALTER TABLE コマンドのいくつかの指定について、ロック強度が下がりました。(Simon Riggs, Noah Misch, Robert Haas) (9.4)
ALTER TABLE、ALTER INDEX、ALTER MATERIALIZED VIEW コマンドに追加された ALL IN TABLESPACE ... SET TABLESPACE 構文を使用します。
以下指定では ACCESS EXCLUSIVE モードのロックを必要としません。
ALTER TABLE ... VALIDATE CONSTRAINT ALTER TABLE ... CLUSTER ON ALTER TABLE ... SET WITHOUT CLUSTER ALTER TABLE ... ALTER COLUMN SET STATISTICS ALTER TABLE ... ALTER COLUMN SET (attribute_option) ALTER TABLE ... ALTER COLUMN RESET (attribute_option)
これまでは ALTER TABLESPACE でしか指定できませんでした。
プランナに集約処理で使われるメモリ量をよりよく推定させるために使用します。
いくつかそのようなケースがありました。
これまでは pg_catalog スキーマに移動した後には修正も削除もできませんでした。
データ型
- line データ型が完全な形で実装されました。(Peter Eisentraut) (9.4)
- WALログのログシーケンスナンバーをあらわす pg_lsn データ型が追加されました。(Robert Haas, Michael Paquier) (9.4)
- 1点だけからなる polygon 型データを circle 型に変換できるようになりました。(Bruce Momjian) (9.4)
線分をあらわす lseg データ型はすでにサポートされていました。以前あった line データ型 (コンパイル時オプションで指定) はバイナリでもダンプでも互換性がありません。
(使用例) db1=# SELECT circle(polygon '(1,1)'); circle ----------- <(1,1),0> (1 row)
これまで PostgreSQL では、ある UTC オフセットは特定ロケールにおいては変更されない単一のタイムゾーン省略形に関連づけられるものと想定していました。しかし、実際には変更されているケー
スがありました。そのようなタイムゾーン省略形に対して、IANA タイムゾーンデータベースに基づいて、指定された日付によって適切な UTC オフセットを対応づけるようになります。
(9.4) db1=# SELECT '178956971 years'::interval; ERROR: interval out of range LINE 1: SELECT '178956971 years'::interval; ^ (9.3 以前) db1=# SELECT '178956971 years'::interval; interval -------------------------- -178956970 years -4 mons
JSON
- jsonb データ型が追加されました。(Oleg Bartunov, Teodor Sigaev, Alexander Korotkov, Peter Geoghegan, Andrew Dunstan) (9.4)
- 複雑な JSON ツリーを構築する関数が追加されました。(Andrew Dunstan, Laurence Rowe) (9.4)
- JSON データの JSON文書におけるデータタイプを返す json_typeof() 関数が追加されました。(Andrew Tipton) (9.4)
従来の json 型と比べて、JSON文書により高速にアクセスでき、また、 より有効にインデックスを適用できます。従来の json 型が JSON 文書全体をテキストとして格納するのに対し、jsonb 型では
文書構造を解析してバイナリで格納します。
以下の関数が追加されました。
json_array_elements_text()
json_build_array()
json_object()
json_object_agg()
json_to_record()
json_to_recordset()
関数
- より柔軟に休止する pg_sleep_for(interval)、pg_sleep_until(timestamp) が追加されました。(Vik Fearing, Julien Rouhaud) (9.4)
- 配列を引数とする cardinality() 関数が追加されました。(Marko Tiikkaja) (9.4)
- ラージオブジェクトを任意のオフセットで読み書きする関数が追加されました。(Pavel Stehule) (9.4)
従来からある pg_sleep() 関数は指定秒の休止しかできませんでした。
含まれる要素の総数を返します。
(使用例) db1=# SELECT lo_from_bytea(0, E'\xffffff00'); lo_from_bytea --------------- 16390 (1 row) db1=# SELECT lo_put(16390, 1, E'\xaa'); lo_put -------- (1 row) db1=# SELECT lo_get(16390, 0, 3); lo_get ---------- xffaaff (1 row)
それらは水平に結合されます。
(使用例) db1=# SELECT * FROM unnest(ARRAY[1,2], ARRAY['foo','bar','baz']); unnest | unnest --------+-------- 1 | foo 2 | bar | baz (3 rows)
make_date()、make_time()、make_timestamp()、make_timestamptz()、make_interval()など、データ型名に make_ プリフィックスが付いた名前の関数が追加されます。
(例) db1=# SELECT make_timestamptz(2014, 12, 18, 15, 31, 10, '+00'); make_timestamptz ------------------------ 2014-12-19 00:31:10+09 (1 row) db1=# SELECT make_interval(days := 10, hours := 5); make_interval ------------------ 10 days 05:00:00 (1 row)
これまではタイムゾーン名が指定されていない限り、空文字列が返っていました。
db1=# SET TimeZone TO Japan; db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ'); to_char --------- JST (1 row) db1=# SET TimeZone TO +9; (9.3 の場合) db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ'); to_char --------- (1 row) (9.4 の場合) db1=# SELECT to_char(CURRENT_TIMESTAMP, 'TZ'); to_char --------- +09 (1 row)
タイムゾーン名や地域名が指定されている場合でもオフセット値が出力されます。
db1=# SET TimeZone TO Japan; db1=# SELECT to_char(CURRENT_TIMESTAMP, 'OF'); to_char --------- +09 (1 row)
RFC 3629 にしたがった UTF8 文字のみを有効な値として受け入れます。
システム情報関数
- システムテーブル pg_class、pg_proc、pg_type および pg_operator からオブジェクト名を照会し、エラーは返さない関数がいくつか追加されました。(Yugo Nagata, Nozomi Anzai, Robert Haas) (9.4)
- テーブルスペース番号とファイルノード番号からリレーション名を照会する
pg_filenode_relation() 関数が追加されました。(Andres Freund) (9.4) - information_schema.parameters ビューに parameter_default カラムが追加されました。(Peter Eisentraut) (9.4)
- information_schema.schemata ビューがアクセス可能なスキーマを全て表示するようになりました。(Peter Eisentraut) (9.4)
to_regclass() 関数は regclass 入力関数のように pg_class を照会しますが、存在しないオブジェクトでも NULL を返すだけでエラーにしません。
関数引数のデフォルト値が格納されます。
これまでは現在ユーザが所有者であるスキーマしか表示していませんでした。
集約関数
- どの行を集約関数に渡すかを制御する FILTER 節がサポートされました。(David Fetter) (9.4)
以下のように実行できます。
db1=# SELECT avg(score) FILTER (WHERE category = 1), avg(score) FILTER (WHERE category = 2) FROM t8; avg | avg ---------------------+--------------------- 51.0303951367781155 | 36.1878612716763006 (1 row)
(使用例) db1=# SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY score) FROM t8; percentile_disc ----------------- 44 (1 row)
組み込みの array_agg() のような集約関数を適切に宣言できるようになります。
手続き言語
- PL/Perl と PL/Tcl でイベントトリガーを記述できるようになりました。(Dimitri Fontaine) (9.4)
- numeric 型の値が PL/Python の decimal 型に変換されるようになりました。(Szymon Guz, Ronan Dunklau) (9.4)
- GET DIAGNOSTICS を使って PL/PgSQL の現在のコールスタックを取得できるようになりました。(Pavel Stehule, Stephen Frost) (9.4)
- STRICT 制約に違反したクエリを表示する print_strict_params オプションが追加されました。(Marko Tiikkaja) (9.4)
従来は Python の浮動小数点型に変換されていましたが、精度が失われる可能性がありました。
「GET DIAGNOSTICS stack_text = PG_CONTEXT;」として、コールスタックが記述された文字列データを取得できます。
(以下のようにオプションを関数定義冒頭のブロック外側に記述します) CREATE FUNCTION get_uid(p_uname name) RETURNS int LANGUAGE plpgsql AS $func$ #print_strict_params on DECLARE r int; BEGIN SELECT usesysid::int INTO STRICT r FROM pg_user WHERE usename = p_uname; RETURN r; END $func$; (以下の DETAIL: は print_strict_params on のときだけ出力されます) db1=# SELECT get_uid('foo'); ERROR: query returned no rows DETAIL: parameters: $1 = 'foo' CONTEXT: PL/pgSQL function f_uid(name) line 5 at SQL statement
いまのところは、隠し変数についての警告/エラーが有効になるだけです。
libpq
- libpq の PQconndefaults() 関数が無効なサービスファイルを無視するようになりました。(Steve Singer, Bruce Momjian) (9.4)
- libpq が TLSv1 以降の TLS プロトコルバージョンを受け入れるようになりました。(Marko Kreen) (9.4)
これまでは無効なサービスファイルに遭遇すると NULL を返していました。
これまでは TLSv1 バージョンだけを受け入れていました。
クライアントアプリケーションなど
- createuser コマンドに、所属するロールを指定する -g オプションが追加されました。(Chistopher Browne) (9.4)
- vacuumdb コマンドに、複数の異なる設定で analyze を行う --analyze-in-stages オプションが追加されました。(Peter Eisentraut) (9.4)
- pg_resetxlog の -n オプションの実行で現在の値と今後変化する値を出力するようになりました。(Rajeev Rastogi) (9.4)
- initdb が誤ったロケール設定に黙って代替にデフォルトを選択するのでなくエラーを出すようになりました。(Tom Lane) (9.4)
- pg_ctl がデータディレクトリにアクセス不能であるとき、終了コード 4 を返すようになりました。(Amit Kapila, Bruce Momjian) (9.4)
- Windows で相対パスで指定された -D オプションを確実に pg_ctl のカレントディレクトリからの相対パスと解釈するようになりました。(Kumar Rajeev Rastogi) (9.4)
- ECPG で C 言語の配列定義に sizeof() が利用可能になりました。(Michael Meskes) (9.4)
- ECPG で入れ子になった C 言語スタイルのコメントを C 言語中でも SQL中でも
適切に扱えるようになりました。(Michael Meskes) (9.4)
これにより最低限の統計情報を高速に生成することができるようになりました。
これは LSB (Linux Standard Base) コア仕様により適合した振る舞いとなります。
これまで Windowsサービスが開始されたディレクトリを起点にして解釈されていました。
psql
- psql にて footer の設定が off の場合、expanded モードで 0行のときに表示されていた (No rows) が表示されなくなりました。(Bruce Momjian) (9.4)
- コネクション開始時にハングアップした場合に Control-C 押下げで、終了できるようになりました。(Peter Eisentraut) (9.4)
psql/バックスラッシュコマンド
- psql の db+ でテーブルスペースオプションが表示されるようになりました。(Magnus Hagander) (9.4)
- psql の do+ で演算子を実装している関数が表示されるようになりました。(Marko Tiikkaja) (9.4)
- psql の d+ が OID カラムがある場合だけ「Has OIDs: ...」を表示するようになりました。(Bruce Momjian) (9.4)
- psql の d が無効なシステムトリガーも表示するようになりました。(Bruce Momjian) (9.4)
- psql の copy が「stdin」と「;(セミコロン)」の間に空白を必要としなくなりました。(Etsuro Fujita) (9.4)
- psql の copy で最後に行数を出力するようになりました。(Kumar Rajeev Rastogi) (9.4)
- psql の conninfo が hostaddr を指定して接続した場合にサーバの IPアドレスを表示するように修正されました。(Fujii Masao) (9.4)
- psql の conninfo で SSLプロトコルバージョンが表示されるようになりました。(Marko Kreen) (9.4)
- psql の pset で TAB キーによる入力補完できるようになりました。(Pavel Stehule) (9.4)
- psql の pset で引数無しのときに設定一覧が表示されるようになりました。(Gilles Darold) (9.4)
- psql の s で入力ヒストリをファイルに書き出す際に、ファイル名を絶対パスに変換することなく表示するようになりました。(Tom Lane) (9.4)
これまでは OID カラムが無くても「Has OIDs: no」が表示されていました。
これまで無効なトリガーはユーザトリガに限って表示されていました。
COPY コマンドでは既にそのようになっています。
これまでそのような場合にサーバの IPアドレスが表示されませんでした。
これまでのコードでは表示するのにパスを変換しようと試みていましたが、しばしば誤っていました。
(9.3 での望ましくない動作例) db1=# s ./my-history.txt Wrote history to file "././my-history.txt".
pg_dump
- pg_restore でオプション -I、-P、-T、-n を複数指定できるようになりました。(Heikki Linnakangas) (9.4)
- 既存オブジェクトを削除する指定の時に出力される DROP コマンドに IF EXISTS 節を追加できるようになりました。(Pavel Stehule) (9.4)
pg_dump、pg_dumpall、pg_restore に --if-exists オプションが加わりました。 --clean を指定した際に働きます。
pg_basebackup
- pg_basebackup に pg_xlog ディレクトリを指定するオプション --xlogdir が追加されました。(Haribabu Kommi) (9.4)
- pg_basebackup でテーブルスペースを別の場所に配置できるようになりました。(Steeve Lennmark) (9.4)
- ネットワークストリーム経由のベースバックアップ取得を減速できるようになりました。(Antonin Houska) (9.4)
これは同マシン内で pg_basebackup を実行するときに便利です。
pg_basebackup に追加された --max-rate パラメータで指定します。
ソースコード
- タプルを調査情報を保持して凍結する方法が改善されました。(Robert Haas, Andres Freund) (9.4)
- 関数宣言には PG_FUNCTION_INFO_V1 マクロが不要になりました。(Peter Eisentraut) (9.4)
- SnapshotNow と HeapTupleSatisfiesNow() が除去されました。(Robert Haas) (9.4)
- 1GB 以上のメモリ割り当てが可能な API が追加されました。(Noah Misch) (9.4)
- 文字列構成用にメモリ割り当てを内部で行う psprintf() が追加されました。(Peter Eisentraut, Tom Lane) (9.4)
- size_t 値を表示するのに elog() 等で printf() サイズ修飾子 z を使えるようになりました。(Andres Freund) (9.4)
- appendStringInfoVA() API が改善されました。(David Rowley, Tom Lane) (9.4)
- 新たな種類の 外部TOASTデータがサポートされました。(Andres Freund) (9.4)
- 単一リーダ、単一ライタの軽量な共有メッセージキューが追加されました。(Robert Haas) (9.4)
- x86_64 CPU におけるスピンロックが改善されました。(Heikki Linnakangas) (9.4)
- サポートされないプラットフォームのスピンロックコードが除去されました。(Robert Haas) (9.4)
- IRIX への移植が除去されました。(Robert Haas) (9.4)
- --disable-spinlocks 指定でビルドしたときの必要セマフォ数が削減されました(Robert Haas) (9.4)
- duplicate_oids スクリプトが Perl で書き直されました。(Andrew Dunstan) (9.4)
- クライアントプログラムむけに TAP (Test Anything Protocol) テストが追加されました。(Peter Eisentraut) (9.4)
- make ターゲットに個別に実行できるテストの check-tests と installcheck-tests が追加されました。(Andrew Dunstan) (9.4)
- makefile ルールの maintainer-check が除去されました。(Peter Eisentraut) (9.4)
- PGXS モジュールの VPATH ビルド対応が改善されました。(Cédric Villemain, Andrew Dunstan, Peter Eisentraut) (9.4)
- 使用する Autoconf が 2.69 となりました。(Peter Eisentraut) (9.4)
- configure オプション --with-extra-version で PG_VERSION 文字列に任意の文字列を足せるようになりました。(Oskari Saarenmaa) (9.4)
- DocBook XML の検証が改善されました。(Peter Eisentraut) (9.4)
- Coverity スキャナーで報告されたいくつかのセキュリティ、健全性の問題について修正されました。(Stephen Frost) (9.4)
- Valgrind による不正なメモリ使用の探知が改善されました。(Noah Misch) (9.4)
- emacs.samples が改善されました。(Peter Eisentraut) (9.4)
- pgindent が typedefs のコマンドラインリストに対応しました。(Bruce Momjian) (9.4)
- pgindent がプリプロセッサ条件周辺の空白行についてより賢明になりました。(Bruce Momjian) (9.4)
- Cygwin と Mingw ビルドで dlltool をほとんど使用しないようになりました。(Marco Atzeri, Hiroshi Inoue) (9.4)
- MSVC ビルドでクライアントのみインストールがサポートされました。(MauMau) (9.4)
この変更は、タプルをできるだけ早く凍結させることの難点を除去します。タプルのフラグビットを解析するツールは本バージョンに対応した修正が必要となります
なお、関数定義の手前には必要です。
既存の使用箇所はより適切なスナップショットタイプに切り替えられました。システムカタログのスキャンにも MVCC スナップショットが使われます。
いまのところ、--enable-tap-tests オプションを指定してビルドして、make check-world を行った場合にのみ実行されます。将来デフォルトとなるかもしれません。
デフォルトのビルドルールにこれまでオプションであったテストが全て含まれています。
カスタムバイナリパッケージャーにむけに便利です。
また .dir-locals.el がソースツリーのトップに追加されました。
追加モジュール
- データを共有バッファ等に事前読み出しする pg_prewarm モジュールが追加されました。(Robert Haas) (9.4)
- ランダムな UUID を生成する gen_random_uuid() が追加されました。(Oskari Saarenmaa) (9.4)
- uuid-ossp が OSSP UUID ライブラリだけでなく、BSD および e2fsprogs の UUIDライブラリに対応しました。(Matteo Beccati) (9.4)
- auto_explain モジュールにトリガ実行時間を含めるオプションが追加されました。(Horiguchi Kyotaro) (9.4)
- pgstattuple モジュールが未コミットトランザクションの行を不要行(dead) と報告しないように修正されました。(Robert Haas) (9.4)
- pgstattuple() 関数が regclass 型の引数を使うようになりました。(Satoshi Nagayasu) (9.4)
- pgrowlock のスナップショット取得動作の一貫性が改善されました。(Robert Haas) (9.4)
- pg_trgm で正規表現のインデックス検索に対するトリグラム選択が改善されました(Alexander Korotkov) (9.4)
- pg_xlogdump にオンラインの WALデータを継続的に報告できる --follow オプションが追加されました。(Heikki Linnakangas) (9.4)
- cubeデータ型の格納サイズが小さくなりました。(Stas Kelvich) (9.4)
- カーソルを使うことで vacuumlo コマンドのクライアント側メモリ使用量が削減されました。(Andrew Dunstan) (9.4)
- pg_upgrade のメモリ使用量が大幅に削減されました。(Bruce Momjian) (9.4)
- pg_upgrade のユーザ指定する -U オプションが、生成される分析スクリプトに渡されるようになりました。(Bruce Momjian) (9.4)
text 型引数もまだサポートされますが将来除去されるかもしれません。
本変更で空白を含むトリグラムは選択されにくくなります。
既存データはダンプリストアをして新フォーマットに変換する必要があります。旧フォーマットのデータもまだ読み取り可能です。
pgbench
- pgbench スクリプトの行の長さ制限が除かれました。(Sawada Masahiko) (9.4)
- pgbench の各オプションにロングオプション名が追加されました。(Fabien Coelho) (9.4)
- pgbench にトランザクション速度を指定する --rate オプションが追加されました。(Fabien Coelho) (9.4)
- pgbench に定期的に経過を報告する --progress オプションが追加されました。(Fabien Coelho) (9.4)
以前は BUFSIZ (stdio.h で宣言されている) が上限でした。
pg_stat_statements
- pg_stat_statements がクエリ文字列を格納するのに共有メモリでなくファイルを使うようになりました。(Peter Geoghegan) (9.4)
- pg_stat_statements の内部クエリハッシュ識別子を報告できるようになりました。(Daniel Farina, Sameer Thakur, Peter Geoghegan) (9.4)
- pg_stat_statements のクエリ文字列以外の全情報を取得するということができるようになりました。(Peter Geoghegan) (9.4)
- pg_stat_statements が DEALLOCATE コマンドを無視するようになりました。(Fabien Coelho) (9.4)
- PostgreSQL停止時に pg_stat_statements の 統計ファイルを $PGDATA/global/ でなく、$PGDATA/pg_stat/ に保存するようになりました。(Fujii Masao) (9.4)
これにより従来あったクエリ文字列の上限が無くなりました。また、デフォルトでより多くのクエリ種類を観測できるようになります。
モニタリングツールの性能を改善します。どのクエリ文字列のデータであるかは、ハッシュ識別子(queryid)で識別することになります。
既に PREPARE を無視するようになっていましたので、一貫性を持たす変更となります。