新機能や性能向上まとめ【PostgreSQL 14】

未分類

新機能まとめ

PostgreSQL 14の新機能や変更点を4つの面でまとめました。

1.性能向上

2.新機能(SQL)

3.運用管理

4.その他

 

それぞれについて解説・まとめをしていきます。

※ ここに記載する内容は、ほぼ次の動画を簡易的にまとめたものになります。詳細を知りたい方は、次の動画を是非ご参照ください(とてもわかりやすい動画でした)。

 

 

 

 

1.性能向上

まず性能の向上面について。

 

① Btree Indexの改善

PostgreSQLは追記型のデータベースのため、更新を繰り返すとデータ量が肥大化していきます。これはテーブル本体だけでなく、インデックスも同様です。そのインデックスの更新時に不要なデータを整理する処理が入り、データの肥大化を防ぐことができるようになりました。

SRA OSS - 「PostgreSQL 14 新機能検証結果報告

 

 

② 式の拡張統計という機能が追加

PostgreSQLは、プランナの統計情報(このテーブルにはこんな情報が入っているよ)を参考にSQLの実行方法を決めています。そして、その統計情報に「こういう情報も取っておいてください」と追加できる「CREATE STATISTICS」という命令があり、そこに「式に関する統計情報」を追加できるようになりました。

 

通常、WHERE文に式が書かれている場合、プランナは式の結果がどうなるかはわからないので、プランナ音行数予測というものはあてにならない。そのため、「この箇所は正確に行数予測しよいプランを作ってほしい」という場合に使うものとなっています。

 

 

③ LZ4によるデータ圧縮技術

PostgreSQLでは可変長データは、暗黙的にデータ圧縮がされています(1レコード2KB超の場合)。そのアルゴリズムは「pglz」というものが採用されていますが、「LZ4」という圧縮アルゴリズムも選択可能になりました。列単位で設定可能。

※設定値は「default_toast_compression」

 

SRA OSSの検証結果によると「2つの圧縮どちらも大差はない」とのことです。検索速度としては「lz4」が良い、圧縮率としては「pglz」がよいと出ましたが、大きな差はなかった様子。またデータ形式によっては、結果もこうなるとは言い切れないとのことです。

 

 

④ postgres_fdw改善

外部テーブルに対して、3つの機能(外部テーブルのTRUNCATE、外部テーブルの非同期スキャン、外部テーブルの一括挿入)が追加されました。外部テーブルというのは、他のデータベースのテーブルを、自分のデータベースのテーブルかのように扱うものです。

 

 

⑤ ロジカルレプリケーション改善

いくつかの機能が追加されました。

従来ロジカルレプリケーション(行、テーブル単位)では、コミット実行後に相手側に情報が送られるという挙動でしたが、「ストリーム送信」というコミット前に送出しSUB側に蓄積、コミットを受けて適用するという流れにすることができるようになりました。その他、初期同期トランザクションの巨大化を防ぐために複数トランザクションにする、バイナリ転送モード(性能向上目的)が可能などが挙げられます。

 

 

⑥ パラレルクエリ改善

パラレルシーケンシャルスキャン(=大きなシーケンシャルスキャンを複数のパラレルワーカーに分けて処理をすること)が、従来1ブロックずつ処理していたものを、複数ブロックずつ処理するように変更されました。その他、これまでパラレル対応していなかった部分が対応されました(RETURN QUERY、REFRESH MATERIALIZED VIEW)。

 

 

2.新機能(SQL)

① マルチ範囲型

データ型に「マルチ範囲型」が増えました。範囲型は前からありましたが、それが複数連なったイメージです。範囲型同様にGiSTインデックスが使用できます。

 

 

② SEARCH / CYCLE句

WITH RECURSIVE構文(CTE再起問合せ)に、新しいオプションが加わりました。1.幅優先探索/深さ優先探索を指定できるようになる、2.循環参照の検出ができるようになる、また循環参照での検索停止ができるようになりました、3.再起検索の経路データを自分で作らなくてもよくなりました。※動画にSQL実例あり

 

 

③ 添え字構文

添え字構文が配列にしか使えなかったが、hstore型、jsonb型でも使用可能になりました。

 

 

3.運用管理

① セッション制御機能

セッション制御機能がいくつか追加されました。1つ目として、長期のアイドルセッションを切断できるようになりました(パラメータ:idle_sesson_timeout)。2つ目にクライアント側の切断を早期検知できるようになりました。従来では重いSQLをクライアントが実行し、結果が返ってくる前にクライアント側のプロセスが終了・切断した場合、サーバーは時間のかかるSQLを実行しそれを返そうとした時にエラーを演出していていました(ここでようやく知ることができていた)が、機能が有効になっていると、サーバー側でSQL実行中でもクライアントの切断を検出して、SQL実行を中断することが可能になります。

 

 

②新システムロール

新しいシステムロールが追加されました。
・ pg_read_all_data   …  全てのデータを参照だけできる
・ pg_write_all_data  …  全てのデータを更新だけできる
・ pg_database_owner …  暗黙に現在のデータベース所有者をメンバとしているロール

※「pg_write_all_data」だけ付与するというより、「pg_read_all_data」とセットにし、Read/Writeを付与するための要素として「pg_write_all_data」があると考えると理解しやすいでしょう。

 

 

③ 実行時統計情報の追加

実行時統計情報がいくつか追加されました

・ pg_stat_progress_copyビュー  … copyコマンドの進捗状況が確認できる

・ pg_stat_walビュー       … WAL書き出し情報

・ pg_stat_replication_slotsビュー … ロジカルレプリケーションの統計情報

 

 

④ pg_amcheckコマンドの追加

テーブル、インデックスの内部データ構造を検査し、データが壊れていないかを調べるコマンドです。ここで検査するのは論理的なデータの整合性が正しいか(リンクが正しいかなど)を確認することであり、値自体が変わっている等のチェックには使えません。

 

 

⑤ pg_rewind拡張

pg_rewindコマンドが拡張されました。pg_rewindとは「walを巻き戻すツール」です。レプリケーションを行ったりクラッシュでリカバリをすると、WAL(Write Ahead Log)を適用するということを行います(プライマリのWALをスタンバイに適用することでデータを同じにする)。その適用したものを元にもどすのがpg_rewindです。従来ではスタンバイをターゲットにした巻き戻しに対応していなませんでしたが、今回から対応可能になりました。

 

 

4.その他(互換性で注意すること)

・pg_hba.confの「clientcert=1」という記法が廃止

・V2プロトコル廃止(プロトコル:クライアントとサーバーの通信プロトコル)

・後置単項演算子(こうちたんこうえんざんし)の廃止

・EXTRACTの戻り値がfloat8型(浮動小数点)からnumeric型に・pg_standby廃止