(2012/9/10リリース)に関する技術情報をお届けします。リリースノートをもとに弊社で解説を加えたものです。本メジャーバージョンアップの主な機能追加と性能改善は以下のとおりです。マルチCPUコアのマシンにおいて同時実行性能が大幅に改善しました。プリペアドステートメントでパラメータに応じたプランが生成できるようになりました。インデックススキャンを伴う入れ子ループのプランについて、プランナが改良されました。スタンバイからベースバックアップが可能となりました。コマンドが追加されました。インデックスアクセスメソッドが追加されました。範囲データ型、JSONデータ型が追加されました。ビューにセキュリティバリアオプションが導入されました。URI形式がサポートされました。上述の項目を含めて、以下のセクションで変更点をより詳しく説明します。バージョン9.2には、以前のリリースとの互換性に影響を与える変更がいくつか含まれます。以下の非互換性に注意してください。spclocationカラムが削除されました。以下にシンボリックリンクがあるため、重複するデータ項目でした。本修正によりサーバが停止してる間にテーブルスペースディレクトリの移動が可能になります。関数が追加されました。新たなカラムに移動しました。most_common_valsカラム、most_common_freqsカラムに在ったデータは、most_common_elemsカラム、most_common_elem_freqsカラムから参照できます。「=>」演算子が廃止されました。関数を使う必要があります。警告メッセージが吐かれていました。関数が文字列中の特別な文字を確実にエスケープするようになりました。出力されることがありえました。返すようになりました。DROP操作が行なわれている直後に実行して、これら関数を呼び出すクエリがエラーを返すことを防ぎます。夜中(0時)からではなく、ローカルの夜中からを基準とするようになりました。依存した計算は矛盾していました。型にキャストすることで可能です。バージョンとそれ以前とで異なることとなります。付いた時間文字列を正しく解釈します。昨日の真夜中(0時)の時刻を返していました。4桁未満の年やマスクが与えられた時に一貫性が欠けていました。バージョンとそれ以前とで異なることとなります。ドメインではない型に実行できなくなりました。Eisentraut)以前は非ドメイン型に対する所有者とスキーマの変更が可能になっていました。手続き型言語の名前が自動的に小文字変換されなくなりました。Haas)クオートされていない言語識別子は、まだ小文字化されますが、クオートされた文字列は強制的な小文字化を行ないません。記述しなければならないか、あるいはクオートを省略するのが良いです。外部キー制約定義に伴って作成させるトリガーの名前の付け方が変更されました。Lane)この変更により、自己参照外部キー制約における正しいトリガ発火順序が、特異なケースでも担保されます。メタコマンド引数におけるバッククオート、変数展開、クオートされた部分文字列の振舞が一貫して提供されるようになりました。Lane)以前まで、これらの使用は、空白文字列で分離された時だけ正しく展開されました。テーブル名やインデックス名を、ダブルクオートされたものとして扱わなくなりました。Momjian)ダブルクオートされた振舞を実現するには、ユーザがコマンド引数でダブルクオートを指定する必要があります。実行時の設定プロンプトがなくなりました。色々なユーザ設定に関連したプロンプトを出しました。指定すると以前の振る舞いをします。指定されない限り、ユーザ名プロンプトを出さなくなりました。ファイルの配置を指定する設定パラメータが追加されました。ファイルの配置を変更することができます。ファイルはデフォルトの名前を持ちません。これらを指定した場合、そのファイルは存在しなければなりません。設定パラメータが廃止されました。行なうことができます。設定パラメータが廃止されました。senderプロセスが休止をやめて動作を再開すべきケースを検知できるようになったため、固定の休止時間を指定する必要がなくなりました。設定パラメータが廃止されました。Lane)もともとこの設定によって提供される検査は疑わしいものでした。任意の設定に任意のクラス名をプレフィックス指定することができます。カラムが「pid」に名前変更されました。Hagander)その他のシステムテーブルと揃えるための変更となります。state_changeカラムが追加されました。変った時刻が記録されます。カラムに状態情報も表示していました。current_queryカラムが「query」に名前変更されました。float8型カラムでミリ秒単位になりました。Lane)以下のビューのカラムが該当します。カラムがミリ秒単位になりました。変更点サーバ性能改善ヒープアクセス無しにインデックスのみからデータを取得できるようになりました。Lane)ヒープとはテーブルのデータ本体が格納されている領域のことです。scan」と呼ばれます。プランタイプが使われます。VACUUM時点以降に変更されたデータが無い箇所です。したがって、本機能が効果的なのは、書き込みの少ないテーブルといえます。本機能の実現のためビジビリティマップがクラッシュセーフになりました。SP-GiST(空間分割GiST)インデックスアクセスメソッドが追加されました。ように柔軟ですが、不均衡に分割された検索構造をサポートします。高負荷時にグループコミットが効果的に機能するようになりました。Linnakangas)これまで、同時多数のコミットは書き込み処理で内部ロック競合を招き効率的ではありませんでした。競合しないロックは、新しいファストパス(fast-path)ロック機構を使って管理されるようになりました。Haas)バーチャルトランザクションIDを生成する際のロックの余計な負荷が軽減されました。Haas)シリアライザブル分離レベルロックの余計な負荷が軽減されました。スピンロック性能が向上しました。Lane)共有無効キャッシュメッセージの余計な負荷が軽減されました。Haas)性能向上のため、PGPROC共有メモリ配列の頻繁にアクセスされる要素を分割しました。性能が改善されました。GiSTインデックスの性能が改善されました。Korotkov)GiSTインデックスの作成時間が改善されました。Linnakangas)一時テーブルとUNLOGGEDテーブルについてヒントビットがすぐに設定できるようになりました。Haas)ソートが、SQL呼び出しでない比較関数によるインライン化で、より高速に実行できるようになりました。Lane)MVCCスナップショット取得を減らしました。基づくようになりました。Lane)テーブルまたはデータベース削除に伴うバッファスキャンの性能が改善されました。fsync要求キューの性能が改善ざれました。Lane)Windowsで子プロセスに安全なファイルディスクリプタ数を渡すようになりました。セッションでより多くのファイルを開いて使えます。使われるようになりました。Riggs)以前は、バックグラウンドライタープロセスが、ダーティページの書き込みとチェックポイントの両方を行なっていました。これらの処理を二つのプロセスに分離させることで、それぞれの目標をより予測通りに完了させることができます。早く起こすことで、非同期コミット処理が改善されました。ディスクへフラッシュさせるきっかけになっていました。書き込みのきっかけになります。眠るようになりました。Lane)これらの変更により、何も行なうことがない時に、プロセスが起きる頻度を減らし、待機サーバの消費電力を劇的に減らします。プランナプランナがプリペアドステートメントに対してパラメータ値に合わせたカスタムプランを生成できるようになりました。Lane)これまでプリペアドステートメントは全てのパラメータ値に対して常に単一の汎用プランが使われました。このことで定数を直接記載した非プリペアドステートメントのプランより劣ることがよくありました。カスタムプランに効果がない場合が繰り返されたときには、汎用プランが使われるようになります。本修正はプリペアドステートメント利用の性能ペナルティを取り除きます。PL/pgSQL内のダイナミックステートメントを除くSQL実行もこの恩恵をうけます。以下のように一つのプリペアドステートメントに対して、パラメータによってプランタイプが変化します。10::bigint)プランナで、内側にインデックススキャンを使う入れ子ループの使い方が改善されました。Lane)新たに導入されたパラメータ化パス機構では、内側のインデックススキャンで一段(あるいは多段)上位の結合におけるリレーションの値を使うことができます。このことは、外部結合など、意味論的に許される結合順序が制限される場合に性能を大きく改善できます。以下にプラン差異の例を示します。10万行のテーブルです。値に基づく条件フィルターが適用されています。Lane)ラッパーは外部テーブルに対する複数のアクセスパスを提供できるようになり、より柔軟な結合プランの生成が可能となりました。テーブル以外のリレーションに対する自己矛盾した制約を認識するようになりました。あるときに限った実装となります。比較でインデックススキャンやインデックスオンリースキャンが選択できるようになりました。boolean型カラムにも適用されるようになりました。min/max関数は用意されていませんが、bool_and関数、bool_or関数でインデックスが使われるようになります。SELECT文のターゲットリストに複数行を返す関数が在る場合、推定行数を設定するようになりました。Lane)これまでは常に1行しか返らない扱いとなっていました。row)プランナが重複したカラムをもつインデックスをより確実に扱うようになりました。Lane)配列の要素ごとの統計情報を集めるようになりました。演算子(包含と重なり)の選択率予測を改善します。外部テーブルに対する統計情報を収集できるようになりました。Fujita)部分インデックスを使った場合のコスト推定が改善されました。Lane)サブクエリから参照されているカラムについて、プランナの統計情報利用が改善されました。使ったサブクエリについて統計予測が改善されました。指定した際に、管理者ユーザが自動的に含まれる振る舞いをしなくなりました。Dunstan)これまでは管理者ユーザは暗黙的にすべてのロールのメンバーとして扱われていました。接続できてしまいました。あれば、以下のようなエラーとなります。これは非互換の仕様変更となります。字句解析においてより一貫性のある振る舞いに修正されました。ファイルをエラー扱いするようになりました。Lane)以下のようなログが出て、PostgreSQL起動にも失敗するようになります。設定のままになります。reloaded管理者ユーザ権限はレプリケーション権限を包含するものとなりました。Misch)モニタリングバックエンドクラッシュの際に現在のクエリのログ書き出しを試みます。動作についてより詳しくログを書き出すようになります。設定によって書かれるログが以下のようになります。secWAL適用で失敗したらすぐに報告するようになりました。Masao)これまでは、サーバがマスターモードになるときに一度だけ失敗が報告されるというケースがありました。関数が追加されました。Oliveira)Windowsイベントログのアプリケーション名が設定できるようになりました。Hagander)複数のPostgreSQLインスタンスのログを区別する用途で利用できます。event_source設定で指定します。DEBUG1レベルに変更されました。Hagander)実行時統計情報ビューpg_stat_databaseシステムビューで一時ファイルのサイズと件数が追跡できるようになりました。pg_stat_databaseシステムビューに追加されました。Hagander)デッドロック発生回数が記録されます。確認できるようになりました。設定されていても、存在しないスキーマは暗黙的に無視されるようになりました。値をクラスターごとでなく、セッションごとに設定できるようになりました。LOCAL文による指定が可能となり、デッドロックの可能性のあるトランザクションだけ短いタイムアウトを指定するといった使い方が可能となります。