2026/02/01

PostgreSQL 16の新機能、仕様変更、不具合修正。開発者、運用管理管理者向け

 

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 結合が並列実行可能になりました。また、DISTINCTORDER BY を伴う集計関数のプランが最適化されています。

  • 増分ソート(Incremental Sort)の活用: SELECT DISTINCT クエリで増分ソートが利用可能になり、処理速度が向上しました。

  • アンチジョイン(Anti-joins)の最適化: NOT INNOT 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のデフォルトファイルをベースに、必要な差分だけを適用する運用が推奨されます。