
このページでは PostgreSQL 9.2 (2012/9/10リリース)に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートをもとに弊社で解説を加えたものです。
概要
本メジャーバージョンアップの主な機能追加と性能改善は以下のとおりです。
- マルチCPUコアのマシンにおいて同時実行性能が大幅に改善しました。
- Index Only Scan が可能となりました。
- プリペアドステートメントでパラメータに応じたプランが生成できるようになりました。
- インデックススキャンを伴う入れ子ループのプランについて、プランナが改良されました。
- ストリーミングレプリケーションでカスケード構成が可能となり、pg_basebackup もスタンバイからベースバックアップが可能となりました。
- WALアーカイブを取得する pg_receivexlog コマンドが追加されました。
- SP-GiST (空間分割GiST) インデックスアクセスメソッドが追加されました。
- 範囲データ型、JSONデータ型が追加されました。
- ビューにセキュリティバリアオプションが導入されました。
- libpq接続文字列に URI形式がサポートされました。
上述の項目を含めて、以下のセクションで変更点をより詳しく説明します。
バージョン 9.2 への移行/互換性のない変更点
全ての以前のリリースからデータの移行を行うためには、pg_dumpを使用したダンプ/リストア、または、pg_upgrade の使用が必要です。 バージョン9.2には、以前のリリースとの互換性に影響を与える変更がいくつか含まれます。以下の非互換性に注意してください。
システムカタログ
- pg_tablespace から spclocationカラムが削除されました。(Magnus Hagander)
spclocation にはテーブルスペースのディレクトリパスが格納されますが、データベースクラスタの pg_tblspc 以下にシンボリックリンクがあるため、重複するデータ項目でした。
本修正によりサーバが停止してる間にテーブルスペースディレクトリの移動が可能になります。
また、テーブルスペースの OID からディレクトリパスを返す pg_tablespace_location() 関数が追加されました。
- tsvector型の最頻出現要素の統計情報が pg_stats の新たなカラムに移動しました。(Alexander Korotkov)
以前に most_common_valsカラム、most_common_freqsカラムに在ったデータは、most_common_elemsカラム、most_common_elem_freqsカラムから参照できます。
関数と演算子
- hstore の「=>」演算子が廃止されました。(Robert Haas)
代わりに hstore(text, text) 関数を使う必要があります。
「=>」という演算子をユーザ定義する際には、SQL標準で予約されているトークンを別目的で使おうとしているということで、PostgreSQL 9.0 から、警告メッセージが吐かれていました。
- xpath() 関数が文字列中の特別な文字を確実にエスケープするようになりました。(Florian Pflug)
これが行われない場合、不正な XML が出力されることがありえました。
実行例
=# select xpath('//text()', '<root>&lt;</root>');
- 9.2 の出力
-
xpath -------- {&lt;} (1 row)
- 9.1.x の出力
-
xpath ------- {<} (1 row)
- pg_relation_size() のほかディスク使用量を返す pg_〜_size()関数群は対象オブジェクトが存在しないときに NULL を返すようになりました。(Phil Sorber)
並行して DROP操作が行なわれている直後に実行して、これら関数を呼び出すクエリがエラーを返すことを防ぎます。
- EXTRACT でタイムゾーンが含まれない値の epoch は、UTC の夜中(0時)からではなく、ローカルの夜中からを基準とするようになりました。(Tom Lane)
UTC に依存した計算は矛盾していました。
以前の振る舞いも、値を “timestamp with time zone” 型にキャストすることで可能です。
以下のような SQL の実行結果が 9.2 バージョンとそれ以前とで異なることとなります。
=# select EXTRACT (EPOCH FROM '2012-09-01 00:00:00'::timestamp); date_part ------------ 1346457600 (1 row)
- 末尾に “yesterday” “today” “tomorrow” が付いた時間文字列を正しく解釈します。(Dean Rasheed)
以前は SELECT ’04:00:00 yesterday’::timestamp で昨日の真夜中(0時)の時刻を返していました。
(以前の不適切な動作例)
=# SELECT now(); now ------------------------------- 2012-09-06 14:00:14.021352+09 (1 row) =# select '04:00:00 yesterday'::timestamp; timestamp --------------------- 2012-09-05 00:00:00 (1 row)
- 不完全な日付は 2020年に近い日付と解釈するように to_date() と to_timestamp() が修正されました。(Bruce Momjian)
以前は 4桁未満の年やマスクが与えられた時に一貫性が欠けていました。
以下のような SQL の実行結果が 9.2 バージョンとそれ以前とで異なることとなります。
(9.1.5 の実行結果、9.2 バージョンなら 1999年と解釈される) =# SELECT to_date('31 12 99', 'DD MM YY'); to_date ------------ 2099-12-31 (1 row)
オブジェクト操作(DDL命令)
- ALTER DOMAIN がドメインではない型に実行できなくなりました。(Peter Eisentraut)
以前は非ドメイン型に対する所有者とスキーマの変更が可能になっていました。
- 手続き型言語の名前が自動的に小文字変換されなくなりました。(Robert Haas)
クオートされていない言語識別子は、まだ小文字化されますが、クオートされた文字列は強制的な小文字化を行ないません。
そのため例えば CREATE FUNCTION … LANGUAGE ‘C’ はもはや動作しません。
‘c’ と記述しなければならないか、あるいはクオートを省略するのが良いです。
- 外部キー制約定義に伴って作成させるトリガーの名前の付け方が変更されました。(Tom Lane)
この変更により、自己参照外部キー制約における正しいトリガ発火順序が、特異なケースでも担保されます。
コマンドラインツール
- psql のメタコマンド引数におけるバッククオート、変数展開、クオートされた部分文字列の振舞が一貫して提供されるようになりました。(Tom Lane)
以前まで、これらの使用は、空白文字列で分離された時だけ正しく展開されました。
- 9.1.x の動作
-
=# echo 'FOO'BAR FOO BAR
- 9.2 の動作
-
=# echo 'FOO'BAR FOOBAR
- clusterdb はテーブル名を、reindexdb はテーブル名やインデックス名を、ダブルクオートされたものとして扱わなくなりました。(Bruce Momjian)
ダブルクオートされた振舞を実現するには、ユーザがコマンド引数でダブルクオートを指定する必要があります。
ダブルクオートを指定する例
$ clusterdb -t "Tbl01" dbname
- createuser 実行時の設定プロンプトがなくなりました。(Peter Eisentraut)
以前の createuser は、色々なユーザ設定に関連したプロンプトを出しました。
–interactive を指定すると以前の振る舞いをします。
- dropdb は –interactive が指定されない限り、ユーザ名プロンプトを出さなくなりました。(Peter Eisentraut)
サーバ設定
- サーバサイド SSL ファイルの配置を指定する設定パラメータが追加されました。(Peter Eisentraut)
これまでハードコードされていた server.crt、server.key、root.crt、root.ctl ファイルの配置を変更することができます。
もはや CA(crt) と CRL ファイルはデフォルトの名前を持ちません。これらを指定した場合、そのファイルは存在しなければなりません。
- postgresql.conf の silent_mode 設定パラメータが廃止されました。(Heikki Linnakangas)
この動作は既に “pg_ctl -l postmaster.log” で行なうことができます。
- wal_sender_delay 設定パラメータが廃止されました。(Tom Lane)
wal senderプロセスが休止をやめて動作を再開すべきケースを検知できるようになったため、固定の休止時間を指定する必要がなくなりました。
- custom_variable_classes 設定パラメータが廃止されました。(Tom Lane)
もともとこの設定によって提供される検査は疑わしいものでした。
任意の設定に任意のクラス名をプレフィックス指定することができます。
モニタリング
- pg_stat_activity ビューの procpid カラムが「pid」に名前変更されました。(Magnus Hagander)
その他のシステムテーブルと揃えるための変更となります。
- pg_stat_activityビューに stateカラムと state_changeカラムが追加されました。(Scott Mead, Magnus Hagander)
state には「active」「idle」「idle in transaction」など状態が表示され、state_change には state が変った時刻が記録されます。
これまでは current_query カラムに状態情報も表示していました。
- クエリ完了後も最後に実行したクエリが消えずに残るため、pg_stat_activityビューの current_queryカラムが「query」に名前変更されました。(Magnus Hagander)
- 全ての SQLレベルの時間の統計値が float8型カラムでミリ秒単位になりました。(Tom Lane)
以下のビューのカラムが該当します。
pg_stat_user_functions.total_time pg_stat_user_functions.self_time pg_stat_xact_user_functions.total_time pg_stat_xact_user_functions.self_time
- pg_stat_statements の total_time カラムがミリ秒単位になりました。(Tom Lane)
バージョン 9.2 の変更点
サーバ
性能改善
- ヒープアクセス無しにインデックスのみからデータを取得できるようになりました。(Robert Haas, Ibrar Ahmed, Heikki Linnakangas, Tom Lane)
ヒープとはテーブルのデータ本体が格納されている領域のことです。
この機能はよく「index only scan」と呼ばれます。
以下のようにインデックス上のカラムだけを参照する問い合わせに Index Only Scan プランタイプが使われます。
=# EXPLAIN SELECT aid FROM pgbench_accounts; QUERY PLAN ---------------------------------------------------------------- Index Only Scan using pgbench_accounts_pkey on pgbench_accounts (cost=0.00..12996.80 rows=500000 width=4)
Index Only Scan が使えるのはヒープページの内、投入時点または前回 VACUUM時点以降に変更されたデータが無い箇所です。したがって、本機能が効果的なのは、書き込みの少ないテーブルといえます。
本機能の実現のためビジビリティマップがクラッシュセーフになりました。
- SP-GiST(空間分割GiST)インデックスアクセスメソッドが追加されました。(Teodor Sigaev, Oleg Bartunov, Tom Lane)
SP-GiST は GiST のように柔軟ですが、不均衡に分割された検索構造をサポートします。
SP-GiST に向いた問題むけには、インデックス構築速度、検索速度とも GiST に優ります。
- 高負荷時にグループコミットが効果的に機能するようになりました。(Peter Geoghegan, Simon Riggs, Heikki Linnakangas)
これまで、同時多数のコミットは書き込み処理で内部ロック競合を招き効率的ではありませんでした。
- 競合しないロックは、新しいファストパス(fast-path)ロック機構を使って管理されるようになりました。(Robert Haas)
- バーチャルトランザクションIDを生成する際のロックの余計な負荷が軽減されました。(Robert Haas)
- シリアライザブル分離レベルロックの余計な負荷が軽減されました。(Dan Ports)
- PowerPC (POWER7 など POWERアーキテクチャのCPU) と Itanium のスピンロック性能が向上しました。(Manabu Ori, Robert Haas, Tom Lane)
- 共有無効キャッシュメッセージの余計な負荷が軽減されました。(Robert Haas)
- 性能向上のため、PGPROC共有メモリ配列の頻繁にアクセスされる要素を分割しました。(Pavan Deolasee, Heikki Linnakangas, Robert Haas)
- 行をテーブルに一括で追加する際の COPY の性能が改善されました。(Heikki Linnakangas)
- メモリ割り当ての無駄を減らしたより良いツリーを生成することで地理データ型の GiSTインデックスの性能が改善されました。(Alexander Korotkov)
- GiSTインデックスの作成時間が改善されました。(Alexander Korotkov, Heikki Linnakangas)
- 一時テーブルとUNLOGGEDテーブルについてヒントビットがすぐに設定できるようになりました。(Robert Haas)
- ソートが、SQL呼び出しでない比較関数によるインライン化で、より高速に実行できるようになりました。(Peter Geoghegan, Robert Haas, Tom Lane)
- MVCCスナップショット取得を減らしました。(Robert Haas)
- clogバッファ数の規模が shared_buffers に基づくようになりました。(Robert Haas, Simon Riggs, Tom Lane)
- テーブルまたはデータベース削除に伴うバッファスキャンの性能が改善されました。(Jeff Janes, Simon Riggs)
- 多数のテーブルを DROP したり、TRUNCAETE した際における、チェックポイント処理の fsync要求キューの性能が改善ざれました。(Tom Lane)
- Windowsで子プロセスに安全なファイルディスクリプタ数を渡すようになりました。(Heikki Linnakangas)
これにより Windows のセッションでより多くのファイルを開いて使えます。
プロセス管理
- チェックポイントを実行するための専用バックグラウンドプロセス checkpointer が使われるようになりました。(Simon Riggs)
以前は、バックグラウンドライタープロセスが、ダーティページの書き込みとチェックポイントの両方を行なっていました。これらの処理を二つのプロセスに分離させることで、それぞれの目標をより予測通りに完了させることができます。
- walwriter をより早く起こすことで、非同期コミット処理が改善されました。(Simon Riggs)
これまでは wal_writer_delay だけが WAL をディスクへフラッシュさせるきっかけになっていました。今は WAL バッファが一杯になることも WAL 書き込みのきっかけになります。
- bgwriter、walwriter、checkpointer、統計情報コレクタ、ログコレクタ、 アーカイバ、といったバックグラウンドプロセスは、不活性時にはより効率的に 眠るようになりました。(Peter Geoghegan, Tom Lane)
これらの変更により、何も行なうことがない時に、プロセスが起きる頻度を減らし、待機サーバの消費電力を劇的に減らします。
プランナ
- プランナがプリペアドステートメントに対してパラメータ値に合わせたカスタムプランを生成できるようになりました。(Tom Lane)
これまでプリペアドステートメントは全てのパラメータ値に対して常に単一の汎用プランが使われました。このことで定数を直接記載した非プリペアドステートメントのプランより劣ることがよくありました。
カスタムプランに効果がない場合が繰り返されたときには、汎用プランが使われるようになります。本修正はプリペアドステートメント利用の性能ペナルティを取り除きます。PL/pgSQL内のダイナミックステートメントを除くSQL実行もこの恩恵をうけます。
以下のように一つのプリペアドステートメントに対して、パラメータによってプランタイプが変化します。
=> PREPARE p1 (bigint) AS SELECT * FROM pgbench_accounts WHERE aid < $1; => EXPLAIN (COSTS OFF) EXECUTE p1(100000); QUERY PLAN ---------------------------------- Seq Scan on pgbench_accounts Filter: (aid < 100000::bigint) => EXPLAIN (COSTS OFF) EXECUTE p1(10); QUERY PLAN ---------------------------------------------------- Index Scan using pgbench_accounts_pkey on pgbench_accounts Index Cond: (aid < 10::bigint)
- プランナで、内側にインデックススキャンを使う入れ子ループの使い方が改善されました。(Tom Lane)
新たに導入されたパラメータ化パス機構では、内側のインデックススキャンで一段(あるいは多段)上位の結合におけるリレーションの値を使うことができます。このことは、外部結合など、意味論的に許される結合順序が制限される場合に性能を大きく改善できます。
以下にプラン差異の例を示します。t1、t2、t3 はいずれも unique1、unique2、hundred カラムにインデックスを持つ 10万行のテーブルです。9.2 の場合にはt2 と t3 の結合に t1 の値に基づく条件フィルターが適用されています。
=# EXPLAIN SELECT * FROM t1 LEFT JOIN (t2 JOIN t3 ON t2.thousand = t3.unique2) ON t1.hundred = t2.hundred AND t1.ten = t3.ten WHERE t1.unique1 = 1;
- 9.2の場合
-
QUERY PLAN --------------------------------------------------------------------------------- Nested Loop Left Join (cost=5.04..277.78 rows=10 width=732) -> Index Scan using t1_u1 on t1 (cost=0.00..8.28 rows=1 width=244) Index Cond: (unique1 = 1) -> Nested Loop (cost=5.04..269.40 rows=10 width=488) Join Filter: (t1.ten = t3.ten) -> Bitmap Heap Scan on t2 (cost=5.04..224.95 rows=100 width=244) Recheck Cond: (t1.hundred = hundred) -> Bitmap Index Scan on t2_h (cost=0.00..5.01 rows=100 width=0) Index Cond: (t1.hundred = hundred) -> Index Scan using t3_u2 on t3 (cost=0.00..0.43 rows=1 width=244) Index Cond: (unique2 = t2.thousand) (11 rows)
- 9.1.x の場合
-
QUERY PLAN ------------------------------------------------------------------------------ Hash Right Join (cost=911.28..2580.38 rows=10 width=732) Hash Cond: ((t2.hundred = t1.hundred) AND (t3.ten = t1.ten)) -> Hash Join (cost=903.00..2497.00 rows=10000 width=488) Hash Cond: (t2.thousand = t3.unique2) -> Seq Scan on t2 (cost=0.00..445.00 rows=10000 width=244) -> Hash (cost=445.00..445.00 rows=10000 width=244) -> Seq Scan on t3 (cost=0.00..445.00 rows=10000 width=244) -> Hash (cost=8.27..8.27 rows=1 width=244) -> Index Scan using t1_u1 on t1 (cost=0.00..8.27 rows=1 width=244) Index Cond: (unique1 = 1) (10 rows)
- 外部データラッパーのプランナAPI が改善されました。(Etsuro Fujita, Shigeru Hanada, Tom Lane)
ラッパーは外部テーブルに対する複数のアクセスパスを提供できるようになり、より柔軟な結合プランの生成が可能となりました。
- テーブル以外のリレーションに対する自己矛盾した制約を認識するようになりました。(Tom Lane)
constraint_exclusion = on であるときに限った実装となります。
- インデックス付けされたカラム と ANY(ARRAY[...]) との比較でインデックススキャンやインデックスオンリースキャンが選択できるようになりました。(Tom Lane)
(9.2 での実行例)
=# EXPLAIN SELECT unique1 FROM t1 WHERE unique1 = ANY(ARRAY[7164, 1314, 5222]); QUERY PLAN ---------------------------------------------------------------------- Index Only Scan using t1_u1 on t1 (cost=0.00..24.82 rows=3 width=4) Index Cond: (unique1 = ANY ('{7164,1314,5222}'::integer[])) (2 rows)
- min/max関数に対するインデックス最適化が boolean型カラムにも適用されるようになりました。(Marti Raudsepp)
boolean型に対する min/max関数は用意されていませんが、bool_and関数、bool_or関数でインデックスが使われるようになります。
- SELECT文のターゲットリストに複数行を返す関数が在る場合、推定行数を設定するようになりました。(Tom Lane)
これまでは常に1行しか返らない扱いとなっていました。
- 9.1.x の場合
-
=# EXPLAIN SELECT generate_series(1, 100) ; QUERY PLAN ------------------------------------------ Result (cost=0.00..0.01 rows=1 width=0) (1 row)
- 9.2 の場合
-
=# EXPLAIN SELECT generate_series(1, 100) ; QUERY PLAN --------------------------------------------- Result (cost=0.00..5.01 rows=1000 width=0) (1 row)
- プランナが重複したカラムをもつインデックスをより確実に扱うようになりました。(Tom Lane)
- 配列の要素ごとの統計情報を集めるようになりました。(Alexander Korotkov, Tom Lane)
これは配列に対する <@、&&、@> 演算子(包含と重なり)の選択率予測を改善します。
- 外部テーブルに対する統計情報を収集できるようになりました。(Etsuro Fujita)
- 部分インデックスを使った場合のコスト推定が改善されました。(Tom Lane)
- サブクエリから参照されているカラムについて、プランナの統計情報利用が改善されました。(Tom Lane)
- DISTINCT を使ったサブクエリについて統計予測が改善されました。(Tom Lane)
認証
- pg_hba.conf でグループとしてのロール名や samerole を指定した際に、管理者ユーザが自動的に含まれる振る舞いをしなくなりました。(Andrew Dunstan)
これまでは管理者ユーザは暗黙的にすべてのロールのメンバーとして扱われていました。
以下のように pg_hba.conf を記述したとして、
local testdb +group1 trust local testdb all reject
PostgreSQL 9.1.x では、group1 のメンバーと定義していなくとも管理者ユーザ(postgres) は、接続できてしまいました。9.2 であれば、以下のようなエラーとなります。これは非互換の仕様変更となります。
$ psql -U postgres -d testdb psql: FATAL: pg_hba.conf rejects connection for host "[local]", user "postgres", database "testdb"
- pg_hba.conf の字句解析においてより一貫性のある振る舞いに修正されました。(Brendan Jurd, Alvaro Herrera)
- 空の pg_hba.conf ファイルをエラー扱いするようになりました。(Tom Lane)
以下のようなログが出て、PostgreSQL起動にも失敗するようになります。
LOG: configuration file "/data/9.2/pg_hba.conf" contains no entries FATAL: could not load pg_hba.conf
reload した場合には、以下警告が出て、以前の pg_hba.conf 設定のままになります。
WARNING: pg_hba.conf not reloaded
- 管理者ユーザ権限はレプリケーション権限を包含するものとなりました。(Noah Misch)
モニタリング
- バックエンドクラッシュの際に現在のクエリのログ書き出しを試みます。(Marti Raudsepp)
- 自動VACUUM の I/O 動作についてより詳しくログを書き出すようになります。(Greg Smith, Noah Misch)
log_autovacuum_min_duration 設定によって書かれるログが以下のようになります。
LOG: automatic vacuum of table "postgres.public.t1": index scans: 1 pages: 0 removed, 9 remain tuples: 500 removed, 500 remain buffer usage: 66 hits, 4 misses, 5 dirtied avg read rate: 14.902 MiB/s, avg write rate: 18.628 MiB/s system usage: CPU 0.00s/0.00u sec elapsed 0.00 sec
- WAL適用で失敗したらすぐに報告するようになりました。(Fujii Masao)
これまでは、サーバがマスターモードになるときに一度だけ失敗が報告されるというケースがありました。
- 単純にWAL位置を比較する pg_xlog_location_diff 関数が追加されました。(Euler Taveira de Oliveira)
- Windowsイベントログのアプリケーション名が設定できるようになりました。(MauMau, Magnus Hagander)
複数のPostgreSQLインスタンスのログを区別する用途で利用できます。postgresql.conf の event_source設定で指定します。
- トランザクション中である場合を除き、「unexpected EOF」メッセージが LOGレベルから DEBUG1レベルに変更されました。(Magnus Hagander)
実行時統計情報ビュー
- pg_stat_databaseシステムビューで一時ファイルのサイズと件数が追跡できるようになりました。(Tomas Vondra)
- デッドロックカウンタが pg_stat_databaseシステムビューに追加されました。(Magnus Hagander)
デッドロック発生回数が記録されます。
- 設定項目 track_io_timing が追加されました。(Ants Aasma, Robert Haas)
- チェックポイントタイミング情報が収集され、pg_stat_bgwriter で確認できるようになりました。(Greg Smith, Peter Geoghegan)
サーバ設定
- search_path に設定されていても、存在しないスキーマは暗黙的に無視されるようになりました。(Tom Lane)
- 管理者ユーザが deadlock_timeout の値をクラスターごとでなく、セッションごとに設定できるようになりました。(Noah Misch)
SET文、SET LOCAL文による指定が可能となり、デッドロックの可能性のあるトランザクションだけ短いタイムアウトを指定するといった使い方が可能となります。以前は、設定ファイルを変更して reload が必要でした。
- セッションごとの一時ファイル容量を制限するために、temp_file_limit が追加されました。(Mark Kirkwood)
- 関連付けられた拡張モジュールが読み込まれる前に、管理者ユーザが SET文で専用のカスタム変数を設定できるようになりました。(Tom Lane)
管理者ユーザが SETを行ったかどうかは、システムで記憶されます。
- postmaster に設定パラメータを問い合わせる -C オプションが追加されました。(Bruce Momjian)
これにより、pg_ctl の PGDATA や -D オプションで設定のみのディレクトリを指定する場合の取扱いが改善されました。以下のように使用します。
$ postmaster -C shared_buffers 4096 $ postmaster -C archive_mode off
- CREATE DATABASE 時に空のロケール名をデフォルト値に置き換えるようになりました。(Tom Lane)
これにより、pg_database.datcollate もしくは pg_database.datctype がサーバ再起動時に異なる解釈をされることを防ぎます。
これまで、COLLATE と CTYPE に空文字列を指定すると、警告が出るけれど空文字列のまま設定されました。
postgresql.conf
- postgresql.conf の誤りが最初の1件だけでなく複数報告されるようになりました。(Alexey Klyukin, Tom Lane)
- 特定のセッションで無効となっている設定がある場合でも、全てのプロセスが postgresql.conf を再読み込みするようになりました。(Alexey Klyukin)
これまでは、特定セッションで無効の設定がある場合、全ての設定の変更がそのセッションのために無視される原因となっていました。
- 設定ファイル用に include_if_exists が追加されました。(Greg Smith)
これは、設定ファイルが存在しない場合でもエラーを発生させないことを除いて、include と同じ振る舞いをします。
- initdb 時にサーバのタイムゾーンを特定し、postgresql.conf の timezone と log_timezone に設定を書き込むようになりました。(Tom Lane)
これによりサーバ起動時に処理コストを要するタイムゾーン調査をしなくて済みます。
- Windows で pg_settings ビューが postgresql.conf の行番号を正しく表示するようになりました。(Tom Lane)
レプリケーションとリカバリ
- ストリーミングレプリケーションにおいて、スレーブサーバが他のスレーブサーバに対してデータを転送できるようになりました。(Fujii Masao)
これまでは、マスターサーバのみがストリーミングレプリケーションのログファイルをスタンバイサーバに送信できていました。
本変更はよく、カスケードレプリケーションに対応した、という言い方をされます。
- synchronous_commit に remote_write モードが追加されました。(Fujii Masao, Simon Riggs)
このモードでは、スタンバイサーバが自身の OS にトランザクションデータを書き込むのを待つように指定できます。ただし、スタンバイサーバのディスクにデータがフラッシュされるまで待つわけではありません。
- 標準付属ツールに pg_receivexlog が追加されました。(Magnus Hagander)
アーカイブWALファイルをリモートの PostgreSQLサーバから取得する専用ツールです。WALファイルの完成を待たず、更新が発生するたびにデータ取得し、変更を書き込みます。
- pg_basebackup がバックアップの実行中、WALファイルをストリーミングできるようになりました。(Magnus Hagander)
これにより、プライマリサーバが WAL ファイルを破棄する前に、スタンバイサーバへ WAL ファイルを渡すことができます。
- pg_basebackup がスタンバイサーバからデータ取得することができるようになりました。(Jun Ishizuka, Fujii Masao)
クエリー
- クライアントの接続が切れたことが検知できた場合、クエリがキャンセルされるようになりました。(Florian Pflug)
クライアント接続に対する write() システムコールに失敗した場合に接続が切れたと判断します。
- 行値の式でカラム名が維持されるようになりました。(Andrew Dunstan, Tom Lane)
行の値を hstore型や JSON型に変換するときにカラム名を利用することができます。
- サブクエリーの表示結果で用いられるカラム名が改善されました。(Marti Raudsepp)
これまでは、?column? が用いられていました。
- 9.2 の出力
-
=# SELECT (SELECT id FROM t1 ) ; id ---- 1
- 以前の出力
-
?column? ---------- 1
- 値の不明なデータ型を決定するヒューリスティックが改善されました。(Tom Lane)
不明な定数は演算子のもう一方と同じ型であるとするという以前からの推定方法が、単純な演算子の一致のみならず、多相演算子を考慮したときにも適用されるようになりました。
- DOMAIN型へのキャスト、DOMAIN型からのキャストに対して警告するようになりました。(Robert Haas)
これらキャストは無効です。
- 列に対する CHECK 制約か NOT NULL 制約が失敗した場合、エラーの詳細として列の内容を表示するようになりました。(Jan Kundrat)
これによって、大量の行に insert や update を実行しているときに、問題のある列を発見しやすくなりました。
オブジェクト操作(DDL命令)
- DDL命令を同時実行について信頼性が向上しました。(Robert Haas, Noah Misch)
ロックを追加して多くのケースで「ERROR: cache lookup failed for ...」というエラーが生じないようになりました。
また、スキーマにテーブル等を追加する操作と、スキーマから削除する操作が同時に実行できなくなります。これはシステムカタログの不整合を引き起こしていました。
- DROP INDEX に CONCURRENTLY オプションが追加されました。(Simon Riggs)
これにより他のセッションをブロックせずにインデックスを削除できます。
- 外部データラッパーがカラムごとのオプションを持てるようになりました。(Shigeru Hanada)
- ビュー定義の表示が改良されました。(Andrew Dunstan)
自動で改行が入るようになります。
制約
- CHECK 制約で NOT VAILD が宣言できるようになりました。(Alvaro Herrera)
NOT VALID を指定した CHECK 制約は、既存の行については制約を満たしているか検査しません。INSERT や UPDATE をしたときには検査されます。ALTER TABLE VALIDATE 文で既存の行について検査させることもできます。
以下に実行例を示します。
=# ALTER TABLE t1 ADD CHECK (id > 1) NOT VALID; ALTER TABLE =# SELECT * FROM t1 WHERE id = 1; id | v ----+---------------------------------- 1 | c4ca4238a0b923820dcc509a6f75849b (1 row) =# ALTER TABLE t1 VALIDATE CONSTRAINT t1_id_check; ERROR: check constraint "t1_id_check" is violated by some row =# update t1 set v = 'a' WHERE id = 1; ERROR: new row for relation "t1" violates check constraint "t1_id_check" DETAIL: Failing row contains (1, a).
- CHECK 制約で NO INHERIT が宣言できるようになりました。(Nikhil Sontakke, Alex Hunsaker, Álvaro Herrera)
この制約は親テーブルのみに有効で、子テーブルには適用されません。
- 制約の名前を変更できるようになりました。(Peter Eisentraut)
ALTER文
- いくつかの ALTER TABLE 操作でテーブルとインデックスを作り直す必要がなくなりました。(Noah Misch)
テーブル変更のうち、以下の処理ではテーブル作り直しが不要となります。
- varchar型、varbit型におけるサイズ上限の拡張あるいは上限撤廃
- numeric型の精度の拡大
- 制限付き numeric型から制限なし numeric型への変更
- interval型、timestamp型、timestamptz型の精度変更
以前は以下のように変更にともなって、テーブルが作り直され、格納されるファイルが変更されていました(relfilenode が変わることでわかります)。
=# CREATE TABLE t1 (id int primary key, v varchar(10)); CREATE TABLE =# SELECT oid, relname, relfilenode FROM pg_class WHERE relname = 't1'; oid | relname | relfilenode -------+---------+------------- 37177 | t1 | 37177 (1 row) # ALTER TABLE t1 ALTER v TYPE varchar(11); ALTER TABLE =# SELECT oid, relname, relfilenode FROM pg_class WHERE relname = 't1'; oid | relname | relfilenode -------+---------+------------- 37177 | t1 | 37182 (1 row)
- 必要がない状況では、ALTER TABLE が外部キー制約を再確認しなくなりました。(Noah Misch)
- いくつかの ALTER 文に IF EXISTS オプションが追加されました。(Pavel Stehule)
たとえば、ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar などに追加されています。
- ALTER FOREIGN DATA WRAPPER 文 と ALTER SERVER 文に RENME 句が追加されました。(Peter Eisentraut)
- ALTER DOMAIN 文に RENAME 句が追加されました。(Peter Eisentraut)
なお、もともと ALTER TYPE文を使ってドメインの名前変更は可能でした。
- 存在しない制約に対して、ALTER DOMAIN ... DROP CONSTRAINT を実行した場合にエラーが発生するようになりました。(Peter Eisentraut)
さらに、従来と同じ振る舞いを選べるように IF EXISTSオプションが追加されました。
CREATE TABLE
- CREATE TABLE ... LIKE ... の参照元に外部テーブル、ビュー、複合型が指定できるようになりました。(Peter Eisentraut)
ビューと定義が一致するテーブルを作成することなどが可能となりました。
- CREATE TABLE ... LIKE ... がインデックスのコメントをコピーした際に発生 するインデックス名の競合を回避するようになりました。(Tom Lane)
- CREATE TABLE ... AS query で、query に EXECUTE を指定した場合における WITH NO DATA オプションとカラム名特定の扱いが修正されました。(Tom Lane)
これまでは EXECUTE を使う場合には WITH DATA が指定できず、カラム名指定もできませんでしたがドキュメントに明記されていませんでした。
以下は以前のエラーになる例です。9.2 バージョンではエラーなく実行できます。
=# PREPARE p1 AS SELECT * FROM t WHERE id = 1; PREPARE =# EXECUTE p1; id | date ----+---------------------------- 1 | 2011-11-24 11:24:49.675427 (1 row) =# CREATE TABLE t1 AS EXECUTE p1; SELECT 1 =# CREATE TABLE t2 AS EXECUTE p1 WITH DATA; ERROR: syntax error at or near "WITH DATA" =# CREATE TABLE t3 (id, v) AS EXECUTE p1; ERROR: column name list not allowed in CREATE TABLE / AS EXECUTE
オブジェクトアクセス許可
- ビューに security_barrier オプションが追加されました。(KaiGai Kohei, Robert Haas)
ビューに対する SELECT文の WHERE句に安全でない関数を与えることで、本来出力されない値が読み出されてしまうケースが知られています。本オプションは、ビューによって保護されていたデータが最適化によって露出してしまうのを防ぎます。
ただし、本オプションを無効にした(デフォルト動作)ビューに比べると性能で劣ります。
- 関数に LEAKPROOF属性が追加されました。(KaiGai Kohei)
関数が security_barrier の働きを有効にしなくとも安全であることを宣言するものです。管理者ユーザのみ属性を付与することができます。
- データ型とドメインに対するUSAGE権限がサポートされました。(Peter Eisentraut)
- SELECT INTO / CREATE TABLE AS 時に INSERT 権限を確認するようになりました。(KaiGai Kohei)
ユーティリティ
- VACUUM がロック取得できないページをより容易にスキップできるようになりました。(Simon Riggs, Robert Haas)
これによって VACUUM の滞留が劇的に減少します。
- EXPLAIN (ANALYZE, BUFFER) でダーティになったブロック、書き込まれたブロックをカウントするようになりました。(Robert Haas)
- EXPLAIN ANALYZE がフィルタ条件に一致しなかった行数を報告するようになりました。(Marko Tiikkaja)
- EXPLAIN ANALYZE が時間計測を必要としないときにはそのためのオーバヘッドを避けるようになりました。(Tomas Vondra)
TIMING オプションを FALSE としたときそのようになります。
データ型
- いくつかの範囲データ型がサポートがされるようになりました。(Jeff Davis, Tom Lane, Alexander Korotkov)
元となるデータ型の下限値と上限値の二つの値の組で構成され、含まれるか、重なりがあるか、などの演算子を備えます。
- jsonデータ型が追加されました。(Robert Haas)
JSON(JavaScript Object Notation)データを格納し、書式が適切であるかチェックされます。
- array_to_json() 関数、row_to_json() 関数が追加されました。(Andrew Dunstan)
配列、行データからjsonデータ型にそれぞれ変換します。
- データ型に smallserial型が追加されました。(Mike Pultz)
格納サイズが 2 バイトである以外は、serial型と変わりありません。
- ドメイン定義の作成、変更時に NOT VALID が宣言できるようになりました。(Alvaro Herrera)
このオプションはドメイン定義の作成時か、ALTER DOMAIN ... ADD CONSTRAINT ... NOT VALID によって有効になります。ALTER DOMAIN ... VALIDATE CONS TRAINT で、制約が満たされているか検証することができます。
- moneyデータ型がより多くのロケール固有形式オプションをサポートするようになりました。(Tom Lane)
POSIX で規定された値と符号、通貨記号の順序に従うようになりました。典型的にはユーロ記号が規定どおり金額の後に置かれるようになります。また、3桁ごとの区切り記号が必ず小数点の左側だけに挿入されるようになります。
- macaddrデータ型でビット単位の and 、or 、not 演算子が使用可能になりました。(Brendan Jurd)
- xpath() でスカラー値を単一要素の XML 配列を返せるようになりました。(Florian Pflug)
これまで libxmlライブラリからスカラー値が与えられた場合、空配列が返っていました。また、xpath_exists() で同様の式で false でなく true が返るようになりました。
- XML のエラー処理がより堅牢になりました。(Florian Pflug)
関数
- 管理者ユーザ以外のユーザが pg_cancel_backend() と pg_terminate_backend() を同ユーザが開始したセッションに対して使えるようになりました。(Magnus Hagander, Josh Kupershmidt, Dan Farina)
以前は管理者ユーザのみが使用可能でした。
- トランザクションのスナップショットをインポート・エクスポートできるようになりました。(Joachim Wieland, Tom Lane)
これにより、データベースの状態を表示した特定のビューを、複数のトランザクションで共有できるようになりました。スナップショットのエクスポートは pg_export_snapshot() 、インポートは SET TRANSACTION SNAPSHOT を用います。インポートは、現在実行中のスナップショットのみが可能です。
並行に同時点のデータを取り出す目的などに利用できます。
- あるセッションで
-
=# BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN =# SELECT pg_export_snapshot(); pg_export_snapshot -------------------- 000008F2-1 (1 row) =# SELECT * FROM t1 OFFSET 0; :
- 別のセッションで
-
=# BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN =# SET TRANSACTION SNAPSHOT '000008F2-1'; SET =# SELECT * FROM t1 OFFSET 100000; :
- COLLATION FOR (...) 構文がサポートされました。(Peter Eisentraut)
式に対して、その式の COLLATE をあらわす文字列を返します。
=# SELECT COLLATION FOR ('xxx'::text COLLATE "ja_JP.utf8"); pg_collation_for ------------------ "ja_JP.utf8" (1 row)
- pg_opfamily_is_visible() 関数が追加されました。(Josh Kupershmidt)
- pg_xlog_location_diff() 関数と共に使用するために、pg_size_pretty() 関数の引数に numeric型を指定できるようになりました。(Fujii Masao)
- pg_trigger_depth() 関数が追加されました。(Kevin Grittner)
これは、現在のトリガーの呼び出し深度を表示します。
- string_agg() 関数が bytea型のデータを処理できるようになりました。(Pavel Stehule)
- 後方参照を行う正規表現が修正されました。(Tom Lane)
以前のバージョンでは最初の後方参照でチェックが行われていませんでした。
以下の2番目は本来 false となるべきです。
9.1.5 バージョンの動作例
=# SELECT 'abc abc abc' ~ '^(w+)( 1)+$'; ?column? ---------- t (1 row) =# SELECT 'abc zzz abc abc' ~ '^(w+)( 1)+$'; ?column? ---------- t (1 row)
情報スキーマ
- 情報スキーマのビューに、role_udt_grants 、udt_privileges 、user_defined_types が追加されました。(Peter Eisentraut)
- 情報スキーマの element_types のビューに、複合型の属性が追加されました。(Peter Eisentraut)
- 情報スキーマに interval_type 列が実装されました。(Peter Eisentraut)
これまでは、この列の値は NULL でした。
- 情報スキーマの attributes、columns、domains、element_types の各ビューに照合関係のカラムが実装されました。(Peter Eisentraut)
- 情報スキーマの table_privileges ビューに with_hierarchy 列が実装されました。(Peter Eisentraut)
- 情報スキーマに USAGE権限の表示順序が追加されました。(Peter Eisentraut)
- 情報スキーマがデフォルトの権限を表示するようになりました。(Peter Eisentraut)
これまでは、空欄でないデフォルトの権限はビューに表示されませんでした。
手続き言語
PL/pgSQL
- PL/pgSQL で OPEN cursor コマンドに引数を与えられるようになりました。(Yeb Havinga)
引数名での指定もできます。
- PL/pgSQL に例外情報を回収する GET STACKED DIAGNOSTICS 文が追加されました。(Pavel Stehule)
- 型情報のキャッシュを行うことで PL/pgSQL の配列割り当てが高速化されました。(Pavel Stehule)
- 多量の ELSEIF 句を実行する際のパフォーマンスとメモリ消費が改善されました。(Tom Lane)
- PL/pgSQL のエラーメッセージが、関数のシグニチャを表示するようになりました。(Pavel Stehule)
PL/Python
- PL/Python で SPI カーソルがサポートされました。(Jan Urbanski)
結果セットの部分的な読み取りが可能となります。
- PL/Python 関数の結果オブジェクトのメタデータが追加されました。(Peter Eisentraut)
.colnames、.coltypes、.coltypmods が加わりました。
- Python 2.2 のサポートが打ち切られました。(Peter Eisentraut)
SQL関数
- SQL言語の関数で引数を引数名指定できるようになりました。(Matthew Draper)
以下のように関数定義の中で引数名をそのまま使うことができます。
=# CREATE FUNCTION fp(param1 int) RETURNS t1 LANGUAGE sql AS $$ SELECT * FROM t1 WHERE id = param1; $$;
クライアントアプリケーション
- initdb コマンドのオプションに --auth-local と --auth-host が追加されました。(Peter Eisentraut)
このオプションは、pg_hba.conf の認証設定で local、host を別々に制御します。--auth オプションは今までと変わらず、両方の接続方式を制御します。
- レプリケーション権限を制御するために、 createuser コマンドのオプションに --replication と --no-replication が追加されました。(Fujii Masao)
- dropdbコマンドと dropuserコマンドに --if-exists オプションが追加されました。(Josh Kupershmidt)
- 各コマンドラインルーツは、接続しようとしたデータベース名を特定でき、また、postgres データベースに接続に失敗した場合、template1 データベースに接続し直すことができるようになりました。(Robert Haas)
psql
- psql で、ディスプレイの幅に合わせて出力結果が自動的に拡張テーブル形式モードに切り替わるようになりました。(Peter Eisentraut)
この機能は、x コマンドの auto オプションで有効となります。
- psql が実行しているSQLスクリプトファイルからの相対パス指定で SQLスクリプトファイルの挿入ができるようになりました。(Gurjeet Singh)
新たに追加された ir コマンドを使用します。
- psql の変数名にASCIIでない文字列もサポートされるようになりました。(Tom Lane)
- PostgreSQLメジャーバージョンを限定した .psqlrc ファイルがサポートされました。(Bruce Momjian)
.psqlrc-9.2 という名前にすると 9.2系列で有効になります。
- 環境変数で psql のヒストリファイルとスタートアップファイル(.psqlrc)を設定変更できるようになりました。(Andrew Dunstan)
PSQL_HISTORY、PSQLRC でファイル名を指定できます。
- 子プロセスに引き継がれた環境変数を修正できるように psql に setenv コマンドが追加されました。(Andrew Dunstan)
- psql 内から起動されるエディタの一時的なファイルに .sql サフィックスを使うようになりました。(Peter Eisentraut)
これにより、ファイル名でエディタの編集モードが選択される場合に適切なモードを選べるようになります。
- psql がゼロバイトのフィールドと行の区切りを使用できるようになりました。(Peter Eisentraut)
様々なシェルツールが、ゼロバイト (0x00、NUL) を区切りに用います(例 find コマンド)。
- psql が iming オプションで、クエリが失敗した際の所要時間を表示できるようになりました。(Magnus Hagander)
これまでは、クエリ成功時の所要時間のみが表示されていました。
- psql において copy コマンドと SQL の COPY文の扱いが統一されました。(Noah Misch)
誤った振る舞いが修正され、より想定される動作をするようになります。また、set ON_ERROR_ROLLBACK の設定を尊重するようになります。
情報取得コマンド
- psql でシーケンスを指定した d コマンドが、そのシーケンスを所有するテーブル/カラムを表示するようになりました。(Magnus Hagander)
serial型のカラムによって作成されたシーケンスが該当します。
- psql の d+ が統計情報エントリ数を表示するようになりました。(Magnus Hagander)
「ALTER TABLE .. ALTER .. SET STATISTICS ..」でカラムごとに設定された統計情報のエントリ数が参照できるようになります。
- psql で du がロールのパスワードの有効期限を表示するようになりました。(Fabrízio de Royes Mello)
- psql でキャスト、文字セット符号化方式間の変換、ドメイン、手続き言語のコメントが表示されるようになりました。(Josh Kupershmidt)
これらは、dC+ 、dc+ 、dD+ 、dL の出力結果に含まれています。
- psql で SQL/MED オブジェクトのコメントが表示されるようになりました。(Josh Kupershmidt)
外部サーバ、外部テーブル、外部データラッパのコメントは、 des+ 、det+ 、dew+ の出力結果に含まれています。
- psql で dd が オブジェクトのコメントのみを表示するようになりました。(Josh Kupershmidt)
タブ補完
- psql で COMP_KEYWORD_CASE によって SQL 構文のタブ補完を大文字か小文字に指定できるようになりました。(Peter Eisentraut)
- psql で EXECUTE 文でもタブ補完ができるようになりました。(Andreas Karlsson)
- psql で GRANT/REVOKE 文でロールを参照する際にタブ補完ができるようになりました。(Peter Eisentraut)
- psql でファイル名をタブ補完する時に必要であればクオートするようになりました。(Noah Misch)
- psql でテーブル名をタブ補完する時はビューも含めるようになりました。(Magnus Hagander)
pg_dump
- pg_dump に --exclude-table-data オプションが追加されました。(Andrew Dunstan)
このオプションで、指定したテーブルのテーブル定義のみをダンプできるようになります。
- pg_dump と pg_restore に --section オプションが追加されました。(Andrew Dunstan)
有効値は pre-data、data、post-data です。それぞれ、テーブル定義、データ投入、インデックス作成、が含まれます。これらの一部だけダンプしたり、リストアすることができます。このオプションには複数セクションを指定
可能です。 - pg_dumpall が全てのロールをダンプした後に、ロールの設定をダンプするようになりました。(Phil Sorber)
これにより、ロールの設定がエラーを発生させること無く、他のロールを参照できるようになりました。
- 新しいクラスタに postgres データベースが存在しない場合でも、pg_dumpall がエラーにならなくなりました。(Robert Haas)
- ユーザの名前順に外部サーバのユーザーマッピングをダンプするようになりました。(Peter Eisentraut)
これにより、常に同じダンプファイルが作成されます。
- 演算子を予測できる順序でダンプするようになりました。(Peter Eisentraut)
- 拡張モジュールの設定用テーブルを pg_dump でダンプするかどうかの規則が厳密になりました。(Tom Lane)
- pg_dump がより有用な依存情報を出力するようになりました。(Tom Lane)
pg_restore でリストアする形式のときに出力されるオブジェクト依存関係が改善され、ダンプにあらわれないオブジェクトを経由した間接的な依存関係も表現できます。
- 多量のデータベースオブジェクトをダンプする際の、pg_dump のパフォーマンスが改善されました。(Tom Lane)
libpq
- libpq の接続文字列が、URI フォーマットに対応しました。(Alexander Shulgin)
以下のような記述形式となります。
postgresql://localhost:5433 postgresql://localhost/mydb postgresql://user@localhost postgresql://user:passwd@localhost postgresql://other@localhost/otherdb?connect_timeout=10
- SSLデータ圧縮を禁止する接続オプションが追加されました。(Laurenz Albe)
速いネットワークにおけるマシン負荷軽減の目的に利用できます。
- 大きい結果セットの処理用に一行処理モードが追加されました。(Kyotaro Horiguchi, Marko Kreen)
これまで libpq は常にクエリ結果全体をメモリに収めていました。
- PQconnectdbParams 、PQconnectStartParams 、PQpingParams 関数の宣言に、const 修飾子が追加されました。(Lionel Elie Mamane)
- .pgpass ファイルでパスワードフィールドにエスケープされた文字が使えるようになりました。(Robert Haas)
- プロセスを終了する必要がある際に、ライブラリ関数が exit() のかわりに abort() を使うようになりました。(Peter Eisentraut)
呼び出し元はプロセス終了前にシグナルを受け取ることができるようになります。
ソースコード
- いくつかのプラットフォームのサポートを打ち切りました。(Peter Eisentraut)
dgux、nextstep、sunos4、svr4、ultrix4、univel、bsdi、のサポートが終了となります。
- Visual Studio 2010 によるビルドに対応しました。(Brar Piening)
- MinGW-w64 32-bit コンパイラに対応しました。(Lars Kanis)
- インストール時に include/server に plpgsql.h が追加されるようになりました。(Heikki Linnakangas)
- サーバ親プロセス(postmaster)が死んだことを検知できるようにラッチ機構が改善されました。(Peter Geoghegan, Heikki Linnakangas, Tom Lane)
- サポートされているなら、C のフレキシブル配列メンバを使用するようになりました。(Peter Eisentraut)
- 同時トランザクション再帰テスト(isolationtester)が改善されました。(Noah Misch)
- thread_test がテストファイルを /tmp ディレクトリからカレントディレクトリに生成するようになりました。(Bruce Momjian)
- flex と bison の警告とエラー報告が改良されました。(Tom Lane)
- メモリバリアのサポートが追加されました。(Robert Haas)
- pgindent が typedef ファイルを使用できるようになりました。(Bruce Momjian)
- サーバログに送られるメッセージ処理のフックが加わりました。。(Martin Pihlak)
- DROP コマンドのオブジェクトアクセスフックが追加されました。(KaiGai Kohei)
- DROP がいくつかのオブジェクトタイプを扱うのが集中化されました。(KaiGai Kohei)
- pg_upgrade 用のテストスイートが追加されました。(Peter Eisentraut)
- 正規表現のコードが TCL 8.5.11 と同期され、内部処理が改善されました。(Tom Lane)
- CRCテーブルが libpgport に移動しました。(Daniel Farina)
ヘッダファイル pg_crc.h、pg_crc_tables.h も追加されます。
- メジャーバージョンのリリースノート作成時に使用可能な、git_changelog が src/tools/ に追加されました。(Bruce Momjian)
- Linux の /proc/self/oom_score_adj API がサポートされました。(Tom Lane)
ただし、現時点では使われていません。
追加モジュール
- libpq の 新しい一行処理モードを利用する contrib/dblink の処理効率が改善されました。(Kyotaro Horiguchi, Marko Kreen)
この変更は dblink_send_query()、dblink_get_result() 関数には効果がありません。
- contrib/file_fdw モジュールに force_not_null オプションが追加されました。(Shigeru Hanada)
- contrib/pg_archivecleanup モジュールに dry-run モード (-n) が追加されました。(Gabriele Bartolini)
削除しようとするアーカイブWALのファイル名を出力して終了します。
- contrib/pgbenchモジュールに新しいオプションとして、--unlogged-tables、--tablespace、--index-tablespace が追加されました。(Robert Haas)
- contrib/pg_test_fsync モジュールのオプションで、-o オプション(1テストあたりの操作数を指定する)が廃止され、-s オプション(1テストの実行時間を指定する)に変更されました。(Bruce Momjian)
- contrib/pg_test_timing ユーティリティが追加されました。(Ants Aasma, Greg Smith)
本ユーティリティを利用することで、サーバシステムの時間単調性や時間測定のオーバヘッドを確認できるようになりました。
- contrib/tcn モジュールが追加されました。(Kevin Grittner)
本モジュールを利用することで、テーブルデータの変更で、NOTIFY イベント(通知)メッセージを表示させることが可能になりました。
contrib/pg_upgrade
- pg_upgrade の環境変数が変更されました。(Bruce Momjian)
data, bin, port 環境変数は PG から始まる変数名にリネームされました。また、ポート番号を変更するために PGPORTOLD/PGPORTNEW がサポートされました。
- pg_upgrade のログファイルの出力方法が変更されました。(Bruce Momjian)
処理中にアクセス権が追加のみである4つのログファイルが生成され、処理が成功したら削除されます。-r、--retain オプションを指定することで、処理成功後もログファイルが削除されずに残ります。従来ログファイル出力を
指定していた -g、-G、-l オプションが削除されました。 - pg_upgrade が移行先クラスタ用の統計情報収集スクリプトファイルを生成するようになりました。(Bruce Momjian)
これにより、移行処理後の統計情報の収集時間を短縮できるようになりました。
- pg_upgrade コマンドで postgres データベースが存在しないクラスタを移行できるようになりました。(Bruce Momjian)
- pg_upgrade がデータベースが存在しないケースについて、空であるものとして扱えるようになりました。(Bruce Momjian)
- pg_upgrade コマンドで configuration-only directory でインストールされたサーバを移行できるようになりました。(Bruce Momjian)
- pg_upgrade コマンドに -o、-O オプションが追加されました。(Bruce Momjian)
指定されたオプション文字列が直接に移行元/先サーバの postgres コマンドのオプションとして付けられます。
- pg_upgrade 実行中に意図しないクライアントの接続を避けるため、pg_upgrade のデフォルトポートが 50432 へ変更されました。(Bruce Momjian)
- pg_upgrade 処理中のロックが減少しました。(Bruce Momjian)
具体的には、リンクモードが使われている場合、移行元のみがロックされます。なお、ロック動作はスキーマがリストアされた後に行われます。
contrib/pg_stat_statements
- contrib/pg_stat_statements でSQLテキストの正規化によって、同様のクエリを集約することができるようになりました。(Peter Geoghegan, Tom Lane)
ユーザアプリケーションでパラメタ化されていない SQL であっても、詳細なログ分析なしでクエリ性能を監視することが可能になりました。
- contrib/pg_stat_statements の集計項目に、ダーティになったブロック数、書き込まれたブロック数、および、ブロック読み書き時間が加わりました。(Robert Haas, Ants Aasma)
- contrib/pg_stat_statements で PREPARE と EXECUTE コマンドでの二重計上をしないようになりました。(Tom Lane)
SE-pgsql
- SECURITY LABEL文がグローバルオブジェクトをサポートします。(KaiGai Kohei, Robert Haas)
特にデータベース、テーブルスペース、ロールに対してセキュリティラベルを付与することができます。
- sepgsql がデータベースのラベルを扱えるようになりました。(KaiGai Kohei)
- 様々なオブジェクトを生成する際に sepgsql の権限チェックを行うようになりました。(KaiGai Kohei)
- sepgsql_setcon() と関連関数に sepgsql のセキュリティドメインを制御する機能が追加されました。(KaiGai Kohei)
- 性能改善のために sepgsql にユーザ空間アクセスキャッシュが追加されました。(KaiGai Kohei)
ドキュメント
- オプションで website のスタイルシートを使って HTML ドキュメントを作成するルールが追加されました。(Magnus Hagander)
「gmake STYLE=website draft」の指定を使用します。
- EXPLAIN のドキュメントが改善されました。(Tom Lane)
- vacuumdb などのコマンドラインツールでは、ユーザやデータベース名がダブルクオートで保護されることがドキュメント記載されました。(Bruce Momjian)
- ドキュメントにMD5認証でクライアントから返される実際の文字列を記載しました。(Cyan Ogilvie)
プロトコル説明でMD5認証の部分の記述が改善されました。
- CREATE TEMP TABLE で GLOBAL と LOCAL の指定を使わないものとします。(Noah Misch)
PostgreSQL では長い間、これらのキーワードを効果のない物として扱ってきており、これからもそうします。しかし将来、SQL標準で意味をもつものとされる可能性があります。アプリケーションはこれらの使用を避けるべきです。