PostgreSQL 8.0 に関する技術情報

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

    PostgreSQL 7.4 から 8.0 への変更点

    注意: ここにあげた変更点は、すべてを網羅していない可能性があります。詳しくはリリースノート (JPUGによる和訳)、あるいはソースに付属の HISTORY というファイルを見てください。

    互換性のない変更点

    • length()関数で、CHAR(n)で文字数を埋めるための空白はカウントされないようになりました。
    • integer型からBIT(N)へのキャストが、右(LSB)側からn bit取得するようになりました。以前は逆に左(MSB)側から取得していました。
     (8.0)
     tanida=# select 127::bit(32);
                    bit
     ----------------------------------
      00000000000000000000000001111111
     tanida=#  select 127::bit(4);
      bit
     ------
      1111
     (1 row)
    
    (7.4)
     tanida=# select 127::bit(4);
      bit
     ------
      0000
     (1 row)
    • 配列型でNULLとして格納されているデータの配列の一部を更新した場合、NULLでなく値を設定するようになりました。
     (8.0)
     yutaka=# create table arry(a int[]);
     CREATE TABLE
     yutaka=# insert into arry values(null);
     INSERT 17600 1
     yutaka=# update arry set a[1]=1;
     UPDATE 1
     yutaka=# select * from arry;
       a
     -----
      {1}
     (1 行)
    
    (7.4)
     tanida=# select a is null from arry;
      ?column?
     ----------
      t
     (1 row)
    • oid/float4/float8のカラムに空文字を入力した場合に警告が発生するようになりました。

      • 8.1では、これらは受け付けられなくなります。

         tanida=#  select ''::float4;
         WARNING:  deprecated input syntax for type real: ""
        
         DETAIL:  This input will be rejected in a future release of PostgreSQL.
          float4
         --------
               0
         (1 row)
    • extract()、あるいはdate_part()関数で紀元前未満の年が正しく返されるようになりました。以前は必ず1年少ない値が返されていました。
     (8.0)
     tanida=# select extract(year from '1900-01-01 BC'::Timestamp);
      date_part
     -----------
          -1900
     (1 row)
    
     (7.4)
     tanida=# select extract(year from '1900-01-01 BC'::Timestamp);
      date_part
     -----------
          -1899
     (1 row)
    • psqlのcopyコマンドが読み書きする時のstdin/stdoutはpsqlの標準入出力ではなく、問い合わせの標準出力になりました。これはファイルよりSQLを読み込んでいるようなときに問題になります。なお、従来のstdin/stdoutに相当す る挙動はpstdin/pstdoutになります。
    • JDBCとTCLインターフェースはリリースから取り除かれました。JDBCはhttp://jdbc.postgresql.org/を、TCLインタフェースはgborgのプロジェクトを参照してください。
    • タイムゾーンの管理がOS依存から独自管理に変更になりました。これは Win32への移植時に必要になったためです。それによってset/show ?の入出力がOSの物と異なるようになりました。また、timezoneに 関する設定がOSが提供する物と異なる可能性が出てきます。
    • EXECUTE文を実行したときの返値が、従来のEXECUTEでなく実際に実行した命令のタグを返すように変更されました。

       (8.0)
       tanida=# PREPARE a as insert into history (mtime) values (now());
       PREPARE
       tanida=# execute a;
       INSERT 1698329 1
     (7.4)
     tanida=# execute a;
     EXECUTE
    • スレッドセーフに関するオプションはもうテストを実行したり設定ファイルをいじる必要はありません。オプションは自動的に検出されます。
    • 削除されたコマンド

      • initlocation
      • pg_encoding
      • pg_id
    • 配列の文字列入力のチェックが厳密になったため、従来受け入れられた入力がエラーとなることがあります。
    • トランザクション処理レベルがREAD COMMITEDの場合、volatileを指定した関数はcommitされたデータを参照することが出来るようになりました。これはfor ループの中で変更を検知するようなケースでも使えることを意味しています。
    • STABLE,IMMUTABLEを指定した関数は、他のトランザクションの変更に影響されません。また、これらの関数は読み込み専用です。
    • deferredを指定しないAFTER トリガの実行タイミングが変更になり、トリガの引き金になったSQL文の実行直後になりました。以前はトリガの引き金になったSQL文を発行したコマンドの終了時でした。これにより、関数内等でトリガを利用した更新を行っても、関数終了時まで発生が遅れることはなくなりました。
    • 発展的解消したGUC。
    元々のGUC名 新規GUC名 備考
    virtual_host listen_addresses tcpip_socket=trueと同等の動作は listen_addresses="*"
    tcpip_socket
    log_pid log_line_prefix フォーマット関数として整理統合されました
    log_timestamp
    log_source_port
    sort_mem work_mem 旧称利用可能
    vacuum_mem maintenance_work_mem
    max_expr_depth max_stack_depth ネストの深さ->スタックのサイズに
    syslog log_destination 対応するのは、0 = stdout, 1=stdout,syslog 2=syslog
    • 変更されたGUC
      GUC名 変更前 変更後
      log_statement true/falseの2択 true,falseは設定出来ず、all/none/ddl(DDLのみ記録)/dml(DMLのみ記録) の4択

    今後削除されることが決定した機能

    • to_char(interval,text)は削除されます。

      • 数字等の入力に空文字列を投入した場合、従来は0の扱いでしたがこれを受け付けなくなります。
    • デフォルトでテーブルにOIDがつくかどうかはGUCのdefault_with_oidsで決まるようになりました。現在のデフォルト値はonでOID有りですが、将来のリリースではテーブルはoid*無し*がデフォルトになります

    主な新機能

    • Win32上でnativeに動くサーバーの実装が追加されました。これはWindows 2000,XP,2003といった"NT系"Windowsで動作します。現在の実装は最初のリリースと言うこともあり、まだ枯れているとは言い難い点には注意してください。インストーラー付きバージョンはhttp://pgfoundry.org/projects/pginstaller/にて配布されています。
    • SQLに定義されているsavepointに関する構文がサポートされました。これは、複数階層のトランザクションをサポートする構文で、トランザクションの部分的ロールバックを可能にします。
    • Point-In-Time Recovery機能が追加されました。これは従来不可能であった差分バックアップや、特定時間までの巻き戻しなどを可能にします。
    • tablespaceに関する構文が追加されました。これによりテーブル等の物理的配置をコントロール出来るようになります。
    • バッファ管理、CHECKPOINT、VACUUMに関する改良により、パフォーマンスが向上しました。

      • 新しいバッファ管理アルゴリズムが採用されました。これは従来採用していたLRUにかわるもので、ARCと呼ばれるアルゴリズムです。これにより、大きなシーケンシャルスキャンによってバッファキャッシュがクリアされキャッシュヒット率が落ちるケースが改善されました。
      • bgwriterプロセスが追加されました。これは、従来checkpoint時とバッファからの追い出し時のみに行われていたファイルへのデータ書き込みを、適当な時期を見計らって自動的に書き込みを行ってくれ、結果として全体的なパフォーマンス向上と、checkpoint時の負荷軽減が期待出来ます。以下の GUC でコントロールを行います。

        GUC名 初期値 説明
        bgwriter_delay 200 bgwriterの動作後、休止する時間
        bgwriter_percent 1 書き込みを行うページ数の比率
        bgwriter_maxpages 100 実際に書き込みを行う最大ページ数
      • vacuum時のCPU負荷やバッファ利用率を抑える仕組みが採用されました。これはVACUUM処理の優先度を下げたり、バッファを利用しないようにすることで実現されています。これにより、VACUUM時のパフォーマンス低下が軽減されています。以下のGUCでコントロールします。

        GUC名 初期値 説明
        vacuum_cost_delay 0(無効) vacuumプロセスの休止時間
        vacuum_cost_page_hit 1 キャッシュヒットしたページの処理コスト
        vacuum_cost_page_miss 10 キャッシュミスしたページの処理コスト
        vacuum_cost_page_dirty 20 書き込みが必要になるページの処理コスト
        vacuum_cost_limit 200 累積コストが指定値以上になると、休止が実行され、コストがクリアされます。
    • ALTER TABLE文でカラムの型を変更することが出来るようになりました。
    • PL/perlが全面的に書き直されました。これにより、共有エリア、トリガー、レコード及びレコードの配列、SPIインターフェースなどを新しく備えるようになりました。
    • COPYコマンドでCSVを受け入れられるようになりました。

    パフォーマンスに関する改良

    • 異なった型同士での比較では、従来はインデックスが使え無かった問題が改善され、可能であればインデックスを使えるようになりました。

       tanida=# explain select * from accounts where aid = 1::int8;
                                          QUERY PLAN
       --------------------------------------------------------------------------------
        Index Scan using accounts_pkey on accounts  (cost=0.00..3.01 rows=1
        width=100)
          Index Cond: (aid = 1::bigint)
       (2 rows)
    • 重複キー使用時のbtreeのパフォーマンスが向上しました。
    • OR演算子使用時のインデックス利用率が改善しました。
    • 部分インデックスをより旨く使えるようになりました。
    • TRUNCATEが高速化されました。
    • GEQO(遺伝的アルゴリズムを利用したオプティマイザ)のパフォーマンスが改善されました。
    • C関数を呼び出すときの、内部的な検索にかかる時間が改善されました。
    • ANALYZEと統計情報

      • 新しい2ステージ型サンプリング法が採用され、より適切なサンプルを得られるようになり、統計情報の生成精度が向上しました。例えば従来適切なプランを作成出来なかった大量の削除レコードが先頭にあるようなケースで、正しい統計情報が作成出来るようになっています。
      • 型に応じた柔軟な動作が行えるようになりました。
      • 関数インデックスを対象にできるようになりました。
      • テーブルのディスク容量の見積もりに使う値は従来VACUUMやANAZLYE時に取得した値が使われていましたが、代わりに現在の実際のテーブルファイルのサイズが用いられるようになりました。また、タプル数もテーブルサイズと前回のVACUUM/ANALYZE時に計測されたタプル/ページの比率とページ数より計算した値がそのまま使われるようになります。
      • PREPARE命令によってプランが計算されるタイミングが、従来のPREPARE命令実行時から最初のSQLを実行するときに変更になりました。この時、最初に指定された値がプランの策定に使われます。

    サーバー側の変更

    • ログの出力先管理機能が一新され、またログローテーション機能が追加されました。これは各種ログツールの助け無しに行うことが可能です。関連 GUC は以下の通りです。

      名称 内容
      log_destination 出力先。stdout,stderr,syslog,eventlog(win32のみ)などを指定可能
      redirect_stderr リダイレクトを行うかどうか。log_destinetionにstderrが含まれ、かつこれがonの場合、以下のローテーション機能が有効に出来る
      log_directory リダイレクト時、はき出すファイル名
      log_filename はき出すファイル名。strftime()形式
      log_rotation_age ローテーション時間間隔
      log_rotation_size ログのローテーションサイズ
      log_truncate_on_rotation onにすると、ローテーション時に元のファイルを切りつめる
    • コンパイル時設定を表示するための、読み込み専用GUCが追加されました。

      名称 内容
      block_size ブロックサイズ
      integer_datetimes datetimeの表現がintegerかどうか
      max_function_args 関数の最大引数
      max_identifier_length 識別子の最大長さ
      max_index_keys インデックスの最大キー数
    • log_disconnectionで、接続切断時の情報を得られるようになりました。
    • listen_addressesで実際にソケットを開くアドレスを指定します。
    • localhostに対するtcp/ip接続を標準で受け付けるようになりました。今後は-iオプションは必要ありません。
    • pg_hba.confでsameuser,samegroup,allといった特定の機能を持った名称を ""で囲むことで名称そのものとして扱うことが出来るようになりました。例:all = 全部のユーザー、"all"=all ユーザーのみ
    • いくつかのログに関する設定パラメーターが、スーパーユーザーにのみ設定出来るようになりました。ただし、ALTER USERコマンドでスーパーユーザーが個々のユーザーに対して設定を行うことが出来ます。
    • PGDATAディレクトリの外にpostgresql.confを配置出来るようになりました。また、これにより複数のPostmasterが同じ設定を利用するようなことも可能 です。
    • DECLARE文にパラメーターを指定出来るようになりました。
    • cidrとinet型に対するハッシュの取り扱いが正しくない問題が修正されました。
    • log_durationは、log_statementが問い合わせを出力したときだけに出力されるようになりました。

    問い合わせ言語に関する変更

    • ISOで定義されているがサポートしない排他レベルをset transaction isolationで指定した場合、SQLの定義通り代替可能な別のレベルを自動的に設定するようになりました
    • begin文で、同等の命令のstart transaction文にあったread onlyなどの構文についても、同等の指定が出来るようになりました。
    • テーブル権限のチェックが、ルールによって問い合わせ種別を (SELECT から INSERT などに) 変更された場合においても、正しく動作出来るようになりました。
    • 文字$による引用が使えます。これにより、関数等、中で引用符を使いたい場合の記述がより簡単になります。
    • case構文に数式が与えられた場合、それを一度だけしか評価しないようになりました。以前は必要回数だけ評価されていました。
    • HAVING句を集約関数の完全な適用前に考慮するようになりました。これは例えばSELECT SUM(win)/SUM(lose) … GROUP BY … HAVING SUM(lose)> 0.といったSQL(論理的にはエラーにならないが、計算順によっては0除算が発生します)をエラー無く実行可能にします。
    • SQL内に複合型を指定出来るようになりました。複合型は複数のカラムをまとめた形で指定出来るもので、ROW(…)のように記述します。
    • LIKE/ILIKEを行と副問い合わせの比較に使えるようになりました
    • 主にトルコ語で問題になっていた、ロケール独自のアルファベット大文字小文字変換ルール問題が解消されました。2バイト文字に対する修正ではありません。
    • 構文エラーの報告がより細やかになりました。
    • NATURAL CROSS JOIN相当の構文が内部的にルールによって生成される問題が修正されました。

    オブジェクト操作に関する変更

    • COMMENT ONで、以下の物にコメントが付けられるようになりました。

      • cast
      • conversion
      • language
      • operator class
      • large object
    • CREATE TABLE文で、OIDあり/無しのデフォルトは、GUCのdefault_with_oids で指定するようになりました。
    • 複合型をカラムに指定出来るようになりました。
    • ALTER

      • ALTER TABLE … DROP COLUMNでOIDをdrop出来るようになりました。従来通りALTER TABLE SET WITHOUT OIDSも使えます。
      • ALTER TABLE … ADD COLUMNにdefaultとNOT NULLが指定出来るようになりました。
      • ALTER TABLEで複数のALTERコマンドを指定出来るようになりました。
      • ALTER TABLEでserial型のカラムが追加出来るようになりました。
      • ALTER TABLE … SET WITHOUT CLUSTERが追加されました。これはCLUSTERコマンドの履]歴を消去します。
      • 各種ALTERコマンドで以下の物のオーナーが変更出来るようになりました。

        • aggregate
        • conversion
        • database
        • function
        • operator
        • operator class
        • schema
        • type
        • tablespace
    • SECURITY DEFINERを指定した関数で、一時的なオブジェクトを作成出来るようになりました。
    • 制約/インデックス/シリアルなどで暗黙的に作られるオブジェクトの命名規則が変更になり、一意性が確保されるようになりました。
    • pg_get_serial_sequence()関数で、シリアル型が利用しているシーケンス名を取得出来ます。
    • 主キー/外部キーのデータ型の不一致の問題で検索に時間がかかると予想される場合warningが出るようになりました。
    • ALTER INDEXコマンドでtablespaceを移動出来るようになりました。
    • ALTER TABLE OWNERでオーナーを変更したとき、関連するシーケンスも変更するようになりました。

    各種コマンドに関する変更

    • CREATE SCHEMA

      • トリガーやインデックスやシーケンスを作成出来るようになりました。
    • CREATE RULEにALSOキーワードが追加されました。
    • LOCKにNOWAITキーワードが追加されました。これは、ロックが取得出来なかった場合待つ代わりに即座に帰ってきます。
    • COPYコマンドで、デリミタとNULL文字列が競合を起こす場合にエラーを発生するようにしました。
    • GRANT/REVOKEの挙動が、よりSQL標準に近くなるように修正されました
    • CREATE INDEXとCHECKPOINTのロック競合を排除しました。これには、非常に大きなインデックス作成でWALがあふれてしまって回収不能になる問題がありました。
    • ANALYZEを指定無し、データベース全体に対して実行した場合に、VACUUM文のようにテーブルにまたがってロックを保持しないようになりました。この変更の恩恵を受けるためには、トランザクション内でanalyze文を実行しないようにしないようにしてください。
    • REINDEXで、関連するテーブルのロックを取得しないようになりました。再構築中のINDEXのロックは引き続き取得するので、結果として更新やその INDEXを使う検索は妨げられます。
    • ユーザー名が変更された場合、MD5パスワードは消去されるようになりました。
    • pg_ctlにkillオプションが追加されました。これは、Win32プラットフォームでUNIXのkillコマンドと同じようにシグナルをバックエンドに発生させるために使用します。
    • Information schemaが改善されました。
    • initdbに–pwfileオプションが追加されました。GUIツールなどが初期パスワードを設定するためなどに使います。
    • initdb時に、ロケールとエンコーディングの不一致を検出するようになりました。

    データ型及び関数

    • 複合型(例えば、row全体を表すような型)に対するサポートが改良されました。複合型はCREATE TYPE文で宣言することが出来ますし、また以下のようにTABLEそのものも複合型として定義されています。

       yutaka=# create table a_tbl(i int , j int);
       CREATE TABLE
       yutaka=# create table a_a_tbl(a a_tbl);
       CREATE TABLE
       yutaka=# insert into a_a_tbl values (ROW(1,1));
       INSERT 17594 1
       yutaka=# select * from a_a_tbl;
          a
       -------
        (1,1)
       (1 行)
    • 正しく{}でくくられてない配列要素をエラーにするようになりました。従来は、勝手な解釈の結果とんでもない値を返すことがありました。

       yutaka=# insert into a2 values('{1,1} } ');
       ERROR:  malformed array literal: "{1,1} } "
    • 整数型において、桁あふれを検出するようになりました。
    • "char"型に関する各種算術演算子が削除されました。
    • 配列の入力値に対する構文チェックが厳格になりました。
    • 空文字列の配列要素は{‘a’,"",’b’}で表すようになりました。今までは{‘a’,,’b’}でしたが、これは{‘a’,NULL,’b’}になります。
    • 配列要素の空白は無視されるようになりました
    • 配列が1で始まるのでない場合、それを明示的に出力するようになりました。

       yutaka=# select * from a2;
               i
       -----------------
        [0:3]={1,1,1,1}
        [0:2]={1,1,1}
       (2 行)
    • 日付表現として YYYY-(英語の月名)-DDが許されるようになりました。
    • netmask()とhostmask()関数が、最大のマスク長さ(28など)を返すようになりました。
    • 階乗関数がnumeric型を返すように変更されました。
    • to_char,to_dateの変換が向上しました
    • int/float型の入力は、前後の空白を無視出来るようになりました。
    • 浮動小数点型におけるInfinityとNaNの取り扱いが改善されました。
    • date_truncに"week"が指定出来るようになりました。
    • date_part()で、千年記と世紀の出力が間違っていた問題が修正されました。
    • ceiling(),power()がそれぞれceil(),pow()のエイリアスとして追加されました。これはSQL標準に沿った物です。
    • ln(),log(),power(),sqrt()関数が正しいSQLエラーコードを返すようになりました。
    • width_bucket()が追加されました。
    • generate_series()関数が追加されました。
    • セッションで、クライアント/サーバーのアドレスを返す関数が追加になりました。
    • 幾何学データ型で、閉経路の領域を求める関数が追加されました。
    • interval型+datetime型の演算が追加されました。これは従来 datetime + interval の順序を逆にした物です。
    • CIDRの値入力で、マスクされてない値には0を要求されるようになりました。

    サーバーサイド言語に関する変更

    • PL/pgSQL
      • 関数の名前付き引数サポートが追加されました。

        • PL/PgSQLでは名前はそのまま変数として扱われます
      • 関数作成時に最低限の構文チェックを行うようになりました
      • 複雑な型の取り扱いが向上しました
      • 変数のデフォルト値として、前もって定義されたものを参照するようになりました。
      • forループの構文解析が向上しました
      • "ELSEIF"構文が追加されました。これは "ELSIF"と同じものです。
    • PL/Tcl
      • 内部で実行するSPI関数が、savepointを使って実行されるようになりました。エラーが発生した場合そのsavepointを自動的にロールバックし、例外として報告します。

    psql

    • psqlがデータベースオブジェクトの表示が改善されました。
    • duに、グループ情報の表示が追加されました。
    • dgが追加されました。
     tanida=# du
                  List of database users
      User name | User ID |         Attributes
     -----------+---------+----------------------------
      tanida    |       1 | superuser, create database
     (1 row)
     tanida=# du
                            List of users
      User name | User ID |         Attributes         | Groups
     -----------+---------+----------------------------+--------
      tanida    |       1 | superuser, create database |
     (1 row)
     tanida=# dg
         List of groups
      Group name | Group ID
     ------------+----------
      defaultgrp |      100
     (1 row)
    • dnで、一時スキーマを表示しないようになりました
    • ~(tilde)をファイル名利用時に、一般的なUNIXと同じようにユーザー名に展開するようになりました。
    • psqlのプロンプト表現力が向上しました(例えば色を付けるとか)これには readline が必要です。
    • COPYコマンドが、COPYコマンドと完全互換になりました・
    • 構文エラーの場所(何文字目か)を表示します。
    • dで、クラスタ化情報を表示するようになりました

        tanida=# d+ accounts
              Table "public.accounts"
         Column  |     Type      | Modifiers
       ----------+---------------+-----------
        aid      | integer       | not null
        bid      | integer       |
        abalance | integer       |
        filler   | character(84) |
       Indexes:
           "accounts_pkey" PRIMARY KEY, btree (aid) CLUSTER
       Has OIDs: yes
    • グローバルなpsqlの設定ファイル"psqlrc.sample"が追加されました。
    • d+で、テーブルのOIDある/なしが表示されるようになりました。
    • Windows上では、psqlがファイルを読むときにバイナリI/Oを使います。ctrl-ZがEOFとなることはありません。
    • dn+で、スキーマの権限と詳細が表示されるようになりました。
    • TABキーによる補完が、8.0向けに改善されました
    • 表示に大文字を使うか、小文字を使うかを設定出来るようになりました。

    pg_dump

    • 依存関係情報を使うことで、pg_dumpの信頼性が向上しました
    • pg_dumpの出力を、可能ならば各オブジェクト名のアルファベット順に並ぶようになりました。
    • pg_restoreが、いくつかのエラーを無視出来るようになりました。
    • text形式の出力時に、開始と終了を示すマーカーが追加されました。
    • スタート時間と終了時間がverboseモード時に出力されるようになりました。
    • pg_dumpallで、ほとんどのpg_dumpオプションが指定出来るようになりました
    • pg_dumpは、set session authrizationの代わりにalter … owner to … を使って所有者を設定するようになりました。

    libpq

    • SIGPIPEの取り扱いがスレッドセーフになりました
    • SSLやケルベロス認証を使うときに、スレッドをロックするようになりました。
    • EXECUTE時のタグの変更を受けて、P?()がEXECUTEコマンドでも正しく動作するようになりました。
    • 追加された関数
      関数名 概要
      PQserverVersion サーバーバージョンの取得
      PQprepare PQexecPrepared()のより使いやすいもの
      PQsendPrepared PQsendQueryPrepared()のより使いやすい物
      PQmbdsplen 文字列の「表示幅」

    ソースコード

    • 今までシェルスクリプトとして記述されていたコマンドがC言語に置き換えられました。
    • 関数等のビルドを改善するために、pgxsと呼ばれる新しいmake用フレームワークが追加されました。
    • ファイル配置が相対パスで解決されるようになり、インストールディレクトリをビルド後に再配置可能になりました。
    • ドキュメントの位置を–with-docdirで指定出来るようになりました。

      • INFO形式について同様の–infodirもあります。
      • ドキュメントをインストールしない、–without-docdirが追加されました。
    • ドキュメントフォーマットが? V4.2 SGMLに変更されました。
    • CVSサーバーで、PostgreSQLタグを使うようになりました。
    • ロック関連のコードが整理されました。
    • バッファマネージャーのコードが整理されました。
    • いくつかのプラットフォームでCPU spinlockのコードがテストされ、追加されました。
    • PA-RISC gcc用のtest-and-setコードが追加されました
    • x86のspinlockコードが改善され、特にPentium4やXeonプロセッサの Hyper-Threadingが有効なケースでパフォーマンスが向上しました。
    • spinlockのアセンブラコードが整理され、新しいバージョンのgccで警告が出ないようになりました。
    • ファイル記述子とメモリの計算がより正確になりました。
    • MacOSXのスタートアップスクリプトが改善されました。
    • fsynctestプログラムがソース上、src/tools/fsyncに追加されました。これはwal_sync_methodの設定を助けます。
     [tanida@srapc2211 fsync]$ ./test_fsync
     Simple write timing:
            write                    0.015901
    
     Compare fsync times on write() and non-write() descriptor:
     (If the times are similar, fsync() can sync data written
     on a different descriptor.)
            write, fsync, close      0.691202
            write, close, fsync      0.748874
    
     Compare one o_sync write to two:
            one 16k o_sync write     0.334826
            two 8k o_sync writes     0.540160
    
     Compare file sync methods with one 8k write:
            (o_dsync unavailable)
            open o_sync, write       0.268432
            write, fdatasync         1.358168
            write, fsync,            1.422910
    
     Compare file sync methods with 2 8k writes:
            (o_dsync unavailable)
            open o_sync, write       0.566427
            write, fdatasync         1.809114
            write, fsync,            1.780453
    • ドキュメントについても、特に新機能と関係のない改善がいくつかあります。
    • Unixwareでは、マルチスレッド化されたlibpqを構築する場合、バックエンドもマルチスレッドライブラリを使うようになります。これは、マルチスレッドライブラリとそうでないものを混ぜられないOS側の制限によります。
    • psqlは、flexを使ってコマンドを解釈するように変更されました。
    • 内部のlinked list構造が改良されました。
    • 動的に読み込んだモジュールが独自のGUCパラメーターをもてるようになりました。
    • FAQに、以下の言語が追加されました

      • ブラジル語
      • フランス語
    • pgeventコマンドが追加されました。これはWindowsビルドのロギングで使います。
    • Mac OSXでlibpqとecpgが共有ライブラリ形式でビルド出来ない問題が修正されました。

    contrib

    • ecpgの問題がいくつか修正されています。
    • dblinkが殆ど書き直されました。
    • dbmirrorの機能が大幅に向上しています
    • xml2が追加されました
    • mysqlが更新されています。
    • btree_gistの新バージョンが添付されています
    • trgmが追加されました。これはtrigram matchingのモジュールです。
    • tsearch2で多数の改良が行われました。
    • fuzzystrmatchにdouble metaphoneアルゴリズムの実装が加わりました。