(2005/01/19リリース)に関する技術情報をお届けします。リリースノートを元に弊社で解説を加えたものです。ここにあげた変更点は、すべてを網羅していない可能性があります。いうファイルを見てください。互換性のない変更点length()関数で、CHAR(n)で文字数を埋めるための空白はカウントされないようになりました。bit取得するようになりました。以前は逆に左(MSB)側から取得していました。row)配列型でNULLとして格納されているデータの配列の一部を更新した場合、NULLでなく値を設定するようになりました。row)oid/float4/float8のカラムに空文字を入力した場合に警告が発生するようになりました。8.1では、これらは受け付けられなくなります。row)extract()、あるいはdate_part()関数で紀元前未満の年が正しく返されるようになりました。以前は必ず1年少ない値が返されていました。row)psqlのcopyコマンドが読み書きする時のstdin/stdoutはpsqlの標準入出力ではなく、問い合わせの標準出力になりました。これはファイルよりSQLを読み込んでいるようなときに問題になります。挙動はpstdin/pstdoutになります。JDBCとTCLインターフェースはリリースから取り除かれました。JDBCはhttp://jdbc.postgresql.org/を、TCLインタフェースはgborgのプロジェクトを参照してください。タイムゾーンの管理がOS依存から独自管理に変更になりました。Win32への移植時に必要になったためです。?の入出力がOSの物と異なるようになりました。関する設定がOSが提供する物と異なる可能性が出てきます。EXECUTE文を実行したときの返値が、従来のEXECUTEでなく実際に実行した命令のタグを返すように変更されました。EXECUTEスレッドセーフに関するオプションはもうテストを実行したり設定ファイルをいじる必要はありません。オプションは自動的に検出されます。削除されたコマンドinitlocationpg_encodingpg_id配列の文字列入力のチェックが厳密になったため、従来受け入れられた入力がエラーとなることがあります。COMMITEDの場合、volatileを指定した関数はcommitされたデータを参照することが出来るようになりました。ループの中で変更を検知するようなケースでも使えることを意味しています。STABLE,IMMUTABLEを指定した関数は、他のトランザクションの変更に影響されません。これらの関数は読み込み専用です。トリガの実行タイミングが変更になり、トリガの引き金になったSQL文の実行直後になりました。以前はトリガの引き金になったSQL文を発行したコマンドの終了時でした。これにより、関数内等でトリガを利用した更新を行っても、関数終了時まで発生が遅れることはなくなりました。発展的解消したGUC。今後削除されることが決定した機能to_char(interval,text)は削除されます。数字等の入力に空文字列を投入した場合、従来は0の扱いでしたがこれを受け付けなくなります。デフォルトでテーブルにOIDがつくかどうかはGUCのdefault_with_oidsで決まるようになりました。現在のデフォルト値はonでOID有りですが、将来のリリースではテーブルはoid*無し*がデフォルトになります主な新機能Win32上でnativeに動くサーバーの実装が追加されました。2000,XP,2003といった"NT系"Windowsで動作します。現在の実装は最初のリリースと言うこともあり、まだ枯れているとは言い難い点には注意してください。インストーラー付きバージョンはhttp://pgfoundry.org/projects/pginstaller/にて配布されています。SQLに定義されているsavepointに関する構文がサポートされました。これは、複数階層のトランザクションをサポートする構文で、トランザクションの部分的ロールバックを可能にします。Recovery機能が追加されました。これは従来不可能であった差分バックアップや、特定時間までの巻き戻しなどを可能にします。tablespaceに関する構文が追加されました。これによりテーブル等の物理的配置をコントロール出来るようになります。バッファ管理、CHECKPOINT、VACUUMに関する改良により、パフォーマンスが向上しました。新しいバッファ管理アルゴリズムが採用されました。これは従来採用していたLRUにかわるもので、ARCと呼ばれるアルゴリズムです。これにより、大きなシーケンシャルスキャンによってバッファキャッシュがクリアされキャッシュヒット率が落ちるケースが改善されました。bgwriterプロセスが追加されました。これは、従来checkpoint時とバッファからの追い出し時のみに行われていたファイルへのデータ書き込みを、適当な時期を見計らって自動的に書き込みを行ってくれ、結果として全体的なパフォーマンス向上と、checkpoint時の負荷軽減が期待出来ます。コントロールを行います。実際に書き込みを行う最大ページ数vacuum時のCPU負荷やバッファ利用率を抑える仕組みが採用されました。これはVACUUM処理の優先度を下げたり、バッファを利用しないようにすることで実現されています。これにより、VACUUM時のパフォーマンス低下が軽減されています。以下のGUCでコントロールします。累積コストが指定値以上になると、休止が実行され、コストがクリアされます。TABLE文でカラムの型を変更することが出来るようになりました。PL/perlが全面的に書き直されました。これにより、共有エリア、トリガー、レコード及びレコードの配列、SPIインターフェースなどを新しく備えるようになりました。COPYコマンドでCSVを受け入れられるようになりました。異なった型同士での比較では、従来はインデックスが使え無かった問題が改善され、可能であればインデックスを使えるようになりました。rows)重複キー使用時のbtreeのパフォーマンスが向上しました。OR演算子使用時のインデックス利用率が改善しました。部分インデックスをより旨く使えるようになりました。TRUNCATEが高速化されました。GEQO(遺伝的アルゴリズムを利用したオプティマイザ)のパフォーマンスが改善されました。C関数を呼び出すときの、内部的な検索にかかる時間が改善されました。新しい2ステージ型サンプリング法が採用され、より適切なサンプルを得られるようになり、統計情報の生成精度が向上しました。従来適切なプランを作成出来なかった大量の削除レコードが先頭にあるようなケースで、正しい統計情報が作成出来るようになっています。型に応じた柔軟な動作が行えるようになりました。関数インデックスを対象にできるようになりました。テーブルのディスク容量の見積もりに使う値は従来VACUUMやANAZLYE時に取得した値が使われていましたが、代わりに現在の実際のテーブルファイルのサイズが用いられるようになりました。タプル数もテーブルサイズと前回のVACUUM/ANALYZE時に計測されたタプル/ページの比率とページ数より計算した値がそのまま使われるようになります。PREPARE命令によってプランが計算されるタイミングが、従来のPREPARE命令実行時から最初のSQLを実行するときに変更になりました。この時、最初に指定された値がプランの策定に使われます。サーバー側の変更ログの出力先管理機能が一新され、またログローテーション機能が追加されました。これは各種ログツールの助け無しに行うことが可能です。