★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

E.51. リリース 8.3

リリース日: 2008-02-04

E.51.1. 概要

重大な新機能と性能向上を伴うこのリリースは、PostgreSQLを大きく飛躍させたものと言えます。 これは開発速度が劇的に速くなったコミュニティの成長によりなされました。 このリリースは以下の主要機能を追加します。

主要な性能に関する改良を以下に列挙します。 これらの改善のほとんどは自動的なものですので、ユーザによる変更や調整は不要です。

上記項目は後述の節でより詳細に説明します。

E.51.2. バージョン8.3への移行

すべての過去のリリースからデータを移行する場合、pg_dumpを使用したダンプ/リストアが必要です。

既知の非互換性を以下に示します。

E.51.2.1. 一般

  • 文字以外のデータ型がTEXTへの自動キャストが行われないようになりました。(Peter, Tom)

    これまでは、文字以外の値がtext入力を必要とする演算子や関数に渡された場合、ほとんど(すべてではありません)の組み込みデータ型では自動的にtextにキャストされました。 これが行われなくなりました。 すべての文字以外の型でtextへの明示的なキャストが必要になります。 例えば以下の式は以前は動作しました。

    substr(current_date, 1, 4)
    23 LIKE '2%'

    しかし、今回からそれぞれ"function does not exist"および"operator does not exist"というエラーメッセージが引き出されるようになります。 代わりに以下のように明示的なキャストを使用してください。

    substr(current_date::text, 1, 4)
    23::text LIKE '2%'

    (当然ですが、より冗長なCAST()構文を使用することも可能です。) 変更理由は、こうした自動キャストがよく思いもよらぬ動作を引き起こすためです。 過去のリリースにおけるこうした例を次に示します。 この式は受け付けられますが、想定した動作を行いません。

    current_date < 2017-11-17

    これは実際には日付と整数とを比較します。 これは拒絶すべきものです(このリリースでは拒絶するようになります)。 しかし、自動キャストの存在により、他に<演算子に一致するものがなければtext < text演算子がこの式に一致することができますので、両辺はtextにキャストされ、テキストの比較が行われます。

    char(n)およびvarchar(n)型はまだtextに自動キャストされます。 また、textへの自動キャストはまだ連結演算子(||)では、少なくとも1つの入力が文字型であれば、動作します。

  • contrib/tsearch2の全文検索機能がコアサーバに移りましたが、いくつか小さな構文変更があります。

    contrib/tsearch2は互換性を保持するためのインタフェースを持つようになりました。

  • ARRAY(SELECT ...)においてSELECTが行を返さない場合、NULLではなく空の配列を返すようになりました。 (Tom)

  • 基本データ型に対する配列型の名前が常にアンダースコアを基本型名称の前につけたものにならなくなりました。

    古い命名規約は可能ならばまだ尊重されますが、アプリケーションのコードはこれに依存すべきではありません。 指定した型に関連付いた配列データ型を識別する際は、代わりに新しいpg_type.typarray列を使用してください。

  • ORDER BY ... USING operatorがB-tree演算子クラスで定義される小なり演算子または大なり演算子を使用しなければならなくなりました。

    この制限は一貫性がない結果を防ぐために加えられました。

  • SET LOCALがロールバックされない限り、最も外側のトランザクションの終わりまで永続するように変わりました。(Tom)

    以前はSET LOCALの効果は副トランザクションのコミット(RELEASE SAVEPOINTまたはPL/pgSQL例外ブロックからの終了)後失われました。

  • トランザクションブロック内で拒絶されたコマンドが、複数文からなる問い合わせ文字列内でも拒絶されるようになりました。(Tom)

    例えば"BEGIN; DROP DATABASE; COMMIT"は単一の問い合わせメッセージとして送信されたとしても拒絶されるようになります。

  • トランザクションブロック外のROLLBACKWARNINGではなくNOTICEを発行するようになりました。(Bruce)

  • NOTIFY/LISTEN/UNLISTENがスキーマ修飾された名前を受付ないようにしました。(Bruce)

    これまではこれらのコマンドはschema.relationを受け付けていましたが、スキーマ部分を無視していたため、混乱を招きました。

  • ALTER SEQUENCEがシーケンスのcurrval()の状態に影響を与えないようになりました。 (Tom)

  • 外部キーはデータ型をまたがる参照においてインデックス付け可能な状態に一致しなければならなくなりました。(Tom)

    これは意味的な一貫性を向上させ、また、性能に関する問題を防止する役に立ちます。

  • オブジェクトサイズに関する情報を閲覧する合理的な権限を持つユーザに、オブジェクトサイズに関する関数を限定します。(Tom)

    例えばpg_database_size()は、デフォルトで全員に与えられているCONNECT権限を要求します。 pg_tablespace_size()はテーブル空間におけるCREATE権限を要求します。 また、テーブル空間がデータベースのデフォルトのテーブル空間である場合にも許可されます。

  • 文書化されていない!!=(含まれていない)演算子を削除しました。(Tom)

    こうした操作を行うにはNOT IN (SELECT ...)が適しています。

  • 内部用ハッシュ関数がより均一に分布するようになりました。(Tom)

    アプリケーションコードがPostgreSQL内部用のハッシュ関数を使用してハッシュ値を計算し格納する場合、ハッシュ値は再生成されなければなりません。

  • 可変長データ値の取扱いに関するCコード規約を変更しました。(Greg Stark, Tom)

    新しいSET_VARSIZE()マクロは、生成されたvarlena型の長さを設定するために使用しなければなりません。 また、より多くの状況で入力値の伸長("TOAST解除")を行う必要があるかもしれません。

  • DEBUGレベルを使用しない限り、連続アーカイブ処理がアーカイブ操作の成功の度にサーバログに報告しないようになりました。

E.51.2.2. 設定パラメータ

  • サーバ管理用のパラメータで多くの変更があります。

    bgwriter_lru_percentbgwriter_all_percentbgwriter_all_maxpagesstats_start_collectorstats_reset_on_server_startが削除されました。 redirect_stderrの名前がlogging_collectorになりました。 stats_command_stringの名前がtrack_activitiesになりました。 stats_block_levelstats_row_leveltrack_countsにまとめられました。 archive_modeという新しい論理型の設定パラメータはアーカイブ処理を制御します。 Autovacuumのデフォルト設定が変わりました。

  • stats_start_collectorパラメータが削除されました。(Tom)

    UDPソケットの作成に失敗しない限りコレクタプロセスを常に起動するようになりました。

  • stats_reset_on_server_startパラメータが削除されました。(Tom)

    この目的にpg_stat_reset()を使用することができますので、このパラメータは削除されました。

  • postgresql.confでパラメータをコメントにすることで、そのデフォルト値に戻るようにしました。(Joachim Wieland)

    これまではコメント化された項目は、次にサーバを再起動するまで、その値は変わらずに残りました。

E.51.2.3. 文字符号化方式

  • 符号化が無効なデータに対して、より多くの検査を追加しました。(Andrew)

    この変更は、バックスラッシュでエスケープされた文字列リテラル処理とCOPYのエスケープ処理に存在したいくつかの抜け穴を塞ぐものです。 これで、結果が無効なマルチバイト文字を作成したかどうか、エスケープを解除した文字列を再度検査しするようになりました。

  • サーバのロケール設定と矛盾するデータベース符号化方式を不許可としました。(Tom)

    多くのプラットフォームでは、Cロケールがすべてのデータベース符号化方式で動作する唯一のロケールです。 他のロケール設定は特定の符号化方式を意味することになり、データベース符号化方式と多少異なると、誤動作します。 (典型的な症例として、間違ったテキストソート順やupper()もしくはlower()の誤動作があります。) サーバは互換性が無い符号化方式でデータベースを作成することを拒絶するようになりました。

  • chr()が無効な符号化方式の値を生成できないことを確実にしました。(Andrew)

    UTF8で符号化されたデータベースでは、chr()の引数はUnicodeコードポイントとして扱われるようになりました。 他のマルチバイト符号化方式では、chr()の引数は7ビットASCII文字を指名しなければなりません。 ゼロは受け付けられません。 ascii()も併せて調整されました。

  • convert()の動作を有効な符号化方式に確実になるように調整しました。(Andrew)

    2つの引数を取るconvert()構文は削除されました。 3つの引数を取る構文は、最初の引数としてbyteaを取り、byteaを返すようになりました。 機能の欠落を補うために、新しい関数を3つ追加しました。

    • convert_from(bytea, name) returns text — 最初の引数を指定された符号化方式からデータベースの符号化方式に変換します。

    • convert_to(text, name) returns bytea — 最初の引数をデータベース符号化方式から指定された符号化方式に変換します。

    • length(bytea, name) returns integer —指定した符号化方式における最初の引数の文字長を返します。

  • convert(argument USING conversion_name)を削除しました。(Andrew)

    この動作は標準SQLに合いませんでした。

  • JOHAB符号化方式をクライアント側のみにしました。(Tatsuo)

    サーバ側の符号化方式としてJOHABは安全ではありません。

E.51.3. 変更点

PostgreSQL 8.3と以前のメジャーリリースとの間の違いについて、以下に詳しく説明します。

E.51.3.1. 性能

  • 非同期コミットは、トランザクションコミット時のWALへの書き出しを遅延します。(Simon)

    この機能により、短期のデータ変更を行うトランザクションの性能が大きく向上しました。 欠点はディスクへの書き出しが遅れるため、データをディスクへの書き出す前にデータベースシステムまたはオペレーティングシステムがクラッシュした場合コミットしたデータが失われる点です。 この機能は多少のデータ損失を受け入れることができるアプリケーションでは役に立ちます。 fsyncを無効にする場合と異なり、非同期コミットを使用する場合にはデータベースの一貫性に関する危険はありません。 最悪の場合でも、クラッシュの後、コミットされたと報告されている最後の数個のトランザクションが完全にコミットされていない可能性があるだけです。 この機能はsynchronous_commitを無効にすることで有効になります(一部のトランザクションが極めて重要であり、その他は重要でないような場合、これはセッション単位やトランザクション単位で行うことができます。)。 wal_writer_delayを調整して、トランザクションが実際にディスクに書き出されるまでの最大遅延を制御することができます。

  • 各チェックポイントにおけるI/Oのピークを抑えるために、チェックポイントの書き出しをより長い時間に分散させることができます。(Itagaki Takahiro and Heikki Linnakangas)

    これまでは、すべての変更済みバッファはチェックポイント時可能な限り高速にディスクに書き出すことが強制されていました。 これによりI/Oが急激に増加するため、サーバの性能が劣化しました。 この新しい方式はチェックポイント時のディスク書き出しを分散させ、I/O使用のピークを抑えます。 (ユーザが要求したチェックポイントおよび停止時のチェックポイントではまだできる限り高速に書き出されます。)

  • ヒープオンリータプル(HOT)は、ほとんどのUPDATEDELETEにおける領域の再利用を促進します。(Pavan Deolaseeおよび他の多くからのアイディアによる)

    UPDATEおよびDELETEは、失敗したINSERTと同様、不要なタプルを背後に残します。 これまではVACUUMのみが不要タプルにより占められた領域を回収することができました。 HOTにより、インデックス付けされた列に変更がなされていなければ、不要タプル領域をINSERTまたはUPDATEと同時に、自動的に回収できるようになりました。 これによりより一貫した性能が得られます。 また、HOTは重複したインデックス項目が追加されることを防止します。

  • ジャストインタイムのバックグランドライタ戦略はディスク書き出し効率を改善します。(Greg Smith, Itagaki Takahiro)

    これはバックグランドライタの手作業による調整作業の必要性を大きく減らします。

  • フィールド単位および行単位の格納にかかるオーバーヘッドが削減されました。(Greg Stark, Heikki Linnakangas)

    128バイト未満の長さのデータ値を持つ可変長データ型において、その格納が3から6バイト減少することがわかります。 例えば、隣接する2つのchar(1)型のフィールドでは16バイトではなく4バイト使用するようになりました。 また、行ヘッダは以前に比べ4バイト短くなりました。

  • 読み取りのみのトランザクションにて非永続トランザクションIDを使用することでオーバーヘッドとVACUUMの必要性が減少します。(Florian Pflug)

    非永続トランザクションIDは大域的なトランザクションカウンタを増加させません。 このため、これはpg_clogへの負荷を低減し、トランザクションID周回を防ぐための強制的なバキュームの実行間隔を長くします。 同時実行性を向上させる性能向上も行われました。

  • 読み取りのみのコマンドの後にコマンドカウンタの増加を行いません。(Tom)

    これまでは1トランザクション当たり232 (40億)コマンドという固定の限界がありました。 今回実際にデータベースを変更するコマンドのみが数えられるようになりました。 このため制限自体はまだ存在しますが、悩まされることはかなり減少したはずです。

  • バックエンドから作業を分けるために専用のWALライタプロセスを作成しました。(Simon)

  • CLUSTERおよびCOPYで不要なWAL書き出しを行わないようにしました。(Simon)

    WALアーカイブ処理が有効でない限り、 システムはCLUSTERでのWAL書き出しを行わず、コマンドの終りでテーブルをfsync()するだけになりました。 また、テーブルが同じトランザクションで作成された場合のCOPYでも同じことを行います。

  • 大規模なシーケンススキャンがよく使用されるキャッシュされたページを押し出さないようになりました。(Simon, Heikki, Tom)

  • 同時に行われる大規模なシーケンススキャンがディスク読み取りを共有できるようになりました。

    これは、(他のシーケンススキャンがすでに実行中の)テーブルの途中から新しいシーケンススキャンを開始すること、および、その開始から終わりまでを包み隠すことによりなされました。 これはORDER BYの指定がない問い合わせで返される行の順序に影響を与えます。 必要ならばsynchronize_seqscans設定パラメータを使用して無効にすることができます。

  • ORDER BY ... LIMITがソートなしで行うことができるようになりました。(Greg Stark)

    これは、テーブル全体を完全にソートする代わりに、テーブルのスキャンを断続的に行い、"上位N個の"候補行のみを追跡することで行われます。 これは対応するインデックスがない場合やLIMITが大きな値でない場合に有用です。

  • バックエンドから統計情報コレクタに送信されるメッセージの頻度に制限を加えました。(Tom)

    これは短めのトランザクションにおけるオーバーヘッドを低減します。 しかし、統計情報が計算される前の遅延が増加する場合もあります。

  • 多くのNULLを持つ場合のハッシュ結合の性能を向上しました。(Tom)

  • 正確にデータ型が一致しない場合の演算子検索が高速になりました。(Tom)

E.51.3.2. サーバ

  • 自動バキュームがデフォルトで有効になりました。(Alvaro)

    デフォルトに変更することを正当化するために、自動バキュームを有効にさせた場合の欠点を除去するための変更が多くなされました。 この他の自動バキュームに関するパラメータも複数変更されました。

  • 複数の自動バキュームプロセスの同時実行をサポートします。(Alvaro, Itagaki Takahiro)

    これにより複数のバキュームを同時に実行できるようになります。 これは、大規模テーブルのバキュームによりより小さなテーブルのバキュームが遅延されることを防ぎます。

  • テーブル定義の変更時または統計情報の更新時における、キャッシュされた問い合わせ計画を自動的に再作成します。(Tom)

    これまで一時テーブルを参照するPL/pgSQL関数はEXECUTEが使用されていない限り、その関数を呼び出し中に一時テーブルが削除、再作成された場合、失敗しました。 この改良により、この問題および関連する多くの問題が解消されます。

  • 一時テーブルおよび一時ファイル用のテーブル空間を制御するtemp_tablespacesパラメータが追加されました。(Jaime Casanova, Albert Cervera, Bernd Helmle)

    このパラメータは使用されるテーブル空間のリストを定義します。 これにより複数のテーブル空間をまたがったI/O負荷分散が可能です。 一時オブジェクトが作成される度にランダムなテーブル空間が選択されます。 一時ファイルはデータベース単位のpgsql_tmp/ディレクトリに格納されず、テーブル空間単位のディレクトリに格納されるようになりました。

  • 一時テーブル用のTOASTテーブルを特別なpg_toast_temp_nnnという名前のスキーマに格納します。(Tom)

    これにより低レベルなコードでこれらのテーブルを一時的なものと認識できるようになります。 WALに記録されない変更や共有バッファではなくアクセスにローカルを使用するなど、各種最適化が可能です。 またこれは、バックエンドが予期せず一時TOASTテーブルへのファイル参照を開き続ける際の不具合を解消します。

  • 新しい接続要求の固定的な処理フローが、postmasterの停止やクラッシュからの再起動を不定期間遅延させられるという問題を解消します。(Tom)

  • 次のチェックポイントの後まで削除されたテーブルのrelfilenodeの再利用を防止することで、非常に可能性が低いデータが損失する状況を保護します。(Heikki)

  • 古い形式の外部キートリガ定義を通常の外部キー制約に変換するようにCREATE CONSTRAINT TRIGGERを修正しました。(Tom)

    これは、contrib/adddependを使用して返還されていない、7.3以前のデータベースで持ち込まれた外部キー制約の移行を簡単にします。

  • 継承されたデフォルトを上書きするようDEFAULT NULLを修正しました。(Tom)

    これまでDEFAULT NULLはノイズ語句とみなされていました。 しかし、存在しなかった場合に親テーブルまたはドメインから継承される非NULLのデフォルトを上書きすべきでした(今回から上書きします)。

  • 新しい符号化方式EUC_JIS_2004とSHIFT_JIS_2004を追加しました。(Tatsuo)

    これらの符号化方式とUTF-8は相互に変換可能です。

  • サーバ起動時のログメッセージを "database system is ready"から"database system is ready to accept connections"へ変更しました。 また、その時期も調整しました。

    このメッセージは本当に接続を受け付ける準備が整った時にのみ現れるようになりました。

E.51.3.3. 監視

  • 自動バキュームの活動ログ処理の設定をサポートするためのlog_autovacuum_min_durationを追加しました。(Simon, Alvaro)

  • ロック待機をログに記録するためのlog_lock_waitsパラメータを追加しました。(Simon)

  • 一時ファイルの使用状況をログに記録するためのlog_temp_filesパラメータを追加しました。(Bill Moran)

  • チェックポイントのログ処理を改良するためのlog_checkpointsパラメータを追加しました。(Greg Smith, Heikki)

  • log_line_prefixがすべてのプロセス内で%sおよび%cエスケープをサポートするようになりました。(Andrew)

    これまでは、これらのエスケープはユーザセッションでのみ動作し、バックグランドデータベースプロセスでは動作しませんでした。

  • ポイントインタイムリカバリの再起動点のログ処理を制御するためのlog_restartpointsを追加しました。(Simon)

  • リカバリの終わり、および、記録された再起動点で最終トランザクションの終了時刻がログに記録されるようになりました。(Simon)

  • 自動バキュームがpg_stat_activity内にその活動開始時刻を報告するようになりました。(Tom)

  • サーバログをカンマ区切り値(CSV)書式で出力できるようになりました。(Arul Shaji, Greg Smith, Andrew Dunstan)

    後の解析のために、CSV書式のログファイルを簡単にデータベーステーブルにロードすることができます。

  • PostgreSQLが提供する時間帯サポートをサーバログで表示されるタイムスタンプの書式に使用します。(Tom)

    間違った符号化方式のローカルの時間帯を使用した場合のWindows固有の問題を防止します。 クライアント側で可視のtimezoneパラメータとは独立した、ログメッセージで使用する時間帯を制御するためのlog_timezoneパラメータが追加されました。

  • 新しいpg_stat_bgwriterシステムビューはバックグランドライタの活動に関する統計情報を表します。

  • データベース全体のタプル統計情報のための列をpg_stat_databaseに新しく追加しました。(Magnus)

  • xact_start(トランザクションの開始時刻)列をpg_stat_activityに追加しました。(Neil)

    これで、長期間実行中のトランザクションの識別が容易になります。

  • n_live_tuplesおよびn_dead_tuples列をpg_stat_all_tablesと関連するビューに追加しました。(Glen Parker)

  • stats_block_levelstats_row_levelパラメータを1つのtrack_countsパラメータにまとめました。 これは、統計情報コレクタプロセスにすべてのメッセージを送信するかどうかを制御します。(Tom)

  • stats_command_stringパラメータの名前をtrack_activitiesに変更しました。(Tom)

  • コミットされたトランザクションとアボートしたトランザクションが異なる影響を持つことを認識するために、有効タプルと無効タプルの統計的な数え方を修正しました。(Tom)

E.51.3.4. 認証

  • Windowsにおける認証用のセキュリティサービスプロバイダインタフェース(SSPI)をサポートします。(Magnus)

  • GSSAPI認証をサポートします。(Henry Hotz, Magnus)

    GSSAPIは業界標準ですので、Kerberos認証そのものより好まれるはずです。

  • グローバルなSSL設定ファイルをサポートします。(Victor Wagner)

  • 受け付けるSSL暗号を制御するためのssl_ciphersパラメータを追加しました。(Victor Wagner)

  • Kerberosレルムパラメータkrb_realmを追加しました。(Magnus)

E.51.3.5. 先行書き込みログ(WAL)と連続的なアーカイブ処理

  • トランザクションWAL記録に記録されるタイムスタンプがtime_tからTimestampTz表現に変わりました。(Tom)

    これは0.5秒という精度をWALに提供します。 これはポイントインタイムリカバリで役に立ちます。

  • ウォームスタンバイサーバで必要とするWALディスク容量を減少させました。 (Simon)

    この変更によりウォームスタンバイサーバは、不要になったWALファイルの自動削除を行いつつ、もっとも初期かつまだ必要なWALファイルの名前をリカバリスクリプトに渡すことができます。 これはrecovery.confrestore_commandにおいて%rを使用することで行われます。

  • 新しい論理型の設定パラメータarchive_modeはアーカイブ処理を制御します。(Simon)

    これまでは、archive_commandを空文字列に設定することでアーカイブ処理を無効にしました。 今回からはarchive_commandと独立したarchive_modeがアーカイブ処理の有効無効を切替えます。 これは一時的にアーカイブ処理を停止する際に役に立ちます。

E.51.3.6. 問い合わせ

  • 全文検索がコアデータベースシステムに統合されました。(Teodor, Oleg)

    テキスト検索が改良され、コアのコードに移り、デフォルトでインストールされるようになりました。 contrib/tsearch2は互換性を維持するためのインタフェースを含むようになりました。

  • NULLのソートを先にするか後にするかに関する制御を追加しました。(Teodor, Tom)

    ORDER BY ... NULLS FIRST/LASTという構文です。

  • インデックスにおいて、列単位の昇順/降順(ASC/DESC)順序付けオプションが可能です。(Teodor, Tom)

    これまでは、ASC/DESC指示子が混在したORDER BYを使用する問い合わせでは、インデックスを十分使用することはできませんでした。 今回から、ASC/DESC指示子に一致するようにインデックスが作成された場合、こうした状況でもインデックスを十分に使用できるようになります。 インデックス内のNULLのソート順も制御できるようになりました。

  • col IS NULLがインデックスを使用できるようになりました。(Teodor)

  • 更新可能なカーソル(Arul Shaji, Tom)

    これは、カーソルで返される行をUPDATEまたはDELETEするためにプライマリキーを参照する必要をなくします。 UPDATE/DELETE WHERE CURRENT OFという構文です。

  • カーソルでFOR UPDATEが使用可能です。(Arul Shaji, Tom)

  • データ型のI/O関数を呼び出すことで、すべてのデータ型と標準文字列型(TEXTVARCHARCHAR)との間の双方向のキャストをサポートする汎用機構を作成しました。(Tom)

    これまでは、こうしたキャストはこの目的に特化した関数を持つ型でのみ利用可能でした。 こうした新しいキャストは文字列へキャストする場合は代入のみ、逆は明示的のみです。 このため予期しない動作を行わないはずです。

  • すべての入力がドメイン型の時、UNIONとそれに関連する式がドメイン型を返すことができます。

    これまでは、出力はドメインの基本型になるものとみなされていました。

  • 2つの異なるデータ型を使用する時限定されたハッシュ処理が可能です。(Tom)

    これにより、データ型を跨った比較を行う状況においてデータ型のハッシュ関数が互換性がある場合、ハッシュ結合、ハッシュインデックス、ハッシュ化副計画、ハッシュ集約を使用することができます。 現在、データ型を跨るハッシュ処理のサポートは、smallint/integer/bigintに対するもの、およびfloat4/float8に対するものが存在します。

  • WHERE句内に同じ変数があることを検知する、オプティマイザのロジックを改良しました。(Tom)

    これにより、マージ結合が降順ソート順で動作するようになります。 また、冗長なソート列の認識も改良されました。

  • ほとんどのテーブルが制約による除外を行う大規模な継承構造の計画を作成する性能が向上しました。(Tom)

E.51.3.7. オブジェクトの操作

  • 複合型の配列。(David Fetter, Andrew, Tom)

    明示的に宣言された複合型の配列の他、システムカタログ、シーケンス、TOASTテーブルの行型を除く、通常のテーブルやビューの行型の配列もサポートされます。

  • サーバ設定パラメータを関数単位で設定できるようになりました。(Tom)

    例えば関数は、実行時に異なるsearch_pathが存在する場合の誤動作を防ぐために、独自のsearch_pathを設定することができます。 SECURITY DEFINER関数はセキュリティの抜け穴を防ぐためにsearch_pathを設定すべきです。

  • CREATE/ALTER FUNCTIONCOSTおよびROWSオプションをサポートするようになりました。(Tom)

    COSTにより関数呼び出しにかかるコストを指定できます。 ROWSにより集合を返す関数で返される平均行数を指定できます。 これらの値は最善の計画を選択する際にオプティマイザにより使用されます。

  • CREATE TABLE LIKE ... INCLUDING INDEXESを実装しました。(Trevor Hardcastle, Nikhil Sontakke, Neil)

  • CREATE INDEX CONCURRENTLYは他のデータベース内のトランザクションを無視することができます。(Simon)

  • ALTER VIEW ... RENAME TOおよびALTER SEQUENCE ... RENAME TOを追加しました。(David Fetter, Neil)

    これまでは、ALTER TABLE ... RENAME TO経由でしか行うことができませんでした。

  • CREATE/DROP/RENAME DATABASEが失敗する前に、競合するバックエンドの終了を短期間待機するようにしました。(Tom)

    これにより、これらのコマンドが成功する可能性が増えました。

  • リプリケーションを目的とした、設定パラメータを使用してトリガとルールをまとめて無効化することができます。(Jan)

    これによりリプリケーションシステムは、システムカタログを直接変更することなく、トリガとルールをグループとして無効にすることができます。 この動作はALTER TABLEと新しいsession_replication_roleパラメータにより制御されます。

  • ユーザ定義型が型修飾子を持つことができるようになりました。(Teodor, Tom)

    これによりユーザ定義型はssnum(7)のような修飾子を取ることができます。 以前は組み込み型のみが修飾子を持つことができました。

E.51.3.8. ユーティリティコマンド

  • スーパーユーザ以外のデータベース所有者が、デフォルトで所有するデータベースに信頼できる手続き言語を追加できるようになりました。(Jeremy Drake)

    これはかなり安全ですが、一部の管理者はこの権限を取り上げたいと考えるかもしれません。 これはpg_pltemplate.tmpldbacreateで制御されます。

  • セッションの現在のパラメータ設定を今後のセッションにおけるデフォルトとして使用できます。(Tom)

    これはCREATE/ALTER FUNCTIONALTER DATABASEALTER ROLESET ... FROM CURRENTを付けることで行われます。

  • 新しいコマンドDISCARD ALLDISCARD PLANSDISCARD TEMPORARYCLOSE ALLDEALLOCATE ALLを実装しました。(Marko Kreen, Neil)

    これらのコマンドは単にデータベースセッションをその初期状態に再設定します。 特に接続プールソフトウェアで有用です。

  • CLUSTERをMVCCセーフにしました。(Heikki Linnakangas)

    これまではCLUSTERは、不要と確定したすべてのタプルを、たとえMVCCの可視性規則の下でそのタプルを参照することができるはずのトランザクションが他にあったとしても破棄しました。

  • CLUSTERに新しい構文、CLUSTER table USING indexを追加しました。(Holger Schurig)

    古いCLUSTER構文もまだサポートされますが、新しい構文の方が論理的であるとみなされています。

  • 複雑な計画をより正確に表示できるようにEXPLAINを修正しました。(Tom)

    副計画出力への参照が、複雑な場合?columnN?を使わずに、常に正しく表示されるようになりました。

  • ユーザが削除された時に報告される情報量を制限しました。(Alvaro)

    これまでは、多くのオブジェクトを所有するユーザを削除した(または削除しようとした)時、そのオブジェクトすべてを列挙する、多くのNOTICEまたはERRORメッセージが生成されました。 これは一部のクライアントアプリケーションで問題になりました。 メッセージ長は制限されるようになりましたが、サーバログにはまだすべてのリストが送信されます。

E.51.3.9. データ型

  • SQL/XML標準をサポートしました。これに伴い、新しい演算子とXMLデータ型が含められました。(Nikolay Samokhvalov, Pavel Stehule, Peter)

  • 列挙データ型(ENUM)。(Tom Dunstan)

    この機能は、小さく、固定の集合のみの値を許すフィールドに対して簡便なサポートを提供します。 ENUM型の作成例はCREATE TYPE mood AS ENUM ('sad', 'ok', 'happy')です。

  • 汎用一意識別子(UUID)データ型。(Gevik Babakhani, Neil)

    これはRFC 4122にほぼ合致します。

  • MONEYデータ型を64ビットに広げました。 (D'Arcy Cain)

    これは MONEY型の値がサポートする範囲を大きく増やします。

  • 一貫してInfinity and NAN (Not A Number)を扱うことができるようにfloat4/float8を修正しました。(Bruce)

    以前のコードではInfinity とオーバーフロー条件の区別に一貫性がありませんでした。

  • boolean値の入力の際、前後の空白文字が許されます。(Neil)

  • 区切り文字として数字と小文字を使用することをCOPYは防止するようになりました。(Tom)

E.51.3.10. 関数

  • 新しい正規表現関数regexp_matches()regexp_split_to_array()regexp_split_to_table()を追加しました。(Jeremy Drake, Neil)

    これらの関数は正規表現副式の抽出を提供し、POSIX正規表現を使用した文字列の分割を行うことができます。

  • ラージオブジェクトの切り詰めを行うlo_truncate()を追加しました。(Kris Jurka)

  • float8データ型に対するwidth_bucket()を実装しました。(Neil)

  • 現在のトランザクションで収集された統計情報のスナップショットを破棄するpg_stat_clear_snapshot()を追加しました。(Tom)

    トランザクションにおける最初の統計情報の要求はトランザクション期間で変更されない統計情報のスナップショットを取ることです。 この関数によりこのスナップショットを破棄し、次の統計情報問い合わせで新しいスナップショットを読み込むことができます。 これは特に、単一トランザクション内に制限されるPL/pgSQL関数で有用です。

  • EXTRACT()およびdate_part()isodow オプションを追加しました。(Bruce)

    これは日曜を7とした週内日数を返します(dowは日曜を0とします)。

  • to_char()to_date()to_timestamp()ID(ISO週内日数)およびIDDD(ISO年内日数)書式コードを追加しました。(Brendan Jurd)

  • to_timestamp()およびto_date()が、長さが可変となる可能性があるフィールドに対してTM (trim)オプションを前提とするようにしました。

    これはOracleの動作と合致します。

  • to_date()/to_timestamp()D(非ISO週内日数)の変換における一つ違いのエラーを修正しました。(Bruce)

  • setseed()を、無意味な整数値ではなくvoidを返すようにしました。(Neil)

  • NUMERIC用のハッシュ関数を追加しました。(Neil)

    これによりNUMERIC列でハッシュインデックスとハッシュを基にした計画が利用できるようになりました。

  • LIKE/ILIKEの効率を、特にUTF-8のようなマルチバイト文字セットで、向上させました。(Andrew, Itagaki Takahiro)

  • currtid()が対象テーブルについてのSELECTを必要とするようにしました。(Tom)

  • 活動中のトランザクションIDを問い合わせるためのtxid_*()関数を複数追加しました。(Jan)

    これは各種リプリケーションソリューションで有用です。

E.51.3.11. PL/pgSQLサーバサイド言語

  • FETCHでの方向指定を含む、スクロール可能なカーソルのサポートを追加しました。(Pavel Stehule)

  • バックエンドのFETCHコマンドと合わせ、PL/pgSQLのFETCHにてFROMの代わりにINを使用可能にしました。(Pavel Stehule)

  • PL/pgSQLにMOVEを追加しました。(Magnus, Pavel Stehule, Neil)

  • RETURN QUERYを実装しました。(Pavel Stehule, Neil)

    これは、PL/pgSQLの集合を返す関数で問い合わせの結果を返したい場合向けに簡便な構文を追加します。 RETURN QUERYは、 RETURN NEXTをループさせるよりも簡単で効率的です。

  • 関数のパラメータ名を関数名で修飾できるようにしました。(Tom)

    例えば、myfunc.myvarです。 これは特に、列名と名前が一致する可能性がある変数を問い合わせ内で指定する場合に役に立ちます。

  • ブロックレベルの変数修飾が適切に動作するようにしました。(Tom)

    これまでは、より外側のブロックラベルがより内側のレコードや行参照の認識に意図せず干渉していました。

  • FORループのSTEP値の必要条件を厳密にしました。(Tom)

    非正のSTEP値を許しません。 また、ループのオーバーフローを取り扱います。

  • 構文エラーで報告する発生位置の精度を高めました。(Tom)

E.51.3.12. 他のサーバサイド言語

  • PL/Perl spi_prepare()への型名引数がpg_type内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

  • PL/Python plpy.prepare()への型名引数がpg_type内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

  • PL/Tcl spi_prepareへの型名引数がpg_type内の名前の他にデータ型の別名を取ることができるようになりました。(Andrew)

  • PL/PythonUがPython 2.5でコンパイルできるようになりました。 (Marko Kreen)

  • Python版と互換性のある、本当のPL/Python論理型をサポートします。(Marko Kreen)

  • スレッドが有効なlibtclを使用した場合にバックエンド内で複数のスレッドが生成されるPL/Tclの問題を修正しました。(Steve Marshall, Paul Bayer,Doug Knight)

    これはまったく不愉快な事象を引き起こしました。

E.51.3.13. psql

  • \dの出力で無効なトリガを別途列挙します。(Brendan Jurd)

  • パターン指定の\dで、常に$そのものに一致します。(Tom)

  • \da出力にて集約の戻り値型を示します。(Greg Sabino Mullane)

  • \df+の出力に関数の揮発性状態を追加しました。 (Neil)

  • \prompt機能を追加しました。(Chad Wagner)

  • \pset\t\xが単に切替えるだけでなくonまたはoffを指定できるようになりました。(Chad Wagner)

  • \sleep機能を追加しました。(Jan)

  • \copy\timing出力を有効にしました。(Andrew)

  • Windowsにおいて\timingの解像度を向上させました。(Itagaki Takahiro)

  • 各バックスラッシュコマンドの後\o出力をフラッシュします。(Tom)

  • -fで指定された入力ファイルの読み取り時に正確にエラーを検知し報告します。(Peter)

  • -uオプションを削除しました(これはかなり前から廃止予定でした)。(Tom)

E.51.3.14. pg_dump

  • pg_dumpall--tablespaces-onlyおよび--roles-onlyオプションを追加しました。(Dave Page)

  • pg_dumpallに出力ファイルオプションを追加しました。(Dave Page)

    これは主に、pg_dump子プロセスの出力リダイレクションが動作しない、Windowsで有用です。

  • pg_dumpallが初期接続用にデフォルトのtemplate1以外のデータベース名を受け付けられるようになりました。(Dave Page)

  • -nおよび-tスイッチにて、常に$そのものに一致します。(Tom)

  • データベースが数千のオブジェクトを持つ場合の性能を向上しました。(Tom)

  • -uオプションを削除しました(これはかなり前から廃止予定でした)。(Tom)

E.51.3.15. 他のクライアントアプリケーション

  • initdbで、pg_xlogディレクトリの場所を指定できるようになりました。(Euler Taveira de Oliveira)

  • サポートされるオペレーティングシステムでは、pg_regress内でサーバコアファイルの生成が有効になりました。(Andrew)

  • pg_ctl-t(時間切れ)パラメータを追加しました。(Bruce)

    これは、サーバ起動時または停止時にpg_ctlが待機する時間を制御します。 これまでの待機時間は固定で60秒でした。

  • サーバコアダンプの生成を制御するためにpg_ctlのオプションを追加しました。(Andrew)

  • Control-Cでclusterdbreindexdbvacuumdbをキャンセルできるようにしました。(Itagaki Takahiro, Magnus)

  • createdbcreateuserdropdbdropuserでコマンドタグの出力を抑制します。(Peter)

    --quietオプションは無視され、8.4で削除される予定です。 全データベースを実行している場合の進行メッセージは、実際のエラーではありませんので、標準エラー出力ではなく標準出力に出力されるようになりました。

E.51.3.16. libpq

  • PQsetdbLogin()dbNameパラメータが等号記号を含む時conninfo文字列として解釈されます。(Andrew)

    まだPQsetdbLogin()を使用しているクライアントプログラムでconninfo文字列を使用できるようになります。

  • 大域的なSSL設定ファイルをサポートします。(Victor Wagner)

  • SSLハードウェアキーを制御するPGSSLKEY環境変数を追加しました。(Victor Wagner)

  • ラージオブジェクトを切り詰めるためのlo_truncate()を追加しました。(Kris Jurka)

  • サーバがパスワードを必要としているが、何も与えられていない場合に真を返すPQconnectionNeedsPassword()を追加しました。(Joe Conway, Tom)

    接続試行に失敗した後に真を返した場合、クライアントアプリケーションはユーザにパスワードの入力を促すべきです。 これまでのアプリケーションでは、パスワードが必要かどうかを決めるために、特定エラーメッセージの検査を行う必要がありました。 この方法は推奨されなくなりました。

  • 与えたパスワードが実際に使用された場合に真を返すPQconnectionUsedPassword()を追加しました。(Joe Conway, Tom)

    ユーザが与えたパスワードが実際に有効だったかどうかの確認が重要となる一部のセキュリティコンテキストで、これは役に立ちます。

E.51.3.17. ecpg

  • V3フロントエンド/バックエンドプロトコルを使用します。(Michael)

    これは、サーバサイドの準備済み文のサポートを追加します。

  • Windowsでpthreadではなくネイティブのスレッドを使用します。(Magnus)

  • ecpglibのスレッド安全性を向上しました。(Itagaki Takahiro)

  • ecpgライブラリが必要なAPIシンボルのみをエキスポートするようにしました。(Michael)

E.51.3.18. Windowsへの移植

  • Microsoft Visual C++を使用したPostgreSQL配布物全体のコンパイルを可能にしました。(Magnus and others)

    これによりWindowsを基に開発する開発者が慣れた開発ツール、デバッグツールを使用できるようになりました。 また、Visual C++で作成されたWindows実行形式ファイルは、他のツールセットで作成されたファイルより優れた安定性と性能を持ちます。 クライアントのみを構築するVisual C++のスクリプトは削除されました。

  • 多くの子プロセスを持つ時のpostmasterのメモリ使用量を劇的に減少させました。(Magnus)

  • リグレッション試験が管理者ユーザで起動できるようになりました。(Magnus)

  • ネイティブな共有メモリの実装を追加しました。(Magnus)

E.51.3.19. サーバプログラミングインタフェース(SPI)

  • SPIにカーソル関連の機能を追加しました。(Pavel Stehule)

    カーソル関連の計画作成オプションにアクセスすることができます。 また、FETCH/MOVE処理を追加しました。

  • SPI_execute経由でカーソルコマンドを実行することができます。 (Tom)

    SPI_ERROR_CURSORはまだ存在しますが、何も返しません。

  • SPI計画ポインタはvoid *ではなくSPIPlanPtrとして宣言されます。(Tom)

    これはアプリケーションコードを壊しませんが、単純なプログラムミスを見付けやすくするために変更することを勧めます。

E.51.3.20. 構築オプション

  • コードプロファイリング(gccでのみ動作)を有効にするためにconfigureのオプションに--enable-profilingを追加しました。(Korry Douglas and Nikhil Sontakke)

  • オペレーティングシステムの時間帯データベースを使用するためにconfigureのオプションに--with-system-tzdataを追加しました。(Peter)

  • pg_configプログラムがPATHの先頭にないPostgreSQLインストレーションに対して拡張を構築できるようにPGXSを修正しました。(Tom)

  • SGML文書の構築時のgmake draftをサポートします。(Bruce)

    draftを使わない場合、インデックス更新を確実にするために必要ならば、文書の構築が2回行われます。

E.51.3.21. ソースコード

  • サードパーティによりDLLIMPORTが宣言されたインクルードファイル(Tclのような)との競合を防ぐために、DLLIMPORTマクロ名をPGDLLIMPORTに変更しました。(Magnus)

  • データ型を跨った比較を含む問い合わせの計画作成を改良するために"演算子族"を作成しました。(Tom)

  • 問い合わせを満たすことができるものが存在しなかったことを通知できるようにGINのextractQuery() APIを更新しました。(Teodor)

  • NAMEDATALEN定義をpostgres_ext.hからpg_config_manual.hに移動しました。(Peter)

  • すべてのプラットフォームでstrlcpy()およびstrlcat()を提供します。 また、エラーが起こりがちのstrncpy()strncat()などの使用を置き換えました。(Peter)

  • 外部のプラグインによりプランナを監視(置き換えることすら可能)させる、および、仮定の状況に対する計画を作成するためのフックを作成しました。(Gurjeet Singh, Tom)

  • プラグインにプランナの結合検索順の位置を上書きさせるためのjoin_search_hook関数変数を作成しました。(Julius Stroffek)

  • ルネサスM32Rプロセッサ向けのtas()サポートを追加しました。(Kazuhiro Inaoka)

  • quote_identifier()およびpg_dumpは、文法に従い保持されないキーワードに引用符を付けません。(Tom)

  • sign_dscaleワードが重みより前に来るように、NUMERICデータ型のディスク上の表現を変更しました。

  • Darwin >= 6.0、つまりOS X 10.2以上でPOSIXではなくSYSVセマフォを使用します。(Chris Marcellino)

  • acronymおよびNFSに関する節を文書に追加しました。(Bruce)

  • "PostgreSQL"の別名として受け入れられるものとして"Postgres"が文書化されました。(Peter)

  • データベースサーバが停止している場合のサーバなりすまし防止に関する文書を追加しました。(Bruce)

E.51.3.22. Contrib

  • contrib READMEの内容を主PostgreSQL文書に移しました。(Albert Cervera i Areny)

  • 低レベルなページ検査を行うcontrib/pageinspectモジュールを追加しました。(Simon, Heikki)

  • ウォームスタンバイ操作を制御するcontrib/pg_standbyモジュールを追加しました。(Simon)

  • OSSP UUIDライブラリを使用してUUID値を生成するcontrib/uuid-osspモジュールを追加しました。(Peter)

    configure --with-ossp-uuidを使用して有効にします。 これは新しく組込まれたUUID型を使用します。

  • テキスト検索辞書テンプレートとパーサを追加するためのサンプルを提供するcontrib/dict_intcontrib/dict_xsyncontrib/test_parserモジュールを追加しました。(Sergey Karpov)

  • contrib/pgbenchでフィルファクタを設定できるようにしました。(Pavan Deolasee)

  • contrib/pgbench -lにタイムスタンプを追加しました。(Greg Smith)

  • contrib/pgbuffercacheに使用カウントに関する統計情報を追加しました。(Greg Smith)

  • contrib/hstoreにGINサポートを追加しました。(Teodor)

  • contrib/pg_trgmにGINサポートを追加しました。(Guillaume Smet, Teodor)

  • contrib/start-scriptsのOS/X用起動スクリプトを更新しました。(Mark Cotner, David Fetter)

  • pgrowlocks()dblink_get_pkey()を対象テーブルにSELECT権限を持つユーザに制限しました。(Tom)

  • contrib/pgstattuple関数をスーパーユーザに制限しました。(Tom)

  • contrib/xml2は推奨しません。8.4で削除される予定です。

    PostgreSQLのコアにある新しいXMLサポートがこのモジュールに取って代わりました。