PostgreSQL 8.2 に関する技術情報

このリリースは PostgreSQL 8.2 (2006/12/05リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

概要

性能面、運用面、新文法等による使いやすさが向上したリリースです。

  • 細かい部分のチューニングによる性能向上
    • ソート処理が見直され、性能、使用メモリ量両面で性能が向上しました。
    • より効率的なロッキングと同時実効性能の改善により、より多数の CPU を搭載したマシンでの性能が改善しました。
    • FILLFACTOR 要素が追加されたことにより、テーブルとインデックスの更新時の性能を改善することを可能に。
    • クエリープランの改良による、問い合わせ速度の向上。特に、外部結合の並び替えを自動で行うようになりました。
    • インデックスに対する効率的なバキューム
  • 運用面での改良
    • WAL ファイルとアーカイブログの処理を見直し、PITR の運用面の問題を解消したほか、ウォームスタンバイサーバの設置を可能にできるような形になりました
    • 監視、ロギング、パフォーマンスチューニングのための機能が追加されまた。
    • INSERT/UPDATE/DELETE と干渉しないインデックス生成
  • 新文法
    • INSERT/UPDATE 〜 RETURNING (挿入・更新した行をそのまま検索結果として返す)
    • VALUES に複数の値を記述可能に (1 つの INSERT 文で複数列を投入できるように)
    • VALUES 構文 (指定した値を結果として返す)
    • 自己 JOIN を使って DELETE が可能に。
    • COPY TO 文にテーブルだけでなく SELECT 文が指定可能 (SELECT 結果を CSV 等に吐く)
    • DDL の拡張による、オブジェクトに対するより細かい制御が可能に。
    • 継承関係を既存テーブルに追加削除可能
    • 配列・集約関数の改善。
      特に、SQL: 2003 準拠の関数が増えました。

互換性のない変更点

  • 変更された GUC
    変更前名称 変更先
    preload_libraries shared_preload_libraries
    australian_timezones timezone_abbreviations
  • バックスラッシュによるエスケープが標準で許可されなくなりました。代わりに E” と明示的にエスケープ可能に指定するか、escape_string_warning を off にしてください。
  • UPDATE 文に集約関数が使えなくなりました。標準ではない上、予測不能な結果をもたらすことがあります。使用したい場合は副問い合わせ中に使います。

複合型

  • 複合型の文法を変更し、例えば foo.* などと記述した場合、foo の型を展開します。展開により、例えばトリガで更新状況を確認するのに「IF row(new.*) IS DISTINCT FROM row(old.*)」のような記述が可能になりましたが、従来の挙動とは異なります。
  • row 同士の比較のうち、= と <> だけでなく、<、<=、>、>= も SQL 標準に沿うように変更されています。また、インデックススキャンに使えるようになりました。

制約

  • ALTER … SET CONSTRAINT 文で影響を受けるテーブルが 1 つになりました。以前のリリースでは複数のスキーマにまたがって同名のテーブルがあった場合、それが全て影響を受ける形になっていました。

権限

  • テーブルに付与可能だった RULE 権限が付与不可になりました。ルールはそのオブジェクトの所有者とスーパーユーザーだけが利用可能になります。互換性維持のため、GRANT/REVOKE では RULE 権限を受け付けますが、実際には何もしません。

配列

  • 比較が変更されていて、列の次元数も評価の対象になります。
  • 配列同士の結合が仕様通りになっています。従前は勝手に低いほうの次元に合わせるようになっていました。

管理

  • postmaster で従前 -o オプションを使って指定していた各バックエンド用オプションはそのまま渡せるようになりました。
  • postmaster は従来ではシンボリックリンクでしたが、この挙動は従来のコマンドライン名比較でなく、オプションで切り替えるようになりました。シンボリックリンク名による認識は互換性のため残されます。
  • log_duration を指定したとき、query の内容が log_statement の設定により表示されないケースに置いても表示されるようになりました。従来のように log_statement と必ず対になるわけではありません。
  • to_char() で、「HH」、「HH12」が 12 時間表記になります。24 時間表記が必要な場合「HH24」を使ってください。
  • Nested Loop 上でのインデックススキャンのコスト見積もりが改善されました。これは従前適切なプランを得るために random_page_cost を非常に小さく (主に 1 未満) しなければならなかったケースで有効です。そのようなことを実施されている場合、アップグレード時にこの値を変更する必要があります。

libpq

  • PQdsplen() の仕様が変更になっています。これはよりよい値を返しますが、従来とは異なる挙動です。
  • PQgetssl() の返り値が void * に変更になりました。そのため、SSL のヘッダ無しに libpq を利用できます。

contrib

サポートされなくなったプラットフォーム

  • BEOS、QNX

性能改善

  • shared_buffers、max_fsm_pages のデフォルト設定最大値が増加しました。
    • shared_buffers は 1000 (標準ブロックサイズで 8MB) から 32MB に
    • max_fsm_pages は 20000 から 204800 に
  • FILLFACTOR 要素が追加されました。
    これはディスクブロックに対してタプルの「空き」を事前に作っておくことで、更新時にその「空き」を使えるようにするものです。これにより更新時の「更新タプル取得」→「空きを確認」→「空いていないので別のブロックを確保」という動作を減らします。
  • 全体的にロックを見直し、競合を減らしました。これにより同時実効性能が向上しています。
    • ロック管理テーブルを一括管理から変更し、セクション分けしました。
    • シーケンシャルスキャン時のロック減。
    • データベース作成/破棄時のロック減。
  • IN (数リスト) の効率
  • ソート処理が高速化し、かつメモリ使用量も減少しました。
  • savepoint 使用時の性能が向上しました。
  • libpq のプロトコル見直しにより、COPY 文の性能が向上しました。
  • プランナによる outer join の並び替えが可能に。従来は outer join 記述に沿った結合のみが行われていました。
  • like、ilike、正規表現検索での統計情報利用を改善し、統計精度の向上。
  • UNION ALL あるいは継承したテーブルのプラン作成のパフォーマンスが向上。
  • Constraint Exclusion (いわゆるパーテーショニング機能) が、SELECT だけでなく UPDATE や DELETE も対象に出来るようになりました。
  • min()、max() のインデックスへの置き換えが出来るケースが増えました。
  • インデックスのないテーブルに対する vacuum で、スキャン回数を最適化しました。
  • btree インデックス
    • vacuum が高速化しました。
    • ページがいっぱいになり分割される直前に、使用されていないエントリを取り除くようになりました。
  • GiST でマルチカラムインデックスの性能が改善しました。

サーバに関する変更

  • 追加された GUC
    名称 概要
    archive_timeout xlog の強制アーカイブ化時間
    gin_fuzzy_search_limit GIN インデックスの「曖昧検索」閾値
    local_preload_libraries プラグインのロード指定
    seq_page_cost 従来 1 固定だったシーケンシャルスキャンのコスト見積もり係数
    server_version_num バージョン数値
    update_process_title ps で表示される、SQL 文などの文字列を更新するか
  • ウォームスタンバイサーバ (postmaster が起動したまま待機系として存在する) を実現するための機能が追加されました。
    • pg_stop_backup() 関数で強制的に xlog ファイルを切り替えるようになりました。これにより、pg_stop_backup() 時に自動的に有効なスタンバイサーバーを構成できる情報が揃うようになりました。
    • WAL に関する情報を収集する関数が追加されました。
    • WAL を適用中にクラッシュが発生した状況からもう一度リカバリを開始するときに、今まで適用したログをスキップするようになりました。
    • 長期間の WAL 適用時の信頼性を向上しました。
    • GUC の archive_timeout により、指定時間ごとに強制的に xlog をスイッチさせることができます。ウォームスタンバイサーバーの遅延時間をある程度コントロールするのに役立ちます。
  • pg_hba.conf の認証方法として LDAP 認証を使うようになる、ldap が追加されました。
  • GRANT CONNECT ON DATABASE が追加されました。これにより pg_hba.conf 以外にもユーザー認証を設定できるようになります。
  • SSL CRL ファイル (Certificate Revocation List) をクライアント、サーバーの両方でサポートするようになりました。
  • GiST が CLUSTER コマンドをサポートしました。
  • 最後に vacuum された XID 記録が、データベース単位ではなくテーブル単位に設けられるようになりました。これにより、周回問題を回避するために常にデータベース全体を vacuum するのではなく、データベースの問題になっているテーブルだけを vacuum することでよくなりました。
  • 最後にいつ vacuum や analyze をしたか、という出力が統計情報収集機の pg_stat_*_tables に加わりました。
    tanida=# select * from pg_stat_user_tables limit 1;
    -[ RECORD 1 ]----+---------
    relid            | 16403
    schemaname       | public
    relname          | accounts
    last_vacuum      |
    last_autovacuum  |
    last_analyze     |
    last_autoanalyze |
  • pg_stat_activity に waiting カラムが追加されました。これはプロセスがロック待ち状態になっているかどうかを示します。従来 ps 出力で「waiting」と表示されていたものと同じです。
  • ps コマンドで出力される「SELECT」、「INSERT」、「waiting」などの出力をコマンドごとに更新するかどうかを選択できる GUC、update_process_title が追加されました。一部のプラットフォームでこの処理は負荷がかかるため、off にすることで性能を改善できます。
  • 設定パラメーターのうちサイズを指定するものについて、従来の値だけでなく量を指定できるようになりました。例えば、shared_buffers = 32M (32 メガバイト) と言うような指定が可能です。
  • postgresql.conf が include 書式をサポートしました。
  • max_stack_depth で、カーネルのスタック上限を超えた値を設定できないようになりました。
  • 構文エラーなどで、存在しなかったカラム名の場合その場所を示すようになるなど、より詳細に問題のある場所を特定できるようになりました。
    (8.2)
    tanida=# insert into accounts (aid,bid,bbalance) values(1,1,1);
    ERROR:  column "bbalance" of relation "accounts" does not exist
    LINE 1: insert into accounts (aid,bid,bbalance) values(1,1,1);
    
    (8.1)
    tanida=# insert into accounts (aid,bid,bbalance) values(1,1,1);
    ERROR:  column "bbalance" of relation "accounts" does not exist
  • b-tree インデックスを vacuum しているときに「failed to re-find parent key」エラーが発生して vacuum 出来ない問題を修正しました。
  • pg_internal.init ファイルが、再起動後に自動的に削除されるようになりました。残しておくと、PITR 時などで実態と合わない FSM 情報が読み込まれてしまうことがありました。
  • ギガバイト級の非常に大きなテーブルを vacuum したときに、競合状態が発生する問題を修正しました。
  • 行レベルロックで、本来は必要がないのにデッドロックが検出される問題を修正しました
  • 拡張プロトコルを使って PREPARE/BIND/EXECUTE の手続きを取る形で実行される問い合わせで、実行時間ログが取れなかったりする問題が修正されました。
  • full_page_writes が再び有効になりました。これは、チェックポイント直後の書き込みでトランザクションログに書き込むデータ量を削減するものです。

問い合わせ言語

  • INSERT/UPDATE/DELETE に RETURNING 句が追加されました。
    • INSERT の場合追加された行を返します。
    • UDPATE の場合変更後の行を返します。
    • DELETE の場合削除されることになった行を返します。
    • 8.1 以前のクライアントでは、これらの文で利用される、コマンドタグと結果の両方を返す挙動について正しく実装されていない可能性があり、その時は INSERT の行数などを取得できないことがあることがあります。その場合は 8.2 用を利用する必要があります。
    tanida=# d test
                             Table "public.test"
     Column |  Type   |                    Modifiers
    --------+---------+--------------------------------------------------
     i      | integer | not null default nextval('test_i_seq'::regclass)
     t      | text    |
    
    tanida=# insert into test (t) values ('test text') returning *;
     i |     t
    ---+-----------
     2 | test text
    (1 row)
    INSERT 0 1
  • INSERT に SQL 標準の、複数の VALUES 句を記述する挙動が可能になりました。一つの SQL で複数行の挿入が可能になります。
    tanida=# create table isnot1 (i integer);
    CREATE TABLE
    
    tanida=# insert into isnot1 (i) values (1), (2), (null);
    INSERT 0 3
    
    tanida=# select * from isnot1;
     i
    ---
     1
     2
    (3 rows)
  • VALUES 文が追加されました。これは、INSERT で挿入するのと同じ形式で、値を指定してそれをそのまま検索結果として返します。
  • UPDATE/DELETE 文でテーブルの別名が使えるようになりました。ただし、これは SQL 標準ではありません。
    tanida=# update accounts a set abalance=2 where a.aid=2;
    UPDATE 1
  • UPDATE 文の SET 句で (a,b)=(c,d) 形式の記述が可能になりました。
  • 行の比較が SQL 標準準拠になりました。
    (8.2)
    tanida=# select ROW(1,2)<(3,2);
     ?column?
    ----------
     t
    (1 row)
    
    (8.1)
    tanida=# select ROW(1,2)<(3,2);
     ?column?
    ----------
     f
    (1 row)
  • TRUNCATE 文に CASCADE 句が追加されました。外部キーで参照されている場合、参照元も自動で削除する危険な構文です。
  • FOR UPDATE 句と FOR SHARE 句が同じ SQL 文で同時に使えるようになりました。
  • IS NOT DISTINCT FROM が追加されました。= と似ていますが、一方が null でも比較が行われ、例えば null is not distinct from null は true (null=null は null) となります。
    tanida=# select a.i as a,b.i as b ,a.i is not distinct from b.i as isnotdis ,a.i=b.i as equal from isnot1a,isnot1 b;
     a | a | isnotdis | equal
    ---+---+----------+----------
     1 | 1 | t        | t
     1 | 2 | f        | f
     1 |   | f        |
     2 | 1 | f        | f
     2 | 2 | t        | t
     2 |   | f        |
       | 1 | f        |
       | 2 | f        |
       |   | t        |
    (9 rows)
    (空白は null の出力)
  • UNION/INSERSECT/EXCEPT で、関係する型のデータ長や精度が一致する場合に、結果についてもその情報を利用するようになりました。
  • ilike 構文による検索で、lower() を内部的に使うようになりました。これにより一般的なロケールの大文字小文字比較がそのまま ilike でも生きるようになりました。日本語では未だにロケールの off が推奨されているため、特に関係がありません。
  • standard_conforming_strings のデフォルトが on になっています。これは文字列内でバックスラッシュの仕様を許さない形です。そのような挙動を引き続き行う場合、当該 GUC を変更するか E” 表記を利用してください。
  • volatile な関数が副問い合わせに入っている場合、毎回評価する形に変更になりました。これは random()、nextval() などの volatile な関数が複数回実行されるときに予想外な結果をもたらすことがあったための措置です。例えば例の関数は通常 10 件返るはずですが、8.1 では望む通りの挙動にはなりません。これは関数の呼び出し回数が増加することを意味しているので、不用意に volatile を指定しているユーザー関数を副問い合わせに用いる場合、性能低下が起こることがあります。
    tanida=#  select aid from accounts where aid in (select (random()*1000)::int4  from generate_series(1,10));
    
    (8.2)
     aid
    -----
     754
     749
     981
     723
     457
     105
     870
     827
      58
     800
    (10 rows)
    
    (8.1)
     aid
    -----
     321
    (1 row)
  • pg_prepared_statements と pg_cursor ビューが追加されました。各々 prepare で準備された問い合わせ、存在しているカーソルを取得するのに使われます。またこれはコネクションプールなどで有効に活用できます。
  • EXPLAIN、EXECUTE 文で ? で指定するようなパラメータをサポートするようになりました。これにより、JDBC ドライバのような v3 プロトコルの拡張問い合わせを使うドライバでこれらのコマンドを実行できるようになります。
  • PREPARE 文でパラメータが指定されていない場合、クエリ本体から類推するようになりました。これはすでにプロトコルレベルでの PREPARE で行われていたものをそのまま PREPARE 文に対応させたものです。
  • LIMIT/OFFSET が約 2 億行以上をサポートするようになりました。

DDL 関係

  • CREATE TABLE AS
    • TABLESPACE が指定できるようになりました。
    • ON COMMIT 句が指定できるようになりました。これは TEMP (ORARY) 句と組み合わせて利用でき、より「コミット時に消える一時テーブル」を CREATE TABLE AS で作成できるようになります。
  • CREATE TABLE で、親テーブルと同様のテーブル構成を実現させる LIKE 句に、さらに INCLUDING CONSTRAINTS 句が指定できるようになりました。指定するとカラム定義だけでなく、制約も継承します。
  • CREATE TYPE で何も指定せずに定義可能な placeholder (あるいは shell) 型が作成できるようになりました。これにより、「型が存在する前にその方に対応する入出力関数が定義されていなければならない」という矛盾が消失し、入出力関数を伴う型の作成がより簡単になります。
  • 集約関数が複数の入力を受けられるようになりました。それを受けて、新しい集約関数の定義方法ができました。
  • ALTER ROLE PASSWORD NULL が追加されました。設定したパスワードを消すために利用します。
  • 多くのオブジェクトで DROP 〜 IF EXISTS 構文が利用可能になりました。これは該当するオブジェクトが存在しなかった場合にエラーを発生させません。
    tanida=# drop table if exists hogehoge;
    DROP TABLE
    
    tanida=# drop table if exists hogehoge;
    NOTICE:  table "hogehoge" does not exist, skipping
    DROP TABLE
  • OWNED というワードが追加されました。
    • DROP OWNED 構文で指定したロールが持っているオブジェクトを全て削除します。
    • REASSIGN OWNED 構文でオブジェクトの所有者をまとめて変更します。
    tanida2=# d
              List of relations
     Schema |   Name    | Type  |  Owner
    --------+-----------+-------+---------
     public | hogehoge  | table | tanida
     public | hogehoge2 | table | tanida3
     public | hogehoge3 | table | tanida2
    (3 rows)
    
    tanida2=# REASSIGN OWNED BY tanida2 TO tanida3;
    REASSIGN OWNED
    
    tanida2=# d
              List of relations
     Schema |   Name    | Type  |  Owner
    --------+-----------+-------+---------
     public | hogehoge  | table | tanida
     public | hogehoge2 | table | tanida3
     public | hogehoge3 | table | tanida3
    (3 rows)
    
    tanida2=# drop OWNED BY tanida3;
    DROP OWNED

シーケンスの権限

  • GRANT/REVOKE ON SEQUENCE 構文が追加されました。これはシーケンスの権限設定に使います。従来通り GRANT ON TABLE で設定することも可能です。
    • シーケンスの USAGE 権限を取得していても setval() が利用できなくなりました。currval() と nextval() は従前通り利用できます。
  • ALTER TABLE [NO] INHERIT 構文が追加されました。これは継承関係の追加解消に使います。
  • グローバルオブジェクト (データベースなど) のコメントがやはりグローバルに保存されるようになりました。これは pg_shdescription テーブルに格納されます。

その他のコマンド

  • DML と競合しない形でインデックスを更新する、CREATE INDEX CONCURRENTLY 構文が追加されました。ただし、CREATE INDEX 構文の標準がこのような挙動を示すわけではありません。
  • ユーザーからロックとその解除を行うことが出来る関数群が追加されました。従来 contrib/userlock を使うようなケースで利用できます。
  • COPY FROM 文で出力するものが、テーブルだけでなく、問い合わせを指定できるようになりました。
    tanida=# copy (select generate_series(1,3)) to stdout;
    1
    2
    3
  • COPY 文のコマンドタグが、コピーした行数を含むようになりました。
    tanida=# copy (select generate_series(1,3)) to '/home/tanida/hoge.csv';
    COPY 3
  • VACUUM で、他の concurrent vacuum の影響を受けずに行を削除できるようになりました。
  • initdb 時に、システムロケールや DateStyle を自動判別するようになりました。
  • initdb で出力されるメッセージ量が減りました。

データ型及び関数

  • 配列に null 要素を含めることが出来るようになりました。
  • 配列要素を更新する場合、既存配列次元で連続しない場合にも、真ん中を NULL 埋めする形で更新されるようになりました。
    tanida=# select * from a;
         i
    -----------
     {1,2,3,4}
    (1 row)
    
    (8.1)
    tanida=# update a set i[6]=3;
    ERROR:  invalid array subscripts
    
    (8.2)
    tanida=# update a set i[6]=3;select * from a;
    UPDATE 1
            i
    ------------------
     {1,2,3,4,NULL,3}
    (1 row)
  • 配列のサブセット比較、@>、<@、&& 演算子が作成されました。
    また、これは GIN で高速化可能です。

    tanida=# select * from art;
        i
    ---------
     {1,2}
     {3,4}
     {5,6}
     {2,3}
     {4,5}
     {1,2,3}
     {3,4}
     {5,6}
     {2,3}
     {4,5}
    (10 rows)
    
    tanida=# select * from art where i @> '{3}';
        i
    ---------
     {3,4}
     {2,3}
     {1,2,3}
     {3,4}
     {2,3}
    (5 rows)
    
    tanida=# select * from art where i <@ '{3,4,5}';
       i
    -------
     {3,4}
     {4,5}
     {3,4}
     {4,5}
    (4 rows)
    
    tanida=# select * from art where i && '{3}';
        i
    ---------
     {3,4}
     {2,3}
     {1,2,3}
     {3,4}
     {2,3}
    (5 rows)
  • INET/CIDR 型に以下の算術演算が追加されました。& (and)、| (or)、~ (not)、inet + int8、inet – int8、inet – inet
  • SQL 標準の集約関数が多数追加されました。
    • var_pop()
    • var_samp(): 従来の variance() と等価
    • stddev_pop(): 従来の stddev() と等価
    • regr_intercept()
    • regr_slope()
    • regr_r2()
    • corr()
    • covar_samp()
    • covar_pop()
    • regr_avgx()
    • regr_avgy()
    • regr_sxy()
    • regr_sxx()
    • regr_syy()
    • regr_count()
  • ドメインが他のドメインをベースにすることが出来るようになりました。
  • ドメインの値チェックが常に行われるようになりました。ユーザー定義関数を使ってデータを投入するときなど、チェックが抜け落ちている箇所がありました。
  • シリアル型が暗黙で作成するシーケンスをリネームした場合に発生する問題が修正されました。
  • 単に sleep を行う、pg_sleep コマンドが追加されました。
  • tid に比較関数が追加されました。

標準の手続き言語

  • トリガ発生したテーブル名を取得するパラメーターが、relname → tablename、table_schema、と名称変更されました。
    • PL/pgSQL の場合、TG_relname から TG_table_name と TG_table_schema に
    • Pl/Perl、Python の場合、table_name と table_schema が追加
  • PL/pgSQL
    • FOR 文で、レコードや列型などでなく、値を複数返せるようになりました。
    • FOR … BY が追加されました。増加数をコントロールします。
    • SELECT INTOにSTRICT 句が追加されました。指定すると必ず 1 行帰ってくると仮定し、失敗すると例外が発生します。これは Oracle の PL/SQL の互換性のために用意されました。
  • PL/Perl
    • prepared query がサポートされました。
    • $_TD、トリガーデータを格納する値が、グローバル変数に変更されました。
    • PL/Perl、PL/PerlU はセキュリティ向上のため、各々別のインタープリタを利用するようになりました。
  • PL/Python
    • 名前付きパラメーターは普通の変数として渡されるようになりました。
    • 検索結果や複合型を返せるようになりました。
    • void を返せるようになりました。

psql

  • password が追加されました。ユーザがパスワードを設定するのに役立ちます。
  • c で新しいホストとポート番号が指定可能に
  • l+ にテーブルスペース指定が追加
  • df に引数の名前とモード (OUT、INOUT) の表示
  • binary COPY コマンドをサポートしました。
  • 全てのセッションを 1 トランザクションで実行するオプション、-1 (–single-transaction) が追加されました。
  • set で FETCH_COUNT が指定できるようになりました。これに値を指定すると、SELECT 文を自動的に DECLARE 〜 FETCH (FETCH_COUNT に指定した値) に置き換えます。全てのデータをメモリに置かないため、クライアントのメモリ効率が有利になります。
  • レコード内に改行が入っている値がより読みやすくなりました。
  • 複数行にわたって 1 つの SQL を記述した場合に、ヒストリーにも SQL ごとに記録されるようになりました。
  • 2 億行を超えた行番号に対応します。
  • コマンドタグと結果の両方を表示できるようになりました。これは INSERT … RETURNING 文などで利用します。

pg_dump

  • テーブル、スキーマを指定する機能が拡充しました。
    • -t、-n が複数個指定できるようになりました。
    • 逆に指定テーブルやスキーマを除く -T、-N オプションも追加になりました。
    • ワイルドカードが指定できるようになりました
    • -t オプションにスキーマが指定できるようになりました。
  • pg_restore を 1 トランザクションで実行する –single-transaction (-1) オプションが追加されました
  • pg_restore でテーブルが存在していたりしたばあいにデータを入れない、という –no-data-for-failed-tables オプションが追加されました。

libpq

  • 追加された関数
    • PQencryptPassword(): パスワードのエンコード
    • PQisthreadsafe(): ライブラリ自体がスレッドセーフでコンパイルされているかどうかを返す
    • PQdescribePrepared(): このセッションで開いた prepared statement についての情報を得る。
    • PQdescribePortal(): 同カーソル
  • pg_service.conf に LDAP に関する項目を書けるようになりました。
  • .pgpass ファイルで、hostname の代わりに unix domain socket の位置を指定できるようになりました。

ecpg

  • show 文で表示した内容を結果に格納できるようになりました。
  • COPY TO STDOUT 文をサポートします。
  • 再帰テストが追加されました。

Windows 独自

  • MSVC でコンパイル可能になりました。
  • CP1253、1254、1255、1257 をサポーとしました。
  • Administrator 権限を持ったアカウントからサーバーを起動できるようになりました。なお、起動後は権限を外しますので、クラックされた場合に Administrator 権限はそのままでは奪取されません。
  • 安定性が向上しました。
  • セマフォが従来の SysV セマフォ実装から、直接 Win32 セマフォを利用するように変更されました。

ソースコード及び内部構造

  • GIN (Generalized Inverted iNdex) が新しいインデックス方式として利用可能になりました。
  • R-tree が GiST ベースに変更になりました。これによって、クラッシュリカバリ時にインデックスが破損する問題が修正されています。従来の R-tree インデックスはサポートされなくなりました。
  • バックエンドがリンクするライブラリを減らしました。
  • readline の代わりに libedit を利用することが出来るようになりました。積極的に libedit を使用したい場合、configure 時に –with-libedit-preferred オプションを追加してください。
  • スペースを含むディレクトリ上にインストールできるようになりました。
  • インストールディレクトリの再配置について改良されました。
  • x86_64 on Solaris CC をサポートします。
  • Solaris 10 のプロファイリング等が可能になる、DTrace に対応しました。
  • PG_VERSION_NUM が追加されています。これは、C で大小比較をしてバージョンチェック等を行うのが楽になります。
  • XLOG_BLCKSZ が追加になりました。
    これは WAL のログブロックサイズで、従来はテーブル等のブロックサイズ BLCKSZ と共通でした。
  • LWLOCK_STATS 定義が追加されました。これを指定してコンパイルすると、内部ロックの状態をレポートできるようになります。
  • 意味のない configure オプションを指定した場合警告するようになりました。
  • デバッグやパフォーマンス測定に有用なプラグインライブラリを付けられるようになりました。これにより (MacOS X 特有機能の) rendezvous を再実装したほか、新規 GUC の local_preload_libraries によって他にも新しい機能を付けられます。例えば PL/pgSQL デバッガのようなアプリケーションの実装に役立つでしょう。
  • 再帰テストが C で書き換えられました。
  • 動的モジュールが shared memory と LWlock の割り当てを受けられるようになりました
  • 動的モジュールの初期化/終了関数が定義されました。_PG_init() と _PG_fini() になります。
  • PG_MODULE_MAGIC というヘッダブロックがモジュールに追加されました。これはバージョンチェックに使われます。
  • AIX で共有ライブラリをサポートしました。
  • XML に関するドキュメントセクションが増えました。

contrib

追加

名称 内容
adminpack pgAdmin で提供されていた関数群
sslinfo ssl 接続に関する情報を取得できる
pgrowlocks 行ロック情報の表示
hstore 連想配列
pgfreespace フリースペースの利用状況を返します。

改良/名称変更

  • pgstattuple がインデックスに対しても使えるようになりました。
  • pgcrypto の関数群は全てプラン対応します。
  • cube に新関数が増えました。
  • dblink に、非同期問い合わせ機能が追加されました。
  • 多くのモジュールに、アンインストールスクリプトがつきました。
  • tsearch2 が大幅に強化されました。
    • UTF8 を含むマルチバイトをサポートします。
    • クエリ書き換えをサポートします
    • ランク付けが改良されました。
    • GIN に対応します。