リリース日: 2008-02-04
重大な新機能と性能向上を伴うこのリリースは、PostgreSQLを大きく飛躍させたものと言えます。 これは開発速度が劇的に速くなったコミュニティの成長によりなされました。 このリリースは以下の主要機能を追加します。
全文検索がコアデータベースシステムに統合されました。
SQL/XML標準をサポートしました。これに伴い、新しい演算子とXML
データ型が含められました。
列挙データ型(ENUM
)
複合型の配列
汎用一意識別子(UUID
)データ型
NULL
のソートを先にするか後にするかに関する制御を追加
更新可能カーソル
サーバ設定パラメータが関数単位で設定可能になりました。
ユーザ定義型が型修飾子を持つことができるようになりました。
テーブル定義の変更時または統計情報の更新時における、キャッシュされた問い合わせの自動計画再作成
ログ処理および統計情報収集における多くの改良
Windowsにおける認証のためのセキュリティサービスプロバイダインタフェース(SSPI)のサポート
複数の同時実行autovacuumプロセスのサポート。およびその他のautovacuumの改良
Microsoft Visual C++を使用したPostgreSQL配布物全体のコンパイルを可能にしました。
主要な性能に関する改良を以下に列挙します。 これらの改善のほとんどは自動的なものですので、ユーザによる変更や調整は不要です。
非同期コミットは、トランザクションコミット時のWALへの書き出しを遅延します。
各チェックポイントにおけるI/Oのピークを抑えるために、チェックポイントの書き出しをより長い時間に分散させることができます。
ヒープオンリータプル(HOT)は、ほとんどのUPDATE
とDELETE
における領域の再利用を促進します。
ジャストインタイムのバックグラウンドライタ戦略はディスク書き出し効率を改善します。
読み取りのみのトランザクションに対して非永続的なトランザクションIDを使用することで、オーバーヘッドとVACUUM
の必要性を削減します。
フィールド単位および行単位の格納にかかるオーバーヘッドが削減されました。
大規模なシーケンシャルスキャンがよく使用されるキャッシュされたページを押し出さないようになりました。
同時に行われる大規模なシーケンシャルスキャンがディスク読み取りを共有できるようになりました。
ORDER BY ... LIMIT
がソートなしで行うことができるようになりました。
上記項目は後述の節でより詳細に説明します。
すべての過去のリリースからデータを移行する場合、pg_dumpを使用したダンプ/リストアが必要です。
既知の非互換性を以下に示します。
文字以外のデータ型が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"
は単一の問い合わせメッセージとして送信されたとしても拒絶されるようになります。
トランザクションブロック外のROLLBACK
がWARNING
ではなく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
レベルを使用しない限り、連続アーカイブ処理がアーカイブ操作の成功の度にサーバログに報告しないようになりました。
サーバ管理用のパラメータで多くの変更があります。
bgwriter_lru_percent
、bgwriter_all_percent
、bgwriter_all_maxpages
、stats_start_collector
、stats_reset_on_server_start
が削除されました。
redirect_stderr
の名前がlogging_collector
になりました。
stats_command_string
の名前がtrack_activities
になりました。
stats_block_level
とstats_row_level
はtrack_counts
にまとめられました。
archive_mode
という新しい論理型の設定パラメータはアーカイブ処理を制御します。
Autovacuumのデフォルト設定が変わりました。
stats_start_collector
パラメータが削除されました。(Tom)
UDPソケットの作成に失敗しない限りコレクタプロセスを常に起動するようになりました。
stats_reset_on_server_start
パラメータが削除されました。(Tom)
この目的にpg_stat_reset()
を使用することができますので、このパラメータは削除されました。
postgresql.conf
でパラメータをコメントにすることで、そのデフォルト値に戻るようにしました。(Joachim Wieland)
これまではコメント化された項目は、次にサーバを再起動するまで、その値は変わらずに残りました。
符号化が無効なデータに対して、より多くの検査を追加しました。(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は安全ではありません。
PostgreSQL 8.3と以前のメジャーリリースとの間の違いについて、以下に詳しく説明します。
非同期コミットは、トランザクションコミット時のWALへの書き出しを遅延します。(Simon)
この機能により、短期のデータ変更を行うトランザクションの性能が大きく向上しました。
欠点はディスクへの書き出しが遅れるため、データをディスクへの書き出す前にデータベースシステムまたはオペレーティングシステムがクラッシュした場合コミットしたデータが失われる点です。
この機能は多少のデータ損失を受け入れることができるアプリケーションでは役に立ちます。
fsync
を無効にする場合と異なり、非同期コミットを使用する場合にはデータベースの一貫性に関する危険はありません。
最悪の場合でも、クラッシュの後、コミットされたと報告されている最後の数個のトランザクションが完全にコミットされていない可能性があるだけです。
この機能はsynchronous_commit
を無効にすることで有効になります(一部のトランザクションが極めて重要であり、その他は重要でないような場合、これはセッション単位やトランザクション単位で行うことができます)。
wal_writer_delay
を調整して、トランザクションが実際にディスクに書き出されるまでの最大遅延を制御することができます。
各チェックポイントにおけるI/Oのピークを抑えるために、チェックポイントの書き出しをより長い時間に分散させることができます。(Itagaki TakahiroとHeikki Linnakangas)
これまでは、すべての変更済みバッファはチェックポイント時可能な限り高速にディスクに書き出すことが強制されていました。 これによりI/Oが急激に増加するため、サーバの性能が劣化しました。 この新しい方式はチェックポイント時のディスク書き出しを分散させ、I/O使用のピークを抑えます。 (ユーザが要求したチェックポイントおよび停止時のチェックポイントではまだできる限り高速に書き出されます。)
ヒープオンリータプル(HOT)は、ほとんどのUPDATE
とDELETE
における領域の再利用を促進します。(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)
自動バキュームがデフォルトで有効になりました。(Alvaro)
デフォルトに変更することを正当化するために、自動バキュームを有効にさせた場合の欠点を除去するための変更が多くなされました。 この他の自動バキュームに関するパラメータも複数変更されました。
複数の自動バキュームプロセスの同時実行をサポートします。(Alvaro, Itagaki Takahiro)
これにより複数のバキュームを同時に実行できるようになります。 これは、大規模テーブルのバキュームにより、より小さなテーブルのバキュームが遅延されることを防ぎます。
テーブル定義の変更時または統計情報の更新時における、キャッシュされた問い合わせ計画を自動的に再作成します。(Tom)
これまで一時テーブルを参照するPL/pgSQL関数はEXECUTE
が使用されていない限り、その関数を呼び出し中に一時テーブルが削除、再作成された場合、失敗しました。
この改良により、この問題および関連する多くの問題が解消されます。
一時テーブルおよび一時ファイル用のテーブル空間を制御するtemp_tablespaces
パラメータが追加されました。(Jaime Casanova, Albert Cervera, Bernd Helmle)
このパラメータは使用されるテーブル空間のリストを定義します。
これにより複数のテーブル空間をまたがったI/O負荷分散が可能です。
一時オブジェクトが作成される度にランダムなテーブル空間が選択されます。
一時ファイルはデータベース単位のpgsql_tmp/
ディレクトリに格納されず、テーブル空間単位のディレクトリに格納されるようになりました。
一時テーブル用のTOASTテーブルを特別なpg_toast_temp_
という名前のスキーマに格納します。(Tom)
nnn
これにより低レベルなコードでこれらのテーブルを一時的なものと認識できるようになります。 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」へ変更しました。 また、その時期も調整しました。
このメッセージは本当に接続を受け付ける準備が整った時にのみ現れるようになりました。
自動バキュームの活動ログ処理の設定をサポートするための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_level
とstats_row_level
パラメータを1つのtrack_counts
パラメータにまとめました。
これは、統計情報コレクタプロセスにすべてのメッセージを送信するかどうかを制御します。(Tom)
stats_command_string
パラメータの名前をtrack_activities
に変更しました。(Tom)
コミットされたトランザクションとアボートしたトランザクションが異なる影響を持つことを認識するために、有効タプルと無効タプルの統計的な数え方を修正しました。(Tom)
Windowsにおける認証用のセキュリティサービスプロバイダインタフェース(SSPI)をサポートします。(Magnus)
GSSAPI認証をサポートします。(Henry Hotz, Magnus)
GSSAPIは業界標準ですので、Kerberos認証そのものより好まれるはずです。
グローバルなSSL設定ファイルをサポートします。(Victor Wagner)
受け付けるSSL暗号を制御するためのssl_ciphers
パラメータを追加しました。(Victor Wagner)
Kerberosレルムパラメータkrb_realm
を追加しました。(Magnus)
トランザクションWAL記録に記録されるタイムスタンプがtime_tからTimestampTz表現に変わりました。(Tom)
これは0.5秒という精度をWALに提供します。 これはポイントインタイムリカバリで役に立ちます。
ウォームスタンバイサーバで必要とするWALディスク容量を減少させました。 (Simon)
この変更によりウォームスタンバイサーバは、不要になったWALファイルの自動削除を行いつつ、もっとも初期かつまだ必要なWALファイルの名前をリカバリスクリプトに渡すことができます。
これはrecovery.conf
の restore_command
において%r
を使用することで行われます。
新しい論理型の設定パラメータarchive_mode
はアーカイブ処理を制御します。(Simon)
これまでは、archive_command
を空文字列に設定することでアーカイブ処理を無効にしました。
今回からはarchive_command
と独立したarchive_mode
がアーカイブ処理の有効無効を切替えます。
これは一時的にアーカイブ処理を停止する際に役に立ちます。
全文検索がコアデータベースシステムに統合されました。(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関数を呼び出すことで、すべてのデータ型と標準文字列型(TEXT
、VARCHAR
、CHAR
)との間の双方向のキャストをサポートする汎用機構を作成しました。(Tom)
これまでは、こうしたキャストはこの目的に特化した関数を持つ型でのみ利用可能でした。 こうした新しいキャストは文字列へキャストする場合は代入のみ、逆は明示的のみです。 このため予期しない動作を行わないはずです。
すべての入力がドメイン型の時、UNION
とそれに関連する式がドメイン型を返すことができます。
これまでは、出力はドメインの基本型になるものとみなされていました。
2つの異なるデータ型を使用する時限定されたハッシュ処理が可能です。(Tom)
これにより、データ型を跨った比較を行う状況においてデータ型のハッシュ関数が互換性がある場合、ハッシュ結合、ハッシュインデックス、ハッシュ化副計画、ハッシュ集約を使用することができます。
現在、データ型を跨るハッシュ処理のサポートは、smallint
/integer
/bigint
に対するもの、およびfloat4
/float8
に対するものが存在します。
WHERE
句内に同じ変数があることを検知する、オプティマイザのロジックを改良しました。(Tom)
これにより、マージ結合が降順ソート順で動作するようになります。 また、冗長なソート列の認識も改良されました。
ほとんどのテーブルが制約による除外を行う大規模な継承構造の計画を作成する性能が向上しました。(Tom)
複合型の配列。(David Fetter, Andrew, Tom)
明示的に宣言された複合型の配列の他、システムカタログ、シーケンス、TOASTテーブルの行型を除く、通常のテーブルやビューの行型の配列もサポートされます。
サーバ設定パラメータを関数単位で設定できるようになりました。(Tom)
例えば関数は、実行時に異なるsearch_path
が存在する場合の誤動作を防ぐために、独自のsearch_path
を設定することができます。
SECURITY DEFINER関数はセキュリティの抜け穴を防ぐためにsearch_path
を設定すべきです。
CREATE/ALTER FUNCTION
がCOST
および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)
のような修飾子を取ることができます。
以前は組み込み型のみが修飾子を持つことができました。
スーパーユーザ以外のデータベース所有者が、デフォルトで所有するデータベースに信頼できる手続き言語を追加できるようになりました。(Jeremy Drake)
これはかなり安全ですが、一部の管理者はこの権限を取り上げたいと考えるかもしれません。
これはpg_pltemplate
.tmpldbacreate
で制御されます。
セッションの現在のパラメータ設定を今後のセッションにおけるデフォルトとして使用できます。(Tom)
これはCREATE/ALTER FUNCTION
、ALTER DATABASE
、ALTER ROLE
でSET ... FROM CURRENT
を付けることで行われます。
新しいコマンドDISCARD ALL
、DISCARD PLANS
、DISCARD TEMPORARY
、CLOSE ALL
、DEALLOCATE ALL
を実装しました。(Marko Kreen, Neil)
これらのコマンドは単にデータベースセッションをその初期状態に再設定します。 特に接続プールソフトウェアで有用です。
CLUSTER
をMVCCセーフにしました。(Heikki Linnakangas)
これまではCLUSTER
は、不要と確定したすべてのタプルを、たとえMVCCの可視性規則の下でそのタプルを参照することができるはずのトランザクションが他にあったとしても破棄しました。
CLUSTER
に新しい構文、CLUSTER
を追加しました。(Holger Schurig)
table
USING index
古いCLUSTER
構文もまだサポートされますが、新しい構文の方が論理的であるとみなされています。
複雑な計画をより正確に表示できるようにEXPLAIN
を修正しました。(Tom)
副計画出力への参照が、複雑な場合?column
を使わずに、常に正しく表示されるようになりました。
N
?
ユーザが削除された時に報告される情報量を制限しました。(Alvaro)
これまでは、多くのオブジェクトを所有するユーザを削除した(または削除しようとした)時、そのオブジェクトすべてを列挙する、多くのNOTICE
またはERROR
メッセージが生成されました。
これは一部のクライアントアプリケーションで問題になりました。
メッセージ長は制限されるようになりましたが、サーバログにはまだすべてのリストが送信されます。
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
とNAN
(Not A Number)を扱うことができるようにfloat4
/float8
を修正しました。(Bruce)
以前のコードではInfinity
とオーバーフロー条件の区別に一貫性がありませんでした。
boolean
値の入力の際、前後の空白文字が許されます。(Neil)
区切り文字として数字と小文字を使用することをCOPY
は防止するようになりました。(Tom)
新しい正規表現関数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)
これは各種レプリケーションソリューションで有用です。
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)
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)
これはまったく不愉快な事象を引き起こしました。
\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)
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)
initdbで、pg_xlog
ディレクトリの場所を指定できるようになりました。(Euler Taveira de Oliveira)
サポートされるオペレーティングシステムでは、pg_regress内でサーバコアファイルの生成が有効になりました。(Andrew)
pg_ctlに-t
(時間切れ)パラメータを追加しました。(Bruce)
これは、サーバ起動時または停止時にpg_ctlが待機する時間を制御します。 これまでの待機時間は固定で60秒でした。
サーバコアダンプの生成を制御するためにpg_ctlのオプションを追加しました。(Andrew)
Control-Cでclusterdb、reindexdb、vacuumdbをキャンセルできるようにしました。(Itagaki Takahiro, Magnus)
createdb、createuser、dropdb、dropuserでコマンドタグの出力を抑制します。(Peter)
--quiet
オプションは無視され、8.4で削除される予定です。
全データベースを実行している場合の進行メッセージは、実際のエラーではありませんので、標準エラー出力ではなく標準出力に出力されるようになりました。
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)
ユーザが与えたパスワードが実際に有効だったかどうかの確認が重要となる一部のセキュリティコンテキストで、これは役に立ちます。
V3フロントエンド/バックエンドプロトコルを使用します。(Michael)
これは、サーバサイドの準備済み文のサポートを追加します。
Windowsでpthreadではなくネイティブのスレッドを使用します。(Magnus)
ecpglibのスレッド安全性を向上しました。(Itagaki Takahiro)
ecpgライブラリが必要なAPIシンボルのみをエクスポートするようにしました。(Michael)
Microsoft Visual C++を使用したPostgreSQL配布物全体のコンパイルを可能にしました。(Magnus他)
これによりWindowsを基に開発する開発者が慣れた開発ツール、デバッグツールを使用できるようになりました。 また、Visual C++で作成されたWindows実行形式ファイルは、他のツールセットで作成されたファイルより優れた安定性と性能を持ちます。 クライアントのみを構築するVisual C++のスクリプトは削除されました。
多くの子プロセスを持つ時のpostmasterのメモリ使用量を劇的に減少させました。(Magnus)
リグレッションテストが管理者ユーザで起動できるようになりました。(Magnus)
ネイティブな共有メモリの実装を追加しました。(Magnus)
SPIにカーソル関連の機能を追加しました。(Pavel Stehule)
カーソル関連の計画作成オプションにアクセスすることができます。
また、FETCH
/MOVE
処理を追加しました。
SPI_execute
経由でカーソルコマンドを実行することができます。 (Tom)
SPI_ERROR_CURSOR
はまだ存在しますが、何も返しません。
SPI計画ポインタはvoid *
ではなくSPIPlanPtr
として宣言されます。(Tom)
これはアプリケーションコードを壊しませんが、単純なプログラムミスを見付けやすくするために変更することを勧めます。
コードプロファイリング(gccでのみ動作)を有効にするためにconfigureのオプションに--enable-profiling
を追加しました。(Korry DouglasとNikhil Sontakke)
オペレーティングシステムの時間帯データベースを使用するためにconfigureのオプションに--with-system-tzdata
を追加しました。(Peter)
pg_configプログラムがPATH
の先頭にないPostgreSQLインストレーションに対して拡張を構築できるようにPGXSを修正しました。(Tom)
SGML文書の構築時のgmake draft
をサポートします。(Bruce)
draft
を使わない場合、インデックス更新を確実にするために必要ならば、文書の構築が2回行われます。
サードパーティにより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)
"PostgreSQL"の別名として受け入れられるものとして"Postgres"が文書化されました。(Peter)
データベースサーバが停止している場合のサーバなりすまし防止に関する文書を追加しました。(Bruce)
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_int
、contrib/dict_xsyn
、contrib/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サポートがこのモジュールに取って代わりました。