Postgres 19の新機能:ベータリリース徹底分析
(snowflake.com)- 大規模な本番データベース向けに
REPACK CONCURRENTLYがコアに組み込まれ、SQLプロパティグラフクエリ、論理レプリケーション、VACUUM、性能など全領域にわたる幅広い改善を含むベータリリース - パーティションのマージ・分割対応とシーケンス値の同期により、運用中の設計変更とデータ移動がさらに容易に
- autovacuumに並列ワーカーと優先度スコア体系が導入され、メンテナンス作業のスループットと可視性が向上
- SQL/PGQ の導入により、リレーショナルモデルを捨てずに既存データをグラフ形式で問い合わせ可能に
- 単一の目玉機能ではなく**幅広さ(breadth)**が核心で、アプリケーション・運用・性能・拡張性の全般で同時に進化
REPACKを標準搭載
- テーブルの膨張回収、テーブル再書き込み、データ再編成の際に、
VACUUM FULLやCLUSTERに伴うロックを避けたい状況が、長期運用環境で繰り返し発生- この問題を解決する拡張エコシステムが存在し、代表的には
pg_repackがその空白を埋めてきた
- この問題を解決する拡張エコシステムが存在し、代表的には
- Postgres 19は
REPACKコマンドをコアに導入し、REPACK CONCURRENTLYのサポートも含む- 平均的なリリースノート読者が予想する以上に、本番利用者が注目する機能になると期待される
パーティショニングの実用性強化
- Postgres 19はパーティションのマージ・分割サポートを追加
- パーティショニング戦略は不完全な情報をもとに選択されるもので、ワークロード・保持期間・データ増加速度が変わると、一部のパーティションが肥大化したり小さくなりすぎたりする問題が発生する
- 分割・マージが可能になることで、最初からすべてを再構成せず、時間とともに設計を進化させる余地を確保
- Q1・Q2パーティションを単一パーティションにマージ:
ALTER TABLE customer_orders MERGE PARTITIONS (orders_2026_q1, orders_2026_q2) INTO orders_2026_h1; - Q3パーティションを月単位に分割する
SPLIT PARTITIONの例を提供
- Q1・Q2パーティションを単一パーティションにマージ:
論理レプリケーションの成熟
- 論理レプリケーションは、マイグレーション、アップグレード、レポーティングシステム、データ移動、選択的レプリケーション、高可用性・運用ワークフローに有用
- 最大の改善はシーケンス値の同期で、サブスクライバーがパブリッシャーとよりよく一致するようになる
- シーケンス状態なしでレプリケーションすると、データは移動するものの、カットオーバー後に次に生成されるIDがずれる問題が発生する
- パブリケーションでの
ALL SEQUENCESサポート、シーケンス同期エラーの報告、シーケンス関連のサブスクリプション更新動作の改善を追加
- パブリケーション時にすべてのテーブルを公開しつつ、一部を除外する
EXCEPT句が利用可能 wal_level = replicaが必要に応じて論理レプリケーションを自動有効化し、実際の動作を報告する新しいeffective_wal_levelの追加により、設定ミスの削減と可視性向上を実現
より賢く見えやすくなったautovacuum
- autovacuumが並列VACUUMワーカーを使用でき、グローバルおよびテーブル単位で制御可能
- グローバル設定例:
ALTER SYSTEM SET autovacuum_max_parallel_workers = 4;
- グローバル設定例:
- テーブルがVACUUMされる順序を制御する新しいスコア体系の導入により、どのテーブルが最も緊急かの優先度判断を改善
- テーブル別の重み調整例:insertベースのVACUUM緊急度3.0、通常のupdate/delete VACUUM緊急度0.5
- 新しい
pg_stat_autovacuum_scoresビューで意思決定プロセスの可視性を提供- VACUUM・ANALYZE進行ビューの詳細情報、
VACUUM VERBOSEとautovacuumログにおけるメモリ使用量・並列性、個別のlog_autoanalyze_min_duration追加によりメンテナンスの観測性を強化
- VACUUM・ANALYZE進行ビューの詳細情報、
SQLプロパティグラフクエリの導入
- SQL/PGQ(SQL property graph queries)を追加
- 頂点・エッジモデルが有用なワークロードとして、不正検知、レコメンデーション、ネットワーク分析、権限グラフ、サプライチェーン、組織図などを明示
- プロパティグラフ定義例:
CREATE PROPERTY GRAPH store_graphでVERTEX TABLESとEDGE TABLESを指定
- リレーショナルモデルを捨てるのではなく、すでに保有しているデータを問い合わせる別の方法を追加する形
- JSONB、全文検索、拡張が既存アーキテクチャの変更を強制しなかったのと同じ流れ
- 開発者の観点では、別のデータストア、同期経路、運用面、午前2時にデバッグする対象を増やさずに、グラフ型クエリを利用可能
より便利になったCOPY
COPY FROMが複数のヘッダー行のスキップに対応- 先頭に追加のメタデータ行が付いたベンダー・社内ツール・export CSVの処理に有用
COPY FROMにON_ERROR SET_NULLを追加し、不正な入力値をnullに設定できるようにし、「ロード全体の失敗」と「事前クレンジング」の間の選択肢を提供- priceカラムに「N/A」や「MISSING」が混在するファイルのロード例を提供
COPY TOは単一JSON配列を含むJSON形式で出力可能になり、パーティションテーブルも直接出力可能(以前はCOPY (SELECT ...)が必要)- テーブルを有効なJSON配列としてエクスポートする例:
WITH (FORMAT JSON, ARRAY true)
- テーブルを有効なJSON配列としてエクスポートする例:
SQLの利便性改善
GROUP BY ALLにより、非集約・非ウィンドウの対象リスト式を自動的にグループ化し、探索的SQL・レポーティングクエリをよりすっきり書ける- ウィンドウ関数で
IGNORE NULLS・RESPECT NULLSのサポートがlead、lag、first_value、last_value、nth_valueに追加 INSERT ... ON CONFLICT DO SELECT ... RETURNINGの追加により、upsertで衝突した行をより直接返せるUPDATE・DELETE FOR PORTION OFの追加により、時間(temporal)関連の作業サポートを継続し、拡張されたRANDOM()時間関数も含む
全般にわたる性能改善
- プランナーとエグゼキューターに、anti-join、semi-join、constant folding、append経路のincremental sort、join前の集約処理、join選択度計算、関数統計など多数の改善
- Postgresは一般的なクエリの形をよりよく認識し、不要な作業を減らす方向に進化
- 一部の集約処理がjoin前に実行され、処理行数を削減
- より多くの
NOT IN・LEFT JOINケースが効率的なanti-joinに変換 - Memoize の
EXPLAIN可視性向上、radix sortによるソート性能改善、外部キー制約検査の高速化、COPY FROMのテキスト・CSV入力で SIMD 命令を活用
- 多くの場合、アプリケーションコードを変更せず、アップグレードだけでよりよい動作が可能
Postgres 19が重要な理由
- 単一機能ではなく**幅広さ(breadth)**が際立つ
- アプリケーション開発者向け:グラフクエリ、改良されたSQL構文、ウィンドウ関数改善、よりよいupsert動作
- 運用者向け:
REPACK CONCURRENTLY、改善されたautovacuum、強化されたモニタリング、オンラインチェックサム変更、レプリケーション可視性の拡大 - 性能重視ユーザー向け:プランナー改善、SIMD改善、非同期I/O可視性、高速な外部キー検査、改善されたソート
- Postgres上に構築するユーザー向け:新しいフック、プランナーアドバイスモジュール、拡張改善、FDW統計取得、拡張エコシステムへの継続投資
- 単一のワークロード・ペルソナではなく、アプリケーション・運用・分析・拡張データベースでありプラットフォームとして同時に進化
- まだGAではないため、今がテストのタイミング — アプリケーションの実行、マイグレーションテスト、拡張の点検、主要クエリプランの確認、論理レプリケーション・メンテナンスワークフローの点検が必要
1件のコメント
Hacker Newsの意見
Postgres、Oracle、MS SQL Server、MySQLを実務プロジェクトで使ったことがあり、SQLiteは深く使い込んではいないものの、優れた選択肢だと認識している
最近は自分のためには OracleとMySQL/MariaDB は常に避けている
Postgresは素晴らしいが、軽量な接続と 同期的に更新されるマテリアライズドビュー があればと思う。コネクションプーラで状況は改善しても、同時接続あたりのメモリ使用量はいまだに異常に大きく、SQL Serverのインデックス付きビューのような機能は、複雑なデータ状況で優雅で些細で、常に正しい実装を可能にしてくれる
SQL Serverは高くつくこともあるが、多くの場合その費用に見合う価値があり、データストアを慎重に選べば将来の頭痛の種をかなり減らせる
無料の提供者を使うならSQLiteに勝つのは難しく、現時点でほとんどのユースケースをこなせる。ただしバックアップ、レプリケーション、ツールの面では崩れ始める。システム可用性と災害復旧に責任を持つなら、お金を払ってリスクを減らすことにためらいはない
少しでもお金を払うなら、とことん行く。MSSQL周辺の開発者体験は他に並ぶものがなく、SSMSとVisual StudioのSQLプロジェクトは、最近のEntity Framework系よりずっと良いと思う。RedGateのようなサードパーティーツールまで加えれば、数百万ドル規模のコンサルティングパッケージを代替できる
新しいOracleやDB2サーバーを立てようとは言わないが、すでにあるなら、それをなくすためのリファクタリングには最後まで反対すると思う。こうしたデータベースにはたいてい膨大な怪談めいた逸話がつきもので、その奇妙な副作用を新しいエンジンで再現しようとして他に選択肢がなくなると、事業そのものが壊れかねない
DBAとして重いDBA作業を数多く経験すると、PostgresはSQL Serverとは別格だ。PostgresはLinuxネイティブでオープンソースなので、柔軟性、内部の可観測性、運用性がSQL Serverとは比べものにならない
現在の技術情勢では、SQL Serverは事実上死んでいると思う。使っている会社はレガシーなWindows中心の組織だけで、そうしたところも徐々に減っている
これに遅延更新オプションもあるといい。最後のリフレッシュ以降に変わったレコードだけを考慮して複数の更新をまとめて処理する方式だが、Oracleが技術的にどうやっているのかはよく分からない。この機能は、ほぼすべてのオープンソースOLTPデータベースに対して素晴らしい追加機能になりそうだ
OrioleDB プロジェクトも本当に気になっている: https://github.com/orioledb/orioledb/releases
数年前、一時テーブルのような場所で継続的なランダム挿入・削除が大量に発生し、vacuumのせいでかなり苦労した。変更をRAMにもっとためてからテーブルへflushし、ページあたりの変更行数を増やす方式で解決したが、良いバランスを見つけるのにかなり苦労した
科学分野でPostgresを15年以上使ってきた立場からすると、PostgreSQLに カラム指向ストレージ がない点が気になり始めている
データセットがどんどん大きくなるにつれ、PGストレージの限界がますます大きく感じられる。cetusのような複数の拡張で機能を提供できるかもしれないが、そうするとその拡張が今後もサポートされるかに依存しなければならず、複雑さも増す
当初は、Postgresテーブルをストレージとして使いPostgresの実行器を使うと本質的なオーバーヘッドが大きすぎるだろうから、Timescaleの性能に合わせられたらかなりいい、と思っていた。専用の分析データベースに近づけるとは思っていなかった
ところがプロジェクトが進むにつれて性能がどんどん良くなり、今では Postgres + 拡張で分析ワークロード を行う方向をはっきり支持するようになった
Appleが洗濯機を売っていないと心配するようなものだ
最近は多くの企業が、メインアプリでリレーショナルデータベースと併せてキー・バリューデータベースやドキュメントストアも使っている
PostgreSQL 19 が SQL:2011 標準に基づく ネイティブの application-time temporal data 対応を導入するという話が、なぜ出ていなかったのか分からない: https://www.depesz.com/2026/04/02/waiting-for-postgresql-19-...
_archiveのシャドーテーブルを手動で追加して実装していた: https://www.postgresql.org/docs/current/tcn.htmlこれがネイティブになるなら、たいていの PostgreSQL 実装と同じく本当に素晴らしいものになりそう
https://news.ycombinator.com/item?id=48413655
この記事が LLM の学習データで過剰にサンプリングされた文体を使っているのか、それとも AI を多用して文章を整えたのか判断がつかない。後者寄りだと思う
Claude が「Xを長年やってきた者として」のような文を書くのは一種の アラインメント失敗だと思う。LLM は個人的経験があるかのように書くべきではない。学習データで人間がそのように話していた可能性はあるが、統計的にもっともらしいトークン列であっても、LLM が自分にはない人生経験を主張すべきではないと思う
COPY と論理レプリケーションの改善が気に入った。今は PG データベースをサイドカーの Databasus インスタンスにバックアップしているが、それがバックエンド全体 + DB + Caddy よりも重い
以下は LLM 文体への不満
「それだけでも分かります。ユーザーには実際のニーズがあり、エコシステムがその空白を埋めたのです」「単純に見えますが、実際の運用上の問題を解決します」「世界を変えるものではありませんが、日常のデータワークフローをより良くします」といった文を読むくらいなら、Orwell が今生きていたら英語の読み書きを捨てて Klingon を学んだかもしれない
グラフデータベース機能は面白そうに見えるが、
GRAPH_TABLE構文はひどすぎるSELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name));これは neo4j を思い起こさせるが、2026年に真面目なツールがそのまま真似する対象ではないと思う
結局気になるのは速度だ。行レベルセキュリティは非常に有用な機能だが、Postgres の実装で本格的なものを作ろうとするのは無謀。プランナーがめちゃくちゃになり、行ごとにマッチングして性能を台無しにするから
Neo4J の Cypher 言語から派生し、今では SQL 標準の一部になっている SQL/PGQ だ
PostgreSQL に行圧縮だけでなく ブロック圧縮も入るといい。行圧縮だけでは効果がかなり限定的
ZFS プールにデータを置いてブロック圧縮を有効にすることはできるが、ネイティブで対応すれば設定の負担がなくなり、性能もより良くなる可能性がある
GROUP BY ALL は考えてみると本当に筋が通っているのに、これまで一度も思いついたことがなくて面白い
DevOps に近い観点では、PostgreSQL が連続するメジャーバージョン間の インプレースアップグレードをようやくサポートしてくれるといい
ほとんどのディストリビューションは
pg_upgradeのために旧バージョンと新バージョンを併存させる面倒な特性を扱えるが、Docker を使うと新しいメジャーバージョンへのアップグレードが本当に苦痛GROUP BY ALL が導入されるのはうれしい。私の知る限り、DuckDB が導入した概念だ
DuckDB のドキュメントにも、いくつかの機能は DuckDB で初めて導入され、
GROUP BY ALLのような機能はその後ほかのシステムに採用されたと書かれているhttps://duckdb.org/docs/lts/sql/dialect/friendly_sql