概要このリリースの大きな変更点を以下に示します。副問い合わせは、シーケンシャルスキャンによって副問い合わせと一致する上位の問い合わせと結合されていました。7.4のコードでは、通常の結合で使用される洗練された技術と同じものを使用し、そのため、非常に高速になりました。同程度の速度、場合によってはより高速になりました。これにより、これまでのリリースにおいて行なっていた慣習的常識はくつがえりました。以前のリリースでは、グループ化される行が最初にソートされました。BYができるようになりました。ハッシュテーブルがsort_memに収まるには大き過ぎると推定した場合、まだソート技術を使用します。複数キーによるハッシュ結合能力(新規)以前のリリースでは、ハッシュ結合は1つのキー上でのみ存在できました。このリリースでは、複数列に対するハッシュ結合が可能です。構文によって示される順番で評価していました。7.4ではこれらの問い合わせを完全に最適化できるようになりました。オプティマイザは全ての結合順序を考慮し、最も効率的なものを選択します。外部結合はまだ宣言順に従わなければなりません。Spencer氏による新しいバージョンに置き換えられました。このコードではかなり性能が向上し、様々な種類の正規表現をサポートしています。簡単なSQL関数を元の問い合わせ内のSQLに含めることによりインライン化できるようになりました。呼び出しに伴うオーバーヘッドを抑制することにより、性能が向上します。簡単なSQL関数がマクロのように動作するようになりました。完全なIPv6接続とIPv6アドレスデータ型のサポート以前のリリースでは、IPv4接続のみが可能、そしてIPデータ型としてはIPv4アドレスのみをサポートしていました。このリリースでは両者に関して完全なIPv6をサポートしています。APIに非常に詳しい方々により、SSLコードは書き直され、SSLキー調停やエラー復旧が改良されました。空き領域マップが効率的に空インデックスページを再利用するようにしました。他の空き領域の管理を改良しました。以前のリリースでは、削除行によって空のまま残されたB-treeインデックスページは、元々そのページにインデックス付けされた行に近いインデックス値を持つ行によってのみ再利用されました。7.4では、VACUUMは空のインデックスページを記録し、それらを将来のインデックス行用に再利用することができます。標準SQLの情報スキーマ情報スキーマは、データベース内で定義されたスキーマオブジェクトについての情報にアクセスするための、標準化され、安定した方法を提供します。カーソルはより標準SQLに近く従うようになりましたFETCHとMOVEコマンドは、より標準SQLに近く従うよう改良されました。カーソルがトランザクションの外側でも存在できるようになりましたこれらのカーソルは保持可能カーソルとも呼ばれます。新しいクライアントからサーバへのプロトコル新しいプロトコルでは、エラーコード、より多くの状況情報、より高速な起動、より優れたバイナリデータの通信、SQLコマンドとパラメータ値の分離、プロトコルレベルで利用できる準備された文が付与されました。COPY失敗時の復旧がより明確になりました。昔のプロトコルもまだ、サーバ、クライアントともサポートされています。リリースでも既にスレッドをサポートしていましたが、このリリースでは、データベース接続開始期間に使用されていたスレッドセーフでないいくつかのコードを修正し、スレッドセーフに改良されました。この機能を有効にするには、configureの--enable-thread-safetyを使用しなければなりません。新しいバージョンのフルテキストインデックスcontrib/tsearch2にある新しいフルテキストインデックス手法が利用可能です。新しい自動vacuumツールcontrib/autovacuumにある新しい自動vacuumツールは、INSERT/UPDATE/DELETEの活動について、統計情報テーブルを監視し、必要に応じて自動的にvacuumを行ないます。配列の扱いは、改良され、サーバの中核部分に移りました多くの配列の制限が取り除かれました。これにより、配列は、ほぼ完全にデータ型をサポートできるように動作します。よるダンプ/リストアが必要です。以下の非互換部分を確認して下さい。サーバ側での自動コミット設定は削除され、クライアントアプリケーションと言語内で再実装されました。サーバ側の自動コミットは、自動コミットの振舞いを自身で制御したい言語やアプリケーションで、多くの問題の原因となっていました。そのため、サーバから自動コミットは取り除かれ、個々のクライアントAPIに適切に追加されました。エラーメッセージの言葉使いがこのリリースで大きく変わりました。これらのメッセージをより正確に、よりユーザ向けにするために非常に多くの労力を費やしました。アプリケーションがエラーメッセージを解析してエラー条件の違いを検知するようであれば、その代わりに、新しいエラーコード機能を使用するように強く勧めます。明示的なJOINを使用する内部結合構文の振舞いが変わる可能性があります。これらはより良く最適化されるようになったためです。多くのサーバ設定パラメータの名前が、明確になるように変更されました。ログに関連したパラメータです。何も行なわないようになりました。カーソルの最後まで移動していました。実際に取り出し/移動した行の数を返すようになりました。カーソルがその先頭/最後にあった場合は0を返します。以前のリリースは、そのコマンドに渡した行数を返し、実際に取り出した、あるいは、移動した行数を返しませんでした。行末を表すシーケンスとして、復帰のみ、あるいは、復帰/改行を使用したファイルも処理できるようになりました。復帰と改行そのものは、データ値としては受け付けられません。\nを使用して下さい。textへの変換時、最後の空白は除去されるようになりました。これは、ほとんどのユーザが常にそうなってほしいと期待している動作です。データ型は、10進数ではなく、2進数でのp桁を表すようになりました。新しいこの動作は、標準SQLに従います。曖昧な日付値は、datestyle設定で指定した順序に一致しなければならなくなりました。以前のリリースでは、10/20/03というデータ指定は、datestyleで日が最初であると指定していたとしても、10月と解釈されていました。7.4では、日付の指定がその時点のdatestyle設定では無効である場合、エラーが発生します。関数が削除されました。これらの関数は、もう使用されることはないと決定されました。'now'や'today'のような時間が変動する日付/時刻値を指定する文字列リテラルは、列のデフォルト式で想定したとおりに働かなくなりました。これらは、挿入時の時刻ではなく、テーブルを生成した時刻をそのデフォルトに設定するようになりました。その代わりに、now()、current_timestamp、current_dateといった関数を使用して下さい。以前のリリースでは、'now'といった文字列がテーブル生成時刻ではなく、INSERT時刻と解釈されるような特殊なコードがありました。この回避方法は全ての場合に適用されませんでした。current_timestampといった関数を適切に使用して定義することが必須となりました。これらは全ての状況で動作します。ドル印($)は演算子名として使用できなくなりました。その代わり、識別子の文字(先頭文字は除く)として使用できるようになりました。これは、他のデータベースシステムとの互換性を向上させるため、および、パラメータのプレースホルダ($n)が演算子に近接していた場合の構文問題を防止するために行なわれました。以下に、リリース7.4と以前のメジャーリリースとの間になされた変更点について、詳細な説明を示します。Chittenden)SSLの性能の低さのために、SSLキーの再調停があまりにも頻繁に発生していました。初期のキーの取扱いが改良されました。(Tom)これによりデッドロック状況のデバッグが容易になります。ディレクトリを整理する管理スクリプトによってサーバソケットファイルが削除されてしまうことを防ぐ助けになるでしょう。(Tom)以前のリリースでは、ある特定かつ稀な場合、サーバクラッシュによりB-treeインデックスが破損してしまいました。このリリースでは、これらのもっとも稀な場合について削除しました。他のデータベースセッションがインデックス項目を探すことができない、短い時間がありました。このリリースはこの稀に起こる失敗を修正しました。(Tom)以前のリリースでは、postmasterが停止した時に空領域は保存されませんでした。そのため、新しく稼働したサーバは、空領域情報を持ちませんでした。このリリースでは、空領域マップを保存し、サーバの再起動時にそれを再読み込みします。(Tom)以前のリリースでは、割り当てられたメモリを返す関数は、問い合わせが完了するまで、それを解放しませんでした。このリリースでは、関数が割り当てたメモリを関数呼び出しの終了時に解放することができ、関数で使用される総メモリ量が減少します。(Tom)このリリースでは、GEQOオプティマイザの潜在的な問い合わせ経路の管理方法において複数の非効率な点を修正しました。(Peter)非ASCIIのロケールでは、LIKE比較用の標準的なインデックスを使用する方法がありません。このリリースではLIKE用に特別なインデックスを作成する方法を追加しました。(Joe)長時間読み込まれる共有ライブラリでは、このオプションを利用でき、そのライブラリはpostmaster内であらかじめ読み込まれ、全てのデータベースセッションで継承されます。(Tom)新しいクライアント/サーバプロトコルでは、データベースセッション開始のために必要なネットワークパケットがより少なくなりました。(Tom)以前のリリースでは、特に、同時実行数が多い状況では、ハッシュインデックスの低性能が見られました。このリリースではそれを修正し、開発グループでは、B-treeとハッシュインデックスとの性能比較についての報告をまとめました。Spraul)特定のCPUでは、アドレスが32バイトで整列された時にデータコピーがより高速になります。(Tom)numericは100を基として保存していました。良い性能のために、新しいコードでは10000を基として使用します。(Bruce)これはlog_から始まるサーバのログを制御するほとんどのパラメータに対して行なわれました。(Bruce)以前のリリースでは、チェックポイントが頻繁に発生し過ぎているかどうかを認識することは困難でした。この機能により、過度なチェックポイントの発生時にサーバログに警告が追加されます。(Bruce)非スーパーユーザが管理者によって有効にされたログ取得を無効にすることを不可能とする、セキュリティに関するものです。(Bruce)これはクライアントデバッグ情報を集中化し、これにより、全てのデバッグ用出力がクライアントログもしくはサーバログに送信できます。Xホストが利用可能なPostgreSQLサーバにネットワークから問い合わせできるようになります。(Christopher)これは、よく要求のあったデバッグ機能で、これにより、管理者はサーバログ内で低速な問い合わせのみを見られるようになります。Dunstan)これにより、管理者はpg_hba.conf内でホストIPアドレスとネットマスクフィールドを単一CIDRフィールドにまとめることができます。(Tom)これは、新しいエラー報告機能と一緒に動作し、ヒントやファイル名、行番号などのエラー情報を更に提供します。Peter)このオプションは、設定変数名とその最小、最大、デフォルト、説明文を把握する必要がある管理ツールで有用です。(Tom)以前のバージョンではデフォルトで64共有バッファでした。そのため、非常に古いシステムでもPostgreSQLが起動できました。このリリースでは、プラットフォームで許可された共有メモリ量を試験し、可能であれば、より理想的なデフォルト値を選択します。ユーザはリソースの使用状況を評価し、それに合わせてshared_buffersの大きさを決定することもまだ可能です。Jensen)以前のリリースでは、クライアントとサーバがSSLをサポートする場合、SSL接続を防ぐ方法がありませんでした。このオプションでその機能が可能です。Brown)以前のリリースでは、スーパーユーザのみがpg_stat_activityを使用して問い合わせ文字列を確認することができました。通常のユーザが自身の問い合わせ文字列を確認できるようになりました。(Tom)標準SQLでは、入れ子になった副問い合わせ内の集約関数は、その引数に問い合わせ外部の変数のみが含まれる場合、その外部の問い合わせに属すると規定しています。以前のPostgreSQLのリリースでは、この点を正しく扱っていませんでした。Andrews)デフォルトでは、問い合わせ内にあり、FROM句にまだ存在しないテーブルは自動的にFROM句に追加されました。これは、歴史的なPOSTGRESの振舞いと互換性がありますが、標準SQLとは反対です。このオプションにより、標準と互換性がある動作を選択することができます。(Rod)これによりUPDATEは列を宣言されたデフォルト値に設定することができます。(Tom)以前のリリースでは、LIMIT/OFFSETには定数のみを使用でき、式は使用できませんでした。(Neil)これにより文の終了時にトリガを発行することができます。そのトリガは文によって変更された全ての行にアクセスすることはできません。この能力は将来のリリースで計画しています。(Rod)ドメインに検査制約を使用できるようになり、ドメインの有用性が非常に高くなりました。(Rod)これにより既存のドメインの操作が可能です。(Tom)PostgreSQLはゼロ列のテーブルをサポートします。したテーブルの使用時に発生する各種の不具合を修正しました。PRIMARYは一意性制約を追加しますが、非NULL制約を追加しませんでした。このリリースで修正されました。(Rod)これにより新規行、更新された行がOID列を持つかどうかを制御することができます。これは、ほとんどの場合、格納領域の節約に有用です。Herrera)このコマンドはpg_dumpで使用され、以前にクラスタ化された各テーブルのクラスタ用列を記録します。この情報はデータベース全体のクラスタによって、以前にクラスタ化されたテーブルをクラスタ化するために使用されます。(Peter)これにより、GRANTは他のユーザにオブジェクトの権限を付与する能力を与えることができるようになります。(Gavin)これにより、トランザクションのコミット時にテーブルの削除、もしくは、全行の削除を行なう機能が追加されました。(Neil)以前のリリースでは、カーソルはそのカーソルを作成したトランザクションの終端で削除されました。HOLDオプションを付けて作成できるようになり、これにより、作成したトランザクションがコミットされた後でもそのカーソルにアクセスできるようになります。0はカーソルの終端まで移動しました。MOVEで返される行数は、実際に処理された行数を反映したものではありませんでした。(Neil)ある種の問い合わせに(前方、および、後方にスクロールする)ランダムアクセスを許可することは、何らかの追加作業なしでは行なうことができません。カーソル生成時にSCROLLが付与された場合、この追加作業が行なわれます。SCROLLで生成された場合は、ランダムアクセスは許可されません。Herrera)これにより、過去にクラスタ化されたテーブルは全て、単一コマンドで再度クラスタ化することができます。トランザクション内部で使用できるようになりました。行なわれた変更は自動的にロールバックされます。(Tom)以前のリリースでは、関数インデックスは、1つ以上の列名に適用される単一の関数のみをサポートしていました。このリリースでは、任意の種類のスカラ式を使用できます。(Rod)データベースのコメントは、データベースに局所的なテーブルに保存されます。そのため、データベース上のコメントは各データベース内に保存されなければなりません。(Tom)これにより、以前のリリースでは必要であった、スタンドアロンセッションの必要なしにシステムテーブルのインデックスを再作成できます。現時点で、インデックスの再作成のためにスタンドアロンセッションが必要なテーブルは、pg_database、pg_shadow、pg_group.グローバルシステムテーブルのみです。Tom)これにより、レグレッション試験で問題の原因となった、出力精度を制御することができます。(Joe)MD5関数がしばしば要求されました。複雑な暗号化のためにはcontrib/pgcryptoを使用して下さい。(Joe)これにより、任意のデータ型で動作できる関数を作成できるようになります。(array_val)のような目的のために、配列が値のリストのように振舞うことができます。(Tom)閏秒には60秒という値が必要でした。Zoltán)以前のリリースのこの関数の呼び出しは不正確な値を返しました。空白文字の直後だけではなく、非英数字の直後の文字を大文字にするようになりました。max()ではこれを正しく取っていませんでした。Tom)Python言語は制限付き実行環境をサポートしなくなりました。そのため、信頼されたバージョンのPL/Pythonは削除されました。この状態が変われば、非スーパーユーザで使用可能なバージョンのPL/Pythonは再び追加されるでしょう。(Greg)これにより行数がスクリーンの高さよりも少なかったとしても強制的にページャを使用します。これは、スクリーンの複数行に跨がる行では価値があります。client_encodingを使用した符号化方式の変更は\encodingに影響しませんでした。(Ross)\eを使用して問い合わせを編集する場合、その結果はreadlineの履歴に保存され、上矢印キーを使用して取り出すことができます。(Tom)これは、削除されたautocommitサーバパラメータの代わりになります。(Tom)これは新しいエラー報告の詳細を制御します。STORAGEの情報を保持します。AUTHORIZATIONpg_dumpはユーザを切替えるための再接続を行なわないようになりました。AUTHORIZATIONを使用します。これはリストア時のパスワード問い合わせを減少させます。platformsPostgreSQLはその内部に長い名前のオプションを処理する関数を含むようになりました。(Bruce)Windowsは、あるライブラリで割り当てられたメモリを同じライブラリ内の関数で解放することを要求します。そのため、free()では、libpqで割り当てられたメモリの解放を行なうことができません。libpqのメモリを解放する適切な方法です。これは他のプラットフォームでも推奨されます。(Bruce)これにより、クライアントはクライアントマシン上で中央にまとめられたファイル内の接続情報を検索することができます。(Tom)指定した結果セットに関連する、背後にあるテーブルと列の名前を把握したい問い合わせ構築ツールで役にたちます。(Michael)これにより、ECPGは、Informix拡張を使用して作成された組み込みCプログラムを処理できます。Bruce)これにより、複数のスレッドが同時にデータベースにアクセスできます。CONVERSIONがありますので、これはもはや不要です。(Bruce)スピンロック用のコードがないプラットフォームは、セマフォをこっそりと使用するのではなく、コンパイルに失敗するようになります。この失敗は、新しいconfigureオプションで無効にすることができます。リリース7.3.21。