1. PostgreSQL 16 基本情報
リリース日: 2023年 9月 14日
主な焦点: パフォーマンスの最適化(並列クエリ、バルクロード)、論理レプリケーションの柔軟性向上、監視用統計情報の拡充。
2. 開発者向け:新機能と仕様変更
SQL構文とデータ型の拡張
SQL/JSON 構文の追加: 標準SQLに準拠した
JSON_ARRAY()、JSON_ARRAYAGG()、JSON_OBJECT()、JSON_OBJECTAGG()などのコンストラクタや、IS JSON述語が導入されました。数値リテラルの改善: 可読性を高めるために、数値リテラル内にアンダースコアを使用できるようになりました(例:
1_500_000)。また、非10進数リテラル(0b:2進数、0o:8進数、0x:16進数)もサポートされました。
クエリ性能の向上
並列処理の拡大:
FULLおよびRIGHT結合が並列実行可能になりました。また、DISTINCTやORDER BYを伴う集計関数のプランが最適化されています。増分ソート(Incremental Sort)の活用:
SELECT DISTINCTクエリで増分ソートが利用可能になり、処理速度が向上しました。アンチジョイン(Anti-joins)の最適化:
NOT INやNOT EXISTSを含むクエリの実行効率が向上しました。
クライアントサイドの改善
libpq の負荷分散: クライアントライブラリ libpq で
load_balance_hosts=randomオプションが追加され、接続先ホストをランダムに選択できるようになりました。
3. 運用管理担当者向け:新機能と仕様変更
論理レプリケーションの強化
スタンバイからの論理デコーディング: プライマリサーバーだけでなく、スタンバイサーバーからも論理レプリケーションが可能になり、プライマリの負荷を軽減できます。
双方向レプリケーションの基盤:
origin=noneパラメータが追加され、同一データの無限ループを防ぎつつ、2つのサーバー間で変更を同期しやすくなりました。パラレル・アプライ: 大規模なトランザクションを並列で適用できるようになり、サブスクライバー側の遅延が解消されます。
セキュリティと権限管理
特権の細分化: 以前はスーパーユーザー権限が必要だった操作(
RESERVED_CONNECTIONSの設定や、特定の管理関数)を、定義済みロールを通じて一般ユーザーに委譲できるようになりました。pg_hba.conf のモジュール化:
include,include_dir,include_if_existsディレクティブを使用して、設定ファイルを分割管理できるようになりました。
監視機能の拡充
pg_stat_io の導入: I/Oアクセスに関する詳細な統計情報を提供する新しいビューです。バックエンドの種類(クライアント、バックグラウンドワーカー等)やターゲット(テーブル、インデックス)ごとのI/O状況を可視化できます。
JITコンパイル統計:
pg_stat_all_tablesなどで、JITに関連する統計情報が追加されました。
4. V16で修正された不具合
V16およびそのマイナーリリース(16.x)では、V15以前に存在した以下の脆弱性や不具合が修正されています。
CVE-2024-10976: 行レベルセキュリティ(RLS)が適用されたテーブルを参照するクエリ(CTEやサブクエリ経由)で、実行ロールに応じたプランの再作成が正しく行われず、本来隠されるべきデータが表示される不具合を修正。
CVE-2024-10977: libpqにおいて、SSL/GSS認証の交渉中に受信したエラーメッセージを破棄するように変更(中間者攻撃による偽メッセージ挿入の防止)。
バキュームの改善: 特定の条件下でバキュームがフルテーブルフリーズを不必要に繰り返す挙動が改善され、I/O負荷が軽減されました。
メモリリーク: 論理レプリケーションや特定のインデックス操作において報告されていたいくつかのメモリリークが解消されています。
5. 重要な仕様変更と互換性(注意点)
ICU サポートのデフォルト化: PostgreSQL 16はデフォルトで ICU (International Components for Unicode) を使用してビルドされます。OSのロケールに依存せず一貫したソート順を提供しますが、非ICU環境からの移行時は挙動の確認が必要です。
スーパーユーザー制限: セキュリティ強化のため、一部のデフォルト設定が厳格化されています。管理スクリプトでスーパーユーザーを前提としている場合、新しい定義済みロール(例:
pg_use_reserved_connections)への移行を検討してください。psql の
\bindコマンド: プリペアドステートメントのようにパラメータをバインドして実行できるようになり、スクリプトの書き方に変更が出る場合があります。
6. V15からV16へのアップグレード失敗談
実際に移行を行った現場で報告されている、よくある「失敗」や「ハマりどころ」です。
① 「統計情報の消失によるパフォーマンス劣化」
内容:
pg_upgradeを実行した後、アプリケーションの特定のクエリが急激に遅くなった。原因:
pg_upgradeはデータと定義を移行しますが、オプティマイザが使用する統計情報(Statistics)は移行しません。教訓: アップグレード直後に
VACUUM ANALYZE(またはanalyze_new_cluster.sh)を即座に実行することが必須です。これを怠ると、インデックスがあるのにシーケンシャルスキャンが選択される事態に陥ります。
② 「拡張機能(Extension)の非互換」
内容: 本体はアップグレードできたが、利用していた外部拡張(PostGISや特定の認証プラグイン)がV16に対応しておらず、サーバーが起動しない、あるいはエラーを吐き続ける。
原因: バージョンアップ前に拡張機能の対応状況を確認し忘れたため。
教訓:
pg_upgrade --checkでライブラリのロードチェックを確実に行うこと。
③ 「pg_hba.conf の手動上書きによる接続不可」
内容: 旧バージョンの設定ファイルをそのままコピーしたところ、新しく導入された予約接続用パラメータと競合したり、新しい書式ルールに適合せず、一部のユーザーが接続できなくなった。
教訓: 設定ファイルはそのままコピペせず、V16のデフォルトファイルをベースに、必要な差分だけを適用する運用が推奨されます。