Release date: 2016-09-29
PostgreSQL9.6の主な強化点には以下のものがあります。
シーケンシャルスキャン、結合、集約の並列実行
バキューム凍結処理で不要なページスキャンを回避しました
同期レプリケーションで信頼性向上のための複数スタンバイサーバが可能になりました
全文検索でフレーズ(隣接した複数単語)を検索できるようになりました
postgres_fdw
がリモートでの結合、ソート、UPDATE
、DELETE
に対応しました
特にマルチCPU
ソケットサーバでのスケーラビリティの領域における、相当な性能改善をしました
上記の項目について以下でより詳細に説明します。
以前のリリースからデータを移行したい時は、どのリリースについても、 pg_dumpallを利用したダンプとリストア、 あるいはpg_upgradeの利用が必要です。
バージョン9.6には、以前のバージョンとの互換性に影響する多数の変更点が含まれています。 以下の非互換性に注意してください。
pg_stat_activity
ビューの、プロセスが何を待機しているかの情報を改善しました。
(Amit Kapila, Ildus Kurbangaliev)
歴史的には重量ロックを待機している場合だけプロセスは待機中と示されていました。
これからは軽量ロックとバッファピンの待機もpg_stat_activity
で示されます。
また、待機しているロックのタイプも見えるようになります。
これらの変更はwaiting
列をwait_event_type
とwait_event
で置き換えます。
to_char()
で時間関連のフィールドにおいて(必要ならば)マイナス符号をフィールド幅の一部としてカウントしません。
(Bruce Momjian)
例えばto_char('-4 years'::interval, 'YY')
は-4
でなく-04
を返すようになります。
無限値の入力に対してextract()
が、より合理的に動作するようにしました。
(Vitaly Burovoy)
歴史的にはextract()
関数は与えられたフィールド名が何であっても、無限大のタイムスタンプが与えられたなら単に0を返していました。
これを、要求フィールドが単調増加するもの(例:year
、epoch
)なら適切にinfinity
または-infinity
を返し、そうでないもの(例:day
、hour
)ならNULL
を返すようにしました。
また、誤ったフィールド名には期待されるエラーを投げます。
PL/pgSQLのRAISE
コマンドで出力されるメッセージにてCONTEXT
の最も内側の行を抑制する「機能」を取り除きました。
(Pavel Stehule)
この古くからの後方互換性のための作り込みは、もはや役に立たなくなっていると認められました。
デフォルトのテキスト検索パーサをemail
およびhost
トークンが数字から始まるのを許すように修正しました。
(Artur Zakirov)
ほとんどの場合、これはテキスト解析に僅かな違いしかもたらしません。
しかし、このようなアドレスが頻繁に生じるデータを持っているなら、テキスト検索でこの形のアドレスを適切に見つけられるようにするために、従属するtsvector
列とインデックスを再構築するだけの価値があるでしょう。
contrib/unaccent
の標準unaccent.rules
ファイルをユニコードむけに知られている全ての発音区別符号を扱うように、また、合字を正しく展開するように拡張しました。
(Thomas Munro, Léonard Benedetti)
従来バージョンでは一部の一般的でない発音区別符号を伴う文字を変換するのを怠っていました。
また、これからは合字は別々の文字に展開されます。
このルールファイルを使うインストレーションはtsvector
列とその結果に依存するインデックスを再構築するのがよいでしょう。
CREATE ROLE
および同種のコマンド群から、長く非推奨とされてきたCREATEUSER
/NOCREATEUSER
オプションを取り除きました。
(Tom Lane)
古い後方互換性を理由として、CREATEUSER
は実際のところSUPERUSER
を意味しました。
このことは常にこれはCREATEROLE
の意味だろうと(合理的に)予想するユーザの混乱の元となっていました。
現時点で10年にわたって非推奨でしたので、除去することでこの問題を解決します。
pg_
で始まるロール名を予約済みとして扱うようにしました。
(Stephen Frost)
これからはこのようなロール名のユーザ作成は禁止されます。 これによりinitdbで作られた組み込みロールとの競合を防ぎます。
information_schema
.routines
ビュー内の列名をresult_cast_character_set_name
からresult_cast_char_set_name
に変更しました。
(Clément Prévost)
SQL:2011標準には長い方の名前が記載されていますが、隣の列名では他のinformation_schema
ビューと同様に短い方の書き方を使っていることから、これは誤りと見られます。
psqlの-c
オプションはもはや--no-psqlrc
の意味を含まなくなりました。
(Pavel Stehule, Catalin Iacob)
古い動作を得るには--no-psqlrc
(または短縮形の-X
)を明示的に書いてください。
このように修正されたスクリプトは古いバージョンのpsqlでも引き続き動作するでしょう。
pg_restoreの-t
オプションを普通のテーブルだけでなく全てのタイプのリレーションに対応するように改善しました。
(Craig Ringer)
pg_controldataおよび関連する箇所でNextXID
の表示形式を変更しました。
(Joe Conway, Bruce Momjian)
number
:
number
形式でエポックとトランザクションIDの値を表示します。
これまでのnumber
/
number
形式は、LSNに使われる形式と紛らわしく似ていました。
拡張の関数を適切なものについてパラレルセーフと印付けされるように改定しました。 (Andreas Karlsson)
多くの標準拡張はそれらの関数がパラレルクエリーのワーカプロセスで実行できるように改定されました。
これらの変更は、(クラスタの各データベースの)各拡張にALTER EXTENSION UPDATE
を適用しない限り、前バージョンからpg_upgradeされたデータベースには効力がありません。
以下にPostgreSQL 9.6と前のメジャーリリースとの詳細な変更点を記載します。
並列問い合わせ。 (Robert Haas, Amit Kapila, David Rowley, many others)
9.6でPostgreSQLは大きな問い合わせに対する並列実行の最初のサポートを導入しました。 厳密に駆動テーブルをシーケンシャルスキャンで処理する参照問い合わせの場合だけ、並列化できます。 ハッシュ結合とネステッドループも、また(サポートされている集約について)集約処理も同様に並列実行できます。 やるべきことは沢山残っていますが、これはすでに役立つ機能セットです。
並列問い合わせの実行は(未だ)デフォルトでは有効ではありません。 有効にするには、新たな設定パラメータmax_parallel_workers_per_gatherを0より大きい値に設定します。 その他の新たな設定パラメータforce_parallel_mode、parallel_setup_cost、parallel_tuple_cost、min_parallel_relation_sizeを通してさらなる並列処理の制御を行うことができます。
関数のパラレル安全状態を印付けするための基盤を用意しました。 (Robert Haas, Amit Kapila)
GINインデックス作成で、1GBより大きいmaintenance_work_mem設定の効果的な活用ができるようにしました。 (Robert Abraham, Teodor Sigaev)
GINインデックスのペンディングリストから削除されたページを空き領域マップに即座に追加するようにしました。 (Jeff Janes, Teodor Sigaev)
これはテーブルのバキューム頻度が低いときの膨張を減らします。
GINインデックスのペンディングリストのクリーンアップを手動で実行できるようにgin_clean_pending_list()
関数を追加しました。
(Jeff Janes)
以前は、このクリーンアップは親テーブルのバキュームやアナライズの副次効果としてのみ生じました。
GiSTインデックスにおける dead(削除済み)インデックスタプルの扱いを改善しました。 (Anastasia Lubennikova)
deadインデックスタプルは、あるインデックスキャンが対応するヒープタプルがdeadであると気づくとき、そのように印付けされるようになります。 タプルを挿入するとき、ページ上に空間を作るために必要ならdeadとマークされたタプルは削除されます。
box
型むけのSP-GiST演算子クラスを追加しました。
(Alexander Lebedev)
外部ソート方式を行うときに置換選択ソートでなくクイックソートを使うことでソートの性能を改善しました。 (Peter Geoghegan)
この新しい方法では典型的なキャッシュサイズとデータ量に対してCPUキャッシュをより良く使用します。 必要に応じて、この動作は新たな設定パラメータreplacement_sort_tuplesを通して調整されます。
同じ文字列が複数回現れる場合のテキストソートを高速化しました。 (Peter Geoghegan)
「短縮」キーを使うことで、uuid
、bytea
、char(n)
のソートを高速化しました。
(Peter Geoghegan)
短縮キーのサポートでは非デフォルト演算子クラスtext_pattern_ops
、varchar_pattern_ops
、bpchar_pattern_ops
も追加されました。
順序集合集約を処理して短縮キーをうまく利用できるようになりました。
ソートのときにTIDを64bit整数として扱うことでCREATE INDEX CONCURRENTLY
を高速化しました。
(Peter Geoghegan)
ProcArrayLock
の競合を減らしました。
(Amit Kapila, Robert Haas)
バッファ内容のロックをバッファデスクリプタに移すことで性能を改善しました。 (Andres Freund, Simon Riggs)
スケーラビリティ改善のため、共有バッファヘッダのスピンロックを原子的操作に置き換えました。
LWLock
の待ちキューを保護するため、スピンロックでなく原子的操作を使います。
(Andres Freund)
マルチCPUソケットのサーバ上で競合を減らすため共有ハッシュテーブルのフリーリストを分割しました。 (Aleksander Alekseev)
Btreeインデックスのバキューム操作の再生中のスタンバイサーバ上のインターロックを減らしました。 (Simon Riggs)
この変更はこのような操作の再生で時々発生するかなりのレプリケーション遅延を回避します。
ANALYZE
の多数のNULLを持つ列の推定を改善しました。
(Tomas Vondra, Alex Shulgin)
これまでANALYZE
は多数NULL
を持つ列では、非NULL
の個別値数を過小評価する傾向があり、また、頻出値の計算でも不正確でした。
プランナの問い合わせ結果での個別値数の推定を改善しました。 (Tomas Vondra)
結合述語における選択度の推測に外部キー関係を使用するようにしました。 (Tomas Vondra, David Rowley)
もしテーブルt
が、(a,b) REFERENCES r (x,y)
という外部キー制約を持つなら、t.a = r.x AND t.b = r.y
などのWHERE
条件はt
の各行に対して1行より多いr
の行を選択することはありえません。
プランナは以前はこれらAND
条件を独立しているとみなし、結果として、しばしば選択度を大幅に誤って推定していました。
これからは、WHERE
条件を当てはまる外部キー制約と比較し、より良い推定を出します。
VACUUM
凍結済みタプルだけを含むページの再バキュームを回避しました。 (Masahiko Sawada, Robert Haas, Andres Freund)
以前は、周回防止用のバキュームは、たとえ何もすることがないページであっても、テーブルのすべてのページを巡回しなければなりませんでした。 これからは、凍結済みタプルのみを含むページはテーブルの可視性マップで識別され、たとえトランザクション周回予防を行っているときでもスキップすることができます。 これは大部分のデータが変化しない大きいテーブルを保守するコストを大幅に削減するでしょう。
必要であれば、新たなDISABLE_PAGE_SKIPPING
オプションを使ってバキュームで全ての凍結済みページを処理することを強制できます。
通常これは全く必要ありませんが、可視性マップの破損を復旧するのに役立つかもしれません。
VACUUM
中の無駄なヒープ切り捨ての試行を回避しました。
(Jeff Janes, Tom Lane)
本変更は有効な切り捨てが不可能である場合の排他テーブルロックの取得を回避します。 主な利点はスタンバイサーバ上での不要な問い合わせキャンセルを回避できることです。
古いMVCCスナップショットを設定可能なタイムアウトの後に無効にできるようにしました。 (Kevin Grittner)
通常、削除されたタプルは、それを「見る」かもしれない最後のトランザクションがいなくなるまでは、バキュームによる物理的な除去がされません。 長時間オープンしたままのトランザクションは、このため、空間が再利用できないので相当なテーブル膨張を引き起こす可能性があります。 この機能は、MVCCスナップショットをどれだけの間、有効と保証するかを指定する新たな設定パラメータold_snapshot_thresholdを通して、時間に基づく制限を設定可能にします。 上限時間後、デッドタプルは除去候補になります。 古いスナップショットを使うトランザクションは潜在的にこのようなデータが含まれているかもしれないページを読もうとしたならエラーを受け取るはずです。
GROUP BY
の他の列に機能的に従属している列を無視するようにしました。
(David Rowley)
GROUP BY
句が、同テーブルの他の列と共に遅延されていない主キーのすべての列を含むなら、主キー以外の列は冗長でグルーピングから外すことができます。
これは多くのよくある場合に計算を節約します。
WHERE
句がインデックスされていない列を参照している部分インデックスで、インデックスオンリースキャンを利用可能にしました。
(Tomas Vondra, Kyotaro Horiguchi)
例えば、CREATE INDEX tidx_partial ON t(b) WHERE a > 0
で定義されたインデックスを、WHERE a > 0
と指定する問い合わせで、インデックスオンリースキャンに使うことができるようになりました。
これまでは、a
がインデックス列にあらわれないために、これは許されませんでした。
チェックポイント書き込みをソートされた順で行うようにしました。 (Fabien Coelho, Andres Freund)
これまでチェックポイントは、通常ランダムに近い、とにかく共有バッファにたまたま出てきた順にダーティページを書き出していました。 これは特に回転メディアで性能がよくありません。 本変更はチェックポイント駆動の書き込みがファイルとブロック番号の順で行われるように、また、テーブルスペース間で偏りが無いようにします。
可能なところでは、カーネルディスクバッファにダーティデータが蓄積されるのを防ぐため、設定可能な書き込み数の後にカーネルライトバックを起動するようにしました。 (Fabien Coelho, Andres Freund)
PostgreSQLはデータをカーネルのディスクキャッシュに書き、それはやがて物理ストレージにフラッシュされます。 多くのOSはこれを賢く管理せず、大量のダーティデータを一度にフラッシュすると判断するまで蓄積させておきます。これはフラッシュが終わるまでの間、新たなI/O要求に大きな遅延を引き起こします。 本変更は設定可能な間隔の後に明示的にデータフラッシュを要求することで、この問題を緩和しようとします。
Linuxにおいては、この用途にsync_file_range()
が使われ、この関数にほとんどマイナス面が無いため本機能はデフォルトで有効です。
このフラッシュする機能は、msync()
またはposix_fadvise()
があるなら他のプラットフォームでも使用可能ですが、これらのインタフェースには若干の望ましくない副作用がありるため、Linux以外のプラットフォームでは本機能はデフォルトでは無効です。
新たな設定パラメータbackend_flush_after, bgwriter_flush_after, checkpoint_flush_after, and wal_writer_flush_afterが本動作を制御します。
複数の集約が同じ引数と遷移関数を持っているなら、それらの間で計算を共有することで集約関数の性能を改善しました。 (David Rowley)
例えば、SELECT AVG(x), VARIANCE(x) FROM tab
は行ごとに二つの集約に対して対して単一の計算を用いることができます。
元トランザクションがコミット済みかを判断するのにpg_clog
ではなく現在トランザクションのスナップショットを調べることにより、最近に作られたタプルに対する可視性の検査を高速化しました。
(Jeff Janes, Tom Lane)
タプルのヒントビットが以前より早くセットされるようにしました。 (Andres Freund)
短命な準備されたトランザクションの性能を改善しました。 (Stas Kelvich, Simon Riggs, Pavan Deolasee)
二相コミットの情報はPREPARE TRANSACTION
の際にWALのみに書かれ、COMMIT PREPARED
の際には、それがすぐ後に生じたなら、WALから読み戻されるようになりました。
分離状態ファイルは、保留しているトランザクションが次のチェックポイントの時までコミットにもアボートにもならなかった場合のみ作られます。
メモリコンテキストの廃棄の性能を改善しました。 (Jan Wieck)
多数のオブジェクトを追跡するリソースオーナーの性能を改善しました。 (Aleksander Alekseev)
timestamp
、time
、およびdate
データ型の出力関数の速度を改善しました。
(David Rowley, Andres Freund)
AccessExclusive
ロックを取得する操作のリプレイ中の、ホットスタンバイ問い合わせの不要なキャンセルを回避しました。
(Jeff Janes)
リレーション拡張のロックに競合があるとき、リレーションを複数ブロック一度に拡張するようにしました。 (Dilip Kumar)
これは競合を減らすことでスケーラビリティを改善します。
よりよいスケーラビリティのためにclogバッファの数を増やしました。 (Amit Kapila, Andres Freund)
常に単純な変数むけのParamListInfo
エントリを有効な状態に留めておくことで、PL/pgSQLで式の評価を高速化しました。
(Tom Lane)
最近のWindowsバージョンで、SO_SNDBUF
設定をそのデフォルトよりも減らすことを回避しました。
(Chen Huajun)
Windowsにおいてupdate_process_titleをデフォルトで無効にしました。 (Takayuki Tsunakawa)
Windowsでは大部分の他プラットフォームよりもプロセスタイトルを更新するオーバーヘッドが大きく、また、大部分のWindowsユーザはプロセスタイトルを表示できるツールを持っていないことから、更新してもあまり役に立ちません。
VACUUM
操作の進捗報告を提供するpg_stat_progress_vacuum
システムビューを追加しました。
(Amit Langote, Robert Haas, Vinayak Pokale, Rahila Syed)
SQLにpg_control
のフィールドを見せるpg_control_system()
、pg_control_checkpoint()
、pg_control_recovery()
、および、pg_control_init()
関数を追加しました。
(Joe Conway, Michael Paquier)
pg_config
システムビューを追加しました。
(Joe Conway)
このビューはpg_configコマンドラインユーティリティから参照できるものと同様の情報、すなわち様々なPostgreSQLのコンパイル時の設定情報を見せます。
pg_replication_slots
システムビューにconfirmed_flush_lsn
列を追加しました。
(Marko Tiikkaja)
ホットスタンバイサーバのWALレシーバプロセスに関する情報を提供するpg_stat_wal_receiver
システムビューを追加しました。
(Michael Paquier)
どのセッションがどの他セッションをブロックしているかを確実に識別するpg_blocking_pids()
関数を追加しました。
(Tom Lane)
この関数は与えられたプロセスIDのセッションをブロックしている全てのセッションのプロセスIDの配列を返します。
歴史的にはユーザはpg_locks
ビューの自己結合を使ってこのような情報を取得するしていました。
しかしながら、いくらかの僅かな正確さに対してこのように実施するのことは不合理に面倒です。また、並列問い合わせの追加は、セッションの主プロセスでなくワーカ子プロセスによってロックが取得・待機されるかもしれないことから、この古い方法を完全に非実用的にしました。
現在のトランザクションログのフラッシュ位置を見せる関数pg_current_xlog_flush_location()
を追加しました。
(Tomas Vondra)
NOTIFY
がどのくらいいっぱいであるかを報告する関数pg_notification_queue_usage()
を追加しました。
(Brendan Jurd)
メモリコンテキスト統計のダンプの冗長さを制限しました。 (Tom Lane)
メモリ不足エラーの際にポストマスタのログに出力されるメモリ使用のダンプは、多数のメモリコンテキストがあるとき、ことによると巨大なレポートを生成するのでなく、統計を要約するようになります。 「grand total(総計)」要約行も追加されます。
PostgreSQLクライアント認証にBSD認証サービスを使用できるBSD認証方式を追加しました。 (Marisa Emerson)
BSD認証は今のところOpenBSDでのみ使用できます。
PAM認証を使うとき、クライアントIPアドレスやホスト名をPAM_RHOST
要素を通してPAMモジュールに供給するようにしました。
(Grzegorz Sampolski)
ポストマスタのログでパスワード認証失敗のより多くの類型について詳細を出力するようにしました。 (Tom Lane)
全ての普通に起きうるパスワード認証失敗の場合に、ログに詳細なDETAIL
フィールドが提供されます。
RADIUSパスワードを128文字の長さまでサポートしました。 (Marko Tiikkaja)
SSPI認証のときにNetBIOSかKerberosのレルム名とユーザ名を制御するSSPI認証の新たなパラメータcompat_realm
とupn_username
が追加されました。
(Christian Ullrich)
長すぎるアイドルイントランザクション状態のとき、セッションを自動的に終了できるようにしました。 (Vik Fearing)
この動作は新たな設定パラメータidle_in_transaction_session_timeoutで制御されます。 これは忘れられたトランザクションが長期にロックを保持したり、バキュームクリーンアップを阻害したりするのを防止するのに役立ちます。
checkpoint_timeoutの許容される最大値を24時間に引き上げました。 (Simon Riggs)
異なるテーブルスペースが各々異なるI/O特性を持つ場合に対応するため、effective_io_concurrency
をテーブルスペースごとに設定できるようにしました。
(Julien Rouhaud)
現在時刻をミリ秒付きのUnixエポック形式で出力するlog_line_prefixのオプション%n
を追加しました。
(Tomas Vondra, Jeff Davis)
syslogへログ出力するとき、メッセージ形式により多くの制御を提供するsyslog_sequence_numbersおよびsyslog_split_messages設定パラメータを追加しました。 (Peter Eisentraut)
wal_level設定パラメータの値であるarchive
とhot_standby
を一つの新たな値replica
に合併しました。
(Peter Eisentraut)
これら設定値を区別することはもはや役に立たず、また、これらを合併することはレプリケーションのセットアップの計画された将来の平易化への一歩です。
古い名前はまだ受け付けられますが、内部的にreplica
に変換されます。
サーバの起動、停止でsd_notify()
の呼び出しを可能にする設定オプション--with-systemd
を追加しました。
(Peter Eisentraut)
これは、systemd下のPostgreSQLの管理を大幅に簡単にするnotify
タイプのsystemdサービスユニットを利用できるようにします。
サーバのSSLキーファイルがroot
に所有されている場合には、グループ読み込みアクセスを持てるようにしました。
(Christoph Berg)
以前は、キーファイルはPostgreSQLサーバを実行するユーザに所有されるべきと主張していましたが、これは証明書を集中管理するように構成されている一部システム(Debianなど)で不便です。
それゆえ、キーファイルがroot
に所有されていてグループ参照アクセスを持っている場合を許容しました。
そのグループに信頼できないユーザが決して含まれないようにするのは、OS管理者の責任です。
ポストマスタがダウンしたならバックエンドを強制的に終了させるようにしました。 (Rajeev Rastogi, Robert Haas)
通常の状況下ではポストマスタは常に子プロセスより長く生き残るはずです。 もし何らか理由でポストマスタがダウンしたなら、バックエンドセッションをエラーと共に強制的に終了させます。 以前は、現存するバックエンドはクライアントの切断まで実行し続けましたが、危険で非効率的です。 これはまた、前の古いバックエンドが終了するまでは新たなポストマスタが起動しないようにします。 バックエンドはクライアントI/Oを待つときにポストマスタのダウンを検知するでしょうから、終了は即時ではありませんが、クライアント問い合わせの終了よりも遅くなることはないはずです。
直列化可能かを、制約違反エラーを報告する前に検査するようにしました。 (Thomas Munro)
シリアライザブルトランザクション隔離を使っているとき、同時トランザクションを原因とするいかなるエラーも直列化の失敗として表明するのが望ましく、それによりアプリケーションにリトライが成功するかもしれないという手がかりを与えます。 残念ながら、キー重複の失敗が同時挿入で引き起こされた場合には、これは確実には生じません。 本変更は、アプリケーションがトランザクションのより早くに明示的に競合するキーの存在をチェックした(そして見つからなかった)なら、このようなエラーが直列化のエラーとして報告されることを保証します。
たとえXIDをもたないトランザクションから発行されたときでも、無効化メッセージがWAL記録されることを保証しました。 (Andres Freund)
これはスタンバイサーバのトランザクションが新たなインデックスのような変化に気づくのに失敗するという一部の稀な場合について修正します。
複数プロセスがGINインデックスのペンディングリストを同時にクリーンアップしようとするのを防ぎます。
意図的に許容されていいましたが、これは結果としてバキュームが削除を要するインデックスエントリの見落しに帰着する可能性のある競合状態を引き起こします。
同期レプリケーションで1つだけでなく複数同時の同期スタンバイサーバに対応しました。 (Masahiko Sawada, Beena Emerson, Michael Paquier, Fujii Masao, Kyotaro Horiguchi)
完了したとみなす前にコミットを確認しなければいけないスタンバイサーバの数は、synchronous_standby_namesパラメータの一部で設定します。
設定パラメータsynchronous_commitに新たな設定remote_apply
を加えました。
(Thomas Munro)
このモードでは、マスタはスタンバイサーバでトランザクションがディスクに書かれるだけでなく適用済みになるまで待ちます。 このことは、それより前にマスタで認識されたすべてのコミットが、スタンバイサーバで開始したトランザクションから見えると期待できることを意味します。
レプリケーションスロットを作ったときにWALの確保を直ちに行うため、レプリケーションプロトコルに機能を追加し、対応するオプションをpg_create_physical_replication_slot()
に追加しました。
(Gurjeet Singh, Michael Paquier)
これはレプリケーションスロット作成でベースバックアップで必要とされる全てのWALを保証できるようにします。
pg_basebackupに--slot
オプションを追加しました。
(Peter Eisentraut)
これはpg_basebackupにWALストリーミング向けに定義されたレプリケーションスロットを使わせます。 ベースバックアップ完了後、同じスロットを通常のストリーミングレプリケーションに選ぶことでシームレスに新たなスタンバイサーバの起動が可能です。
非排他のバックアップのためにpg_start_backup()
とpg_stop_backup()
を拡張しました。
(Magnus Hagander)
タプルの集合を返す関数が単なるNULL
を返せるようにしました。
(Andrew Gierth, Tom Lane)
SELECT FROM function(...)
の文脈において、以前は複合値の集合を返す関数は単なるNULL
値を集合の一部として返すことを許していませんでした。
これからはこれが可能になり、要素が皆NULL
の行として解釈されます。
これは例えば複合値の配列をunnestするなどのまれなケースでのエラーを回避します。
複数のVALUES
行を伴うINSERT
のターゲット列リストにおける配列添え字とフィールド選択に完全に対応しました。
(Tom Lane)
これまで、このような場合は同じターゲット列が2回以上でてくるとき、例えばINSERT INTO tab (x[1], x[2]) VALUES (...)
などで、失敗していました。
適切なとき、SELECT
出力式の評価をORDER BY
ソート後まで後回しにするようにしました。
(Konstantin Knizhnik)
この変更は出力リスト内の揮発性あるいは高コストの関数がORDER BY
で示される順序で実行されること、また、LIMIT
句があるとき必要とされる回数以上に評価されないことを保証します。
これまで、並び替えがインデックススキャンやマージ結合前のソートで実行されるときには、これらの特性を持っていましたが、トップレベルのソートで実行されるときにはそうなっていませんでした。
処理したタプル数を記録するカウンタを64bitに拡張しました。 (Andreas Scherbaum)
この変更はSELECT
などのコマンドタグで40億件以上のタプルカウントを正しく報告できるようにします。
これはPL/pgSQLのGET DIAGNOSTICS ... ROW_COUNT
コマンドにも適用されます。
MULE_INTERNAL
エンコーディングを通した変換でエンコーディング変換をするのを回避しました。
(Tom Lane)
これまではキリル文字と中央ヨーロッパのシングルバイトのエンコーディングに対する多くの変換は、関連するMULE_INTERNAL
コーディング方式に変換して、それから目的のエンコーディングに変換することで実行されていました。
非効率であることと別にこれは、変換できない文字に遭遇したときにエラーメッセージが、ユーザに見えるエンコーディングではなくMULE_INTERNAL
との間で変換できないと混乱を招きやすい苦情を言うことを意味します。
テーブルが同じロールIDのもとでアクセスされる場合のみ、外部テーブルの結合をリモートで行うことを検討するようにしました。 (Shigeru Hanada, Ashutosh Bapat, Etsuro Fujita)
これまで外部結合プッシュダウン基盤はセキュリティの課題を完全に各外部データラッパに任せていました、これはFDWに意図せぬ微妙なセキュリティホールをあまりに容易に作らせてしまいます。 そこで、どのロールIDが各テーブルにアクセスするか決定することを本体コードの役割としました。 また、関わるすべてのリレーションについてロールが同じでない限り、結合プッシュダウンを試みないようにしました。
COPY
がINSERT
/UPDATE
/DELETE
... RETURNING
問い合わせの出力をコピーできるようにしました。
(Marko Tiikkaja)
これまでは、実現するのに中継するCTEを書く必要がありました。
ALTER
を導入しました。
(Abhijit Menon-Sen)
object
DEPENDS ON EXTENSION
本コマンドはデータベースオブジェクトに拡張に依存していると印付けできるようにします。
これにより、拡張が削除されたならオブジェクトは(CASCADE
は必要なしに)自動的に削除されます。
しかしながら、このオブジェクトは拡張の一部ではないので、pg_dumpでは別にダンプされます。
オブジェクトがすでに要求されたスキーマにあるときにはALTER
が、歴史的に大部分のオブジェクトタイプに対してそうであったようにエラーを投げるのではなく、何もしないようにしました。
(Marti Raudsepp)
object
SET SCHEMA
ALTER OPERATOR
に既存の演算子に関連付けられた選択度の関数を変更できるオプションを追加しました。
(Yury Zhuravlev)
ALTER TABLE ADD COLUMN
にIF NOT EXISTS
オプションを追加しました。
(Fabrízio de Royes Mello)
フィルファクタと自動バキューム関連のリレーションオプションを設定するとき、ALTER TABLE
が必要とするロック強度を減らしました。
(Fabrízio de Royes Mello, Simon Riggs)
拡張でインデックスアクセスメソッドを作ることを可能にする、CREATE ACCESS METHOD
を導入しました。
(Alexander Korotkov, Petr Jelínek)
CREATE EXTENSION
に、要求された拡張が依存するすべての拡張を自動的に作成するCASCADE
オプションを追加しました。
(Petr Jelínek)
元テーブルがOID
列を持つとき、CREATE TABLE ... LIKE
でそれを含めるようにしました。
(Bruce Momjian)
CHECK
制約がテーブル作成コマンドでNOT VALID
と宣言されている場合、自動的に有効と印付けするようにしました。
(Amit Langote, Amul Sul)
テーブルには行が存在しないので安全です。
これは以前からのFOREIGN KEY
制約の動作と一致します。
DROP OPERATOR
を削除された演算子とリンクしているpg_operator
.oprcom
とpg_operator
.oprnegate
をクリアするように修正しました。
(Roma Sokolov)
これまではこのようなリンクはそのまま残されて、削除した演算子のOID
が他の演算子に再利用されるという、あまりなさそうな事象で問題がでるかもしれません。
EXPLAIN
出力で同じサブプランを二度見せないようにしました。
(Tom Lane)
ある種の、典型的にはインデックス条件でSubPlanノードを伴う場合、EXPLAIN
は同じサブプランのデータを二回出力していました。
OID
列を除くシステム列へのインデックス作成を禁止しました。
(David Rowley)
このようなインデックスはサポートされているとみなされませんし、システムがタプルのシステム列フィールドをインデックス更新無しに変えるかもしれないため、高い可能性で誤動作するでしょう。 しかしながら、これまではこれが作られないように防ぐエラーチェックがありませんでした。
注意を要する関数へのアクセス管理に権限システムを使うようにしました。 (Stephen Frost)
これまでは、多くの安全に注意を要する関数は非スーパーユーザから呼び出されるとエラーを投げる固定実装のチェックを含んでいました。
これはやや退屈な仕事としてスーパーユーザロールを使うことを強制していました。
これからは固定実装のエラーチェックは無くなり、initdbにデフォルトのpublicのEXECUTE
権限を取り上げさせるようにしました。
このことで、必ずしも全てのスーパーユーザ権限を必要としない信頼されたロールに、これらの関数の使用を認めることをインストレーションは選択できます。
従来スーパーユーザ専用だった関数へのアクセスを与えるのに使える組み込みロールを作成しました。 (Stephen Frost)
いまのところそのようなロールはpg_signal_backend
だけですが、より多くが将来に追加される見通しです。
全文検索をフレーズ、すなわち特定順序あるいは指定された間隔で互いに隣接して現れる複数の語彙素、の検索に対応するように改善しました。 (Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov)
tsquery
入力で新たな演算子<->
と<
を使ってフレーズ検索問い合わせを指定できます。
前者は前後の語彙素が互いに隣接してその順に現れなければいけないことを意味します。後者は前後の語彙素がちょうどNN
>N
だけ離れていなければいけないことを意味します。
配列スライス指定子で範囲の片方あるいは両方を(例えばarray_col[3:]
と)省略できるようにしました。
(Yury Zhuravlev)
省略された範囲は対応する配列の添え字の上限または下限と受け取られます。 これは多くの一般的なユースケースでよりシンプルな指定を可能にします。
範囲外の日付やタイムスタンプについてより注意深くしました。 (Vitaly Burovoy)
この変更はtimestamp with time zone
の実装の限界に極めて近い値に対する予期せぬ範囲外エラーを防ぎます。
これまでは、「同じ」値がtimezone
設定によって、受け入れられたり、受け入れられなかったりしました。これは現在受け付けられている値のダンプ、リストアが失敗するかもしれないことを意味します。
これからは、値の限界はローカルタイムでなく、timezone
とは無関係にするため、同等のUTC時間に従って制限されます。
また、PostgreSQLは、date
+
integer
などの新たな日付やタイムスタンプ値を計算する処理でも、より注意深くオーバーフローを検出するようになりました。
幾何データ型について、infinity
とNaN
の複合値が入出力の際に確実に一貫した扱いをされるようにしました。
(Tom Lane)
これからはこのような値は常にシンプルなfloat8
列と同様に出力し、入力で同様に受け入れられます。
これまではプラットフォームに依存した動作をしていました。
現代的なHunspellファイルを扱うように、また、より多くの言語に対応するようにispell
辞書タイプを更新しました。
(Artur Zakirov)
正規表現で後方検索制約を実装しました。 (Tom Lane)
後方検索制約はテキストを消費せず既存の先行検索制約と似ていますが、 文字列の現在位置から始まるのでなく、現在位置で終わるマッチが在ること(あるいは無いこと)をチェックします。 同様の機能は既存の他の多くの正規表現エンジンに存在します。
正規表現で、見たところ3桁8進数のエスケープ\
nnn
が
377(10進数で255)を超えた場合、代わりに2桁8進数のエスケープとみなすようにしました。
(Tom Lane)
これにより現在のTclリリースと振る舞いが一致します。
対応する等価演算子との一貫性のため、トランザクションID演算子xid
<>
xid
とxid
<>
int4
を追加しました。
(Michael Paquier)
jsonb
配列に新たな要素を挿入したり、未だ無いキーをjsonb
オブジェクト挿入したりするjsonb_insert()
関数を追加しました。
(Dmitry Dolgov)
numeric
型むけのln()
、log()
、exp()
、および、pow()
関数の精度を改善しました。
(Dean Rasheed)
numeric
値の表示スケールを取り出すscale(numeric)
関数を追加しました。
(Marko Tiikkaja)
度で動作する三角関数が追加されました。 (Dean Rasheed)
例えば、sin()
は引数をラジアンで評価しますが、sind()
では度で評価します。
これらの関数は、例えばsind(30) = 0.5
のように、いくつか予測可能な値でちょうどの結果値をもたらすように動作します。
三角関数がinfinity
およびNaN
の入力をPOSIX標準によって扱うことを保証しました。
(Dean Rasheed)
POSIX標準にはこれら関数はNaN
入力にはNaN
を返し、infinity
を含む範囲外の入力にはエラーを投げるべきと書かれています。
これまでの振る舞いはプラットフォームによって様々でした。
to_timestamp(float8)
が浮動小数点のinfinity
をタイムスタンプのinfinity
に変換するようにしました。
(Vitaly Burovoy)
以前は無限大の入力では単に失敗していました。
tsvector
データむけの関数を追加しました。
(Stas Kelvich)
新たな関数ts_delete()
、ts_filter()
、unnest()
、tsvector_to_array()
、array_to_tsvector()
、および、特定語彙素にだけ重みを付けるsetweight()
の別形を追加しました。
ts_stat()
とtsvector_update_trigger()
を期待される引数型そのものでなく、そのバイナリ互換の型の値でも動作するようにしました。
例えばtext
が期待されているところにcitext
を可能にします。
(Teodor Sigaev)
引数の中のNULLまたは非NULLを数える可変引数関数num_nulls()
とnum_nonnulls()
を追加しました。
(Marko Tiikkaja)
a、b、c の内ちょうど一つだけ非NULL
であることを主張するCHECK(num_nonnulls(a,b,c) = 1)
は、一つの使用例です。
これら関数は配列の中のNULLや非NULLを数えるのにも使用できます。
修飾され、クオートされているかもしれないSQL識別子を部品に分解する関数parse_ident()
を追加しました。
(Pavel Stehule)
to_number()
で、V
フォーマットコードを10のV
に続く数字の数のべき乗で割るものと解釈するようにしました。
(Bruce Momjian)
このことでto_char()
の逆関数として動作させます。
to_reg*()
関数群が
cstring
でなくtext
型を受け付けるようにしました。
(Petr Korobeinikov)
これは引数がシンプルなリテラル定数でない箇所のほとんどの場合で明示的なキャストの必要をなくします。
サイズを示す人間に読みやすい文字列を数値に変換するpg_size_bytes()
関数を追加しました。
(Pavel Stehule, Vitaly Burovoy, Dean Rasheed)
本関数は文字列をpg_size_pretty()
で生成されたような文字列をバイトに変換します。
SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB')
が使用例です。
pg_size_pretty()
で、負の値を正の値と同様に整形するようにしました。
(Adrian Vondendriesch)
これまでは負の値は短縮されず、バイトで出力されていました。
current_setting()
関数にオプションのmissing_ok
引数を追加しました。
(David Christensen)
これは認識できないパラメータ名に対してエラーを回避できるようにします。代わりにNULL
が返ります。
様々なシステムカタログ情報関数が不正な入力に対してNULL
を返すように変更しました。
(Michael Paquier)
これからはpg_get_viewdef()
関数は無効なビューのOID
が与えられたならNULL
を返します。また、いくつかの同種の関数も不正な入力に対して同様にNULL
を返します。
以前は、このような場合にたいてい、ユーザ側の問題で起きたことを意味しない「cache lookup failed」エラーになっていました。
pg_replication_origin_xact_reset()
を引数を一切持たないように修正しました。
(Fujii Masao)
ドキュメントには引数を持たないと書かれていて、Cコードも引数を想定していませんが、pg_proc
のエントリでは誤って2つの引数が指定されていました。
PL/pgSQLで実行時でなく関数をコンパイルするときに、CONTINUE
文とEXIT
文の不一致を検出するようにしました。
(Jim Nasby)
PL/Pythonのエラー報告とメッセージ報告の関数を、主エラーメッセージの他に追加メッセージフィールドも指定できるように拡張しました。 (Pavel Stehule)
PL/Python関数がSPIを通して自身を再帰的に呼び出しできるようにしました。 また、複数の集合を返すPL/Python関数が一つの問い合わせから呼び出されたときの動作を修正しました。 (Alexey Grishchenko, Tom Lane)
PL/Pythonでのセッション有効期間のメモリリークを修正しました。 (Heikki Linnakangas, Haribabu Kommi, Tom Lane)
PL/Tclをシンプル文字列ではなく、Tclの「object」 APIを使うように現代化しました。 (Jim Nasby, Karl Lehenbauer)
これは一部のケースで性能をかなり改善できます。 今後はPL/TclはTcl 8.4以上を必要とすることに注意してください。
PL/Tclでデータベースの報告するエラーが、TclのerrorCode
グローバル変数で追加情報を返すようにしました。
(Jim Nasby, Tom Lane)
この機能はエラーについての補助データを返すときのTclの習慣に従っています。
データベースエンコーディングとTclが期待するUTF-8
との間でエンコーディング変換をするようにPL/Tclを修正しました。
(Tom Lane)
これまでは、文字列が変換無しに素通しで渡されていて、データベースエンコーディングがUTF-8
でないとき、非ASCII
文字で誤動作の原因となりました。
エラーおよび通知メッセージに深刻度フィールドの非ローカライズ版を加えました。 (Tom Lane)
この変更はクライアントコードが深刻度をあらわす文字列のローカライズ変形を懸念することなくエラーまたは通知の深刻度を判断できるようにします。
常に、あるいは非エラーメッセージ限定、のいずれかでメッセージのCONTEXT
フィールドを抑止できる機能をlibpqに導入しました。
(Pavel Stehule)
PQerrorMessage()
の現在のデフォルト動作では、エラーについてのみCONTEXT
を出力します。
新たな関数PQsetErrorContextVisibility()
でこれを調節できます。
libpqで異なる冗長度でのエラーメッセージ再生成に対応しました。 (Alex Shulgin)
これは新たな関数PQresultVerboseErrorMessage()
で行われます。
これはpsqlの新たな\errverbose
機能を下支えします。また、他のクライアントにとってもおそらく有益でしょう。
デフォルトのUnixソケット接続において有益なデータを返すように、libpqのPQhost()
関数を改善しました。
(Tom Lane)
明示的なホスト指定が与えられていない場合、これまではNULL
を返していましたが、これからはデフォルトのソケットディレクトリのパスを返します。
ecpgの字句解析が、プリプロセッサディレクティブの行のコメント文字列内の改行を扱えるように修正しました。 (Michael Meskes)
pg_dumpとpg_restoreに--strict-names
オプションを加えました。
(Pavel Stehule)
このオプションはプログラムに-t
または-n
にマッチするものが無いなら、静かに何もしないのではなく苦情を言うようにさせます。
pg_dumpで、システムオブジェクトへの権限割り当てのローカルな変更をダンプするようにしました。 (Stephen Frost)
組み込みの、あるいは、拡張で作られたオブジェクトの権限割り当てを変更することはスーパーユーザで常に可能でしたが、そのような変更は以前はダンプとリストアで失われました。 これからは、pg_dumpがそのような変更を認識してダンプします。 (しかしながら、これは9.6以降のサーバからダンプするときだけ動作します。)
pg_dumpで、拡張が所有するスキーマに含まれる、拡張が所有していないオブジェクトをダンプできるようにしました。 (Martín Marqués)
これまでは誤ってスキーマを所有している拡張に属しているとみなされて、このようなオブジェクトは無視されました。
pg_dumpの出力で、テーブル毎においてだけ一意の名前がつくオブジェクトタイプ(例えばトリガー)のオブジェクトタグにテーブル名を含めるようにしました。 (Peter Eisentraut)
複数の-c
と-f
コマンドラインオプションに対応しました。
(Pavel Stehule, Catalin Iacob)
指定した操作は与えられたオプションの順に実行され、その後psqlが終了します。
問い合わせ結果をクロス表表示で出力する\crosstabview
コマンドを追加しました。
クロス表表示では、ひとつの問い合わせの結果列のデータ値が出力表に配置されます。出力表の行、列のヘッダは問い合わせの別の結果列からきています。
最大の冗長度で最後のサーバエラーを表示する\errverbose
コマンドを追加しました。
(Alex Shulgin)
予期せぬエラーを受け取った後、これは便利です。
もはや、VERBOSITY
変数を調整してデフォルトでは見られないエラーフィールドを見るために失敗を再現する必要はありません。
ビュー定義の編集と表示をする\ev
および\sv
コマンドを追加しました。
(Petr Korobeinikov)
これらは関数に対する既存の\ef
および\sf
コマンドに対応するものです。
問い合わせを実行して、その結果を新たな問い合わせとして再実行する\gexec
コマンドを追加しました。
(Corey Huinker)
\C
との一貫性のため、string
\pset C
でテーブルタイトルを設定できるようにしました。
(Bruce Momjian)
string
\pset expanded auto
モードで、一つだけの列からなる問い合わせ結果については拡張書式を使わないようにしました。
(Andreas Karlsson, Robert Haas)
\watch
コマンドによるヘッダ出力を改善しました。
(Michael Paquier, Tom Lane)
\pset title
の文字列がセットされていたならをそれをヘッダ出力に含めます。また、ヘッダの規格通りの部分を
と、短くしました。
また、タイムスタンプ書式はpsqlのロケール環境に従うようになります。
timestamp
(every N
s)
現在行だけでなく入力の問い合わせ全体を考慮するようにタブ補完ロジックを改善しました。 (Tom Lane)
これまではコマンドが複数行に分かれることで、手前の行の語を見る必要のある全てのタブ補完ルールが無効になっていました。
タブ補完動作の多数の細かな改善。 (Peter Eisentraut, Vik Fearing, Kevin Grittner, Kyotaro Horiguchi, Jeff Janes, Andreas Karlsson, Fujii Masao, Thomas Munro, Masahiko Sawada, Pavel Stehule)
接続されたバックエンドのプロセスIDを挿入するPROMPT
オプション%p
を追加しました。
(Julien Rouhaud)
常に、あるいは非エラーメッセージ限定、のいずれかでメッセージのCONTEXT
フィールドを抑止できる機能を導入しました。
(Pavel Stehule)
現在のデフォルト動作ではエラーの場合のみCONTEXT
を出力します。
特別変数SHOW_CONTEXT
を設定することでこれを変更できます。
\df+
が関数のアクセス権限とパラレルセーフ属性を表示するようにしました。
(Michael Paquier)
pgbenchスクリプト内のSQLコマンドは改行ではなく、セミコロンで終了するものとしました。 (Kyotaro Horiguchi, Tom Lane)
この変更はスクリプト内の複数行にわたるSQLコマンドを可能にします。 現存のカスタムスクリプトは、各行末にセミコロンが未だ無ければ加える修正が必要でしょう。 (そのようにすることは、旧バージョンpgbenchむけのスクリプトを壊しません)
バックスラッシュコマンドの式で組み込み関数、および、浮動小数点演算に対応しました。 (Fabien Coelho)
\setrandom
を組み込み関数で置き換えました。
(Fabien Coelho)
新たに組み込み関数random()
、random_exponential()
、random_gaussian()
を追加しました。
これらは\setrandom
と同じ働きをしますが、大きい式に組み入れることができるのでより使いやすいです。
これら関数の追加で不要になったため、\setrandom
を除去しました。
カスタムスクリプトだけでなく、組み込みのスクリプトの複数の複製を起動できるようにしました。 (Fabien Coelho)
これは-f
と似たように働く、カスタムスクリプトむけの新たな-b
スイッチにより実行されます。
スクリプトの選択率(重み)を変更できるようにしました。 (Fabien Coelho)
複数スクリプトが指定されたとき、各pgbenchトランザクションは実行するものをランダムに選びます。 これまでこれは常に均等な確率で行われていましたが、これからは異なるスクリプトに異なる選択率を指定することができます。
複数スクリプトの実行において、各スクリプトむけに統計情報を収集するようにしました。 (Fabien Coelho)
この機能は既にある全体統計とコマンド毎統計に対して、中間の詳細度を追加します。
実行開始からの時間の代わりにUnixエポックタイムスタンプで進行を報告する--progress-timestamp
オプションを追加しました。
(Fabien Coelho)
クライアント接続数(-c
)がスレッド数(-j
)の倍数でなくてもよくしました。
(Fabien Coelho)
-T
オプションが使われているとき、指定時間の終わりで直ちに終了するようにしました。
(Fabien Coelho)
これまでは、低いトランザクションレートが指定されているとpgbenchが指定よりもかなり長く待つ可能性がありました。
initdbのブートストラップ後フェーズにおけるエラー報告を改善しました。 (Tom Lane)
これまでは、ここでのエラーは入力ファイル全体を「失敗している問い合わせ」として報告するものになっていました。 これからは、現在の問い合わせだけが報告されます。 この望まれる動作を得るため、initdbの入力ファイルの問い合わせは空行で区切られなければなりません。
ブートストラップ後の処理の全てに単一のスタンドアローンバックエンドセッションを使うことでinitdbを高速化しました。
ターゲットタイムラインが変化するときでも動作するようにpg_rewindを改善しました。 (Alexander Korotkov)
例えば、昇格したスタンバイを旧マスタのタイムラインのどこかの状態に巻き戻すことができます。
廃れたheap_formtuple
/heap_modifytuple
/heap_deformtuple
関数を除去しました。
(Peter Geoghegan)
AllocSetContextCreate()
呼び出しをシンプルで安全にするマクロを追加しました。
(Tom Lane)
新たなマクロALLOCSET_DEFAULT_SIZES
、ALLOCSET_SMALL_SIZES
、ALLOCSET_START_SMALL_SIZES
の一つを使うことが推奨され、メモリコンテキストむけに個別のサイズパラメータを書き出すことは非推奨となりました。
しかしながら、既存のコードは引き続き動作します。
ヘッダファイルに無条件でstatic inline
関数を使うようにしました。
(Andres Freund)
これはとても古いコンパイラでは警告および/または無駄なコードスペースをもたらすかもしれませんが、表記法の改善はそうするだけの価値があると思われます。
TAPテスト基盤を改善しました。 (Michael Paquier, Craig Ringer, Álvaro Herrera, Stephen Frost)
特に、この基盤を使ってリカバリシナリオをテストできるようになりました。
trace_lwlocks
が各ロックを名前で識別するようにしました。
(Robert Haas)
psqlのタブ補完のコード基盤を改善しました。 (Thomas Munro, Michael Paquier)
タブ補完規則がかなり容易に書けるようになり、また、よりコンパクトになりました。
接続認証の間のアクセスで利用可能になるように、pg_shseclabel
システムカタログをキャッシュに釘づけにしました。
(Adam Brightwell)
コアコードはこのカタログを認証に使いませんが、拡張が参照したいかもしれません。
Cレベルの大部分を隠すようにインデックスアクセスメソッドAPI再構築しました。 (Alexander Korotkov, Andrew Gierth)
本変更はインデックスAM APIを外部データラッパーやテーブルサンプルハンドラに適用したデザインと同様に現代化します。
これはCコードをシンプルにし、組み込み可能な拡張でインデックスアクセスメソッドを定義することをより実用的にします。
結果として、大部分のpg_am
システムカタログの列はなくなりました。
インデックスAMのこれまでpg_am
にあった属性情報をSQL問い合わせで調べることができる新たな検査関数が追加されました。
initdbや拡張で作られたオブジェクトの元の権限を保持するpg_init_privs
システムカタログを追加しました。
(Stephen Frost)
この基盤はpg_dumpがインストレーションでシステムオブジェクトに加えられた権限の変更をダンプできるようにします。 以前はこのような変更はダンプとリロードで失われていましたが、これからは保存されます。
拡張がカスタムLWLocks
を割り当てる方法を変更しました。
(Amit Kapila, Robert Haas)
RequestAddinLWLocks()
関数は削除され、RequestNamedLWLockTranche()
に置き換えられました。
これによりカスタムLWLocks
の識別を改善し、間違いやすさを軽減します。
複数セッションが同時に待機できるように隔離テスタを改善して、デッドロックシナリオのテストが可能になります。 (Robert Haas)
拡張可能なノードタイプを導入しました。 (KaiGai Kohei)
本変更はFDWあるいはカスタムスキャンプロバイダがプランツリーに従来可能なものよりも便利な形式でデータを置けるようにします。
プランナがスキャン/結合後の問い合わせ処理段階でPaths
を生成比較することで処理するようにし、多数のアドホックなロジックと置き換えました。
(Tom Lane)
この変更は現時点ではユーザに見える改善は僅かしかもたらしませんが、古いコード構造を用いた取り組みでは現実的でなかった、将来の多数の上位プランナ改良を可能にします。
部分的な集約に対応しました。 (David Rowley, Simon Riggs)
本変更は、集約関数の計算を分割された部分に分けることを可能にし、それにより例えばパラレルワーカープロセスが一つの集約の計算を協力して実行できるようにします。 将来的には、ローカルとリモートのデータを横断した集約を部分的にリモート先で行うことが可能になるかもしれません。
汎用のコマンド進捗報告基盤を追加しました。 (Vinayak Pokale, Rahila Syed, Amit Langote, Robert Haas)
他のクライアントプログラムから使えるようにするため、psqlのflex字句解析を分離しました。 (Tom Lane, Kyotaro Horiguchi)
これはコマンド境界を識別するSQLコマンド解析を要するプログラムからコード重複を排除します。 完全な普遍性をもってこれを行うことは望まれているものと比べ困難で、実際いまのところはサポートされるクライアントプログラムの中でpsqlだけがうまく対応しました。
これと他のクライアントプログラム間で共有されるコードを置くため新たなソースコードのサブディレクトリsrc/fe_utils/
が作られました。
以前はこのような共有は、見苦しく重複したコンパイルを要する、シンボリックリンクやビルド時のソースファイルのコピーで実現されていました。
ある待機から次にたいてい変化しないイベントセットの効果的な待機を可能とするWaitEventSet
APIを導入しました。
(Andres Freund, Amit Kapila)
WALレコード書き込みの一般インターフェイスを追加しました。 (Alexander Korotkov, Petr Jelínek, Markus Nullmeier)
本変更は拡張が標準レイアウトでページ変更のWALレコードを書くことを可能にします。 拡張にアクセスすることなくWALのリプレイを要する問題は、一般リプレイコードを持つことで解決されました。 これは例えばインデックスアクセスメソッドとそのWAL対応など、拡張での実装を可能にします。
ロジカルデコーディングの一般WALメッセージに対応しました。 (Petr Jelínek, Andres Freund)
この機能は拡張がロジカルデコーディングプラグインで読み取り可能なデータをWALストリームに挿入できるようにしますが、物理データ再構築には関係しません。
SP-GiST演算子クラスがインデックスをたどるときに任意の「横断値」を置けるようにしました。 (Alexander Lebedev, Teodor Sigaev)
これは「再構築された値」に似たものですが、任意のデータチャンクにできて、インデックス列と同じデータ型の必要がありません。
ereport()
にLOG_SERVER_ONLY
メッセージレベルを導入しました。
(David Steele)
本レベルはメッセージが決してクライアントに送られない点を除き、LOG
のように動作します。
これは監査等の用途で使う想定です。
全ての生成されるヘッダファイルをビルドするMakefile
ターゲットを提供しました。
(Michael Paquier, Tom Lane)
submake-generated-headers
を実行して、バックエンドヘッダファイルを確実に最新状態にすることができます。
これは「スタンドアローン」でビルドされるサブディレクトリにおいて便利です。
OpenSSL 1.1.0に対応しました。 (Andreas Karlsson, Heikki Linnakangas)
contrib/auto_explain
で全問い合わせのうち設定可能な少量だけを採取できるようにする設定パラメータauto_explain.sample_rate
を追加しました。
(Craig Ringer, Julien Rouhaud)
これにより重い問い合わせ流量のオーバーヘッドが軽減できる一方、概してなお有用な情報を取得できます。
ブルームフィルタリングに基づくインデックスアクセスメソッドを実装したcontrib/bloom
モジュールを追加しました。
(Teodor Sigaev, Alexander Korotkov)
これは主として本体以外のインデックスアクセスメソッドの概念実証ですが、多数の列を検索する問い合わせに対するこのモジュール本来の能力が有用であるかもしれません。
contrib/cube
で立体の距離演算子を導入し、また、立体列のGiSTインデックスでkNN方式の検索に対応しました。
(Stas Kelvich)
contrib/hstore
のhstore_to_jsonb_loose()
およびhstore_to_json_loose()
関数で何が数値であるかの認識を一致させました。
(Tom Lane)
これまで、hstore_to_jsonb_loose()
は、JSON構文の数値の仕様に厳密に一致していなくとも、数値に見える文字列を文字列でなくJSON数値に変換していました。
この動作はhstore_to_json_loose()
と一致せず、それでJSON構文に合わせるように厳格化しました。
contrib/intarray
の演算子に、これら演算子を使ったプランを改善するため、選択度推定関数を追加しました。
(Yury Zhuravlev, Alexander Korotkov)
contrib/pageinspect
のheap_page_items()
関数が各タプルの生データを表示するようにしました。
また、各タプルフィールドを調べる新たな関数tuple_data_split()
およびheap_page_item_attrs()
を追加しました。
(Nikolay Shaplov)
contrib/pgcrypto
のpgp_sym_encrypt()
関数にオプションとしてS2K
イテレーションカウントパラメータを追加しました。
(Jeff Janes)
contrib/pg_trgm
に「単語類似度」のサポートを加えました。
(Alexander Korotkov, Artur Zakirov)
これらの関数と演算子はある文字列と別の文字列の中のもっとも類似した一つの単語との類似度を測ります。
contrib/pg_trgm
の類似度の閾値を指定する設定パラメータpg_trgm.similarity_threshold
を追加しました。
(Artur Zakirov)
この閾値は以前から設定可能でしたが、これまでは専用の関数set_limit()
、show_limit()
で制御されていました。
これらは非推奨となります。
よくあるキーと稀なキーが両方現れる場合のインデックス検索の速度を上げるようにcontrib/pg_trgm
のGIN演算子クラスを改善しました。
(Jeff Janes)
contrib/pg_trgm
のGINインデックスで類似度検索の性能を改善しました。
(Christophe Fornaroli)
テーブルの可視性マップを検査できるcontrib/pg_visibility
モジュールを追加しました。
(Robert Haas)
contrib/sslinfo
にssl_extension_info()
関数を追加しました。
現在の接続に使われているX509
証明書に含まれるSSL拡張情報を出力します。
(Dmitry Voronin)
postgres_fdw
外部サーバのオプションでホワイトリストに含まれている拡張であれば、拡張で提供される演算子と関数をリモート実行に送れるようにしました。 (Paul Ramsey)
互換性のあるバージョンの拡張がリモートサーバに在るとき、ユーザはこの機能を有効にできます。 これは拡張の演算子を伴う問い合わせのより効果的な実行を可能にします。
リモートサーバ上でのソートを検討するようにしました。 (Ashutosh Bapat)
リモートサーバ上での結合を検討するようにしました。 (Shigeru Hanada, Ashutosh Bapat)
可能であればUPDATE
やDELETE
を全面的にリモートサーバ上で実行するようにしました。
(Etsuro Fujita)
これまではリモート更新はSELECT FOR UPDATE
コマンドの送信とその後の選択された行の一行ずつの更新や削除を伴いました。
問い合わせのすべての要素がリモートサーバに送って差し支えないならリモートで実行できるようになりますが、一方で演算が何等かローカル処理を必要とするならこの動作はなお必要です。
取り出しサイズをサーバやテーブルのオプションとして設定可能にしました。 (Corey Huinker)
これまではpostgres_fdw
は常にリモート問い合わせから一度に100行を取り出ししていました。この動作が調整可能になりました。
全て同じリモートユーザにマップしている複数ローカルユーザIDが単一の外部サーバ接続を使うようにしました。 (Ashutosh Bapat)
リモートサーバに問い合わせキャンセル要求を伝播するようにしました。 (Michael Paquier, Etsuro Fujita)
これまでは、ローカル問い合わせのキャンセル要求は送信済みのリモート問い合わせを早く終了させませんでした。