PostgreSQL 19 の概要

1.1K Views

June 13, 26

スライド概要

profile-image

I am an engineer mainly dealing with PostgreSQL.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

PostgreSQL 19 の概要 2026-06-13 日本 PostgreSQL ユーザ会 総会併設セミナー JPUG 理事 / SRA OSS K.K. 高塚 遥 1

2.

本講演について ● beta リリースされた PostgreSQL 19 について、 ざっくりお話します ● 大部分の新機能について詳細な検証評価は未実施です ● ● 一部は beta 以前に確認した内容です 😢 2 月に CommitFest エントリに基づいて講演しましたが、 (例年通りながら) 見送りになった機能も多数でした 2

3.

グラフ問い合わせ SQL/PGQ ● 表からグラフにマッピングして、グラフとして問合せ db=# CREATE TABLE usr (id int PRIMARY KEY, name text); db=# CREATE TABLE follows (id1 int, id2 int, PRIMARY KEY(id1, id2)); 《・・・適当にデータを充填・・・》 db=# CREATE PROPERTY GRAPH g1 VERTEX TABLES (usr KEY (id) PROPERTIES (id, name)) EDGE TABLES (follows SOURCE KEY (id1) REFERENCES usr(id) DESTINATION KEY (id2) REFERENCES usr(id)); 3

4.

グラフ問い合わせ SQL/PGQ db=# SELECT * FROM GRAPH_TABLE (g1 MATCH (u1 IS usr)-[f1 IS follows]->(u2 IS usr) -[f2 IS follows]->(u1 IS usr) WHERE u1.id < u2.id COLUMNS (u1.name, u2.name)); name | name ---------+--------name25 | name54 相互フォローのユーザの 組を調べる問い合わせ name45 | name88 (2 rows) ● N 回~無限回リンクを手繰る構文はまだ使えない → 今のところは再帰問合せを置き換えできない 4

5.
[beta]
テンポラルテーブル
●

レコードに有効期間を付加する DB 設計パターン
uid

name

valid_at

0

root

["2026-04-01",)

26

postgres

["2026-05-10",)

27

mysql

["2026-04-15","2026-05-01")

1000

taro

["2026-04-01","2026-05-01")

1001

jiro

["2026-06-01",)

daterange 型
tsrange 型
などが利用可

db1=# SELECT * FROM t_user WHERE valid_at @> '2026-06-13'::date;
uid |
name
|
valid_at
------+----------+--------------0 | root
| [2026-04-01,)
26 | postgres | [2026-05-10,)
1001 | jiro
| [2026-06-01,)
(3 rows)

5

6.

テンポラルテーブル ● PG18: WITHOUT OVERLAPS サポート CREATE EXTENSION btree_gist; 範囲型の他、 マルチ範囲型 でも可 CREATE TABLE t_user ( uid int, name text, valid_at daterange, PRIMARY KEY (uid, valid_at WITHOUT OVERLAPS)); ● PG19: FOR PORTION OF サポート db1=# UPDATE t_user FOR PORTION OF valid_at FROM '2026-06-13' TO NULL SET name = 'jiro2' WHERE uid = 1001; UPDATE 1 マルチ範囲型だと 構文が少し異なる db1=# SELECT * FROM t_user WHERE uid = 1001; uid | name | valid_at ------+-------+------------------------1001 | jiro2 | [2026-06-13,) 1001 | jiro | [2026-06-01,2026-06-13) マルチ範囲型なら、 行数増加をいくらか (2 rows) 6 抑制できる

7.

ストリーミングレプリケーション拡張 ● WAIT FOR LSN '...' WITH ( MODE ... ) ; スタンバイとして指定 LSN までの replay を待機 ● スタンバイとして指定 LSN までの flush を待機 ● スタンバイとして指定 LSN までの write を待機 ● プライマリとして指定 LSN までの WAL flush を待機 ● 非同期レプリケーションで、特定処理だけは最新データを 参照したいが、参照処理をプライマリで実行したくない ● スタンバイを所定 LSN まで待ってから、停止 or 昇格 ● synchronous_commit = off 、 wal_writer_delay= 長め だけど、 時には確実な書き込みをしたい ● 7

8.

論理レプリケーション拡張 ● シーケンス対応 ● パブリケーションで ALL SEQUENCES を指定可能 (個別指定はできない、シーケンス全部か無しか) 8

9.
[beta]
pg_plan_advice
db=# EXPLAIN (COSTS OFF, PLAN_ADVICE)
「ヒント付与案を提示」
SELECT * FROM tfact f
+
JOIN tdim d ON f.dim_id = d.id;
「ヒント付与機能」
QUERY PLAN
-----------------------------------Hash Join
Hash Cond: (f.dim_id = d.id)
-> Seq Scan on tfact f
-> Hash
実行計画の
-> Seq Scan on tdim d
ヒント候補を
出力
Generated Plan Advice:
JOIN_ORDER(f d)
HASH_JOIN(d)
実行計画の
SEQ_SCAN(f d)
ヒントを指定
NO_GATHER(f d)

db=# SET pg_plan_advice.advice = 'JOIN_ORDER(f d)';
9

10.
[beta]
pg_stash_advice
●

plan advice を貯めて、 query id に基づき自動適用

shared_preload_libraries = 'pg_stash_advice,pg_plan_advice'
compute_query_id = on
db=# CREATE EXTENSION pg_stash_advice;
db=# SELECT * FROM pg_create_advice_stash('mystash1');
db=# SELECT pg_set_stashed_advice('mystash1', '8128359337089801368',
'INDEX_SCAN(t_user t_user_pkey)');
db=# SET pg_stash_advice.stash_name TO 'mystash1';
db=# explain (verbose) SELECT * FROM t_user WHERE valid_at @> now()::date;
QUERY PLAN

---------------------------------------------------------------------------Index Scan using t_user_pkey on public.t_user (cost=0.14..8.15 rows=1 widt
Output: uid, name, valid_at
Index Cond: (t_user.valid_at @> (now())::date)
Query Identifier: 8128359337089801368
Supplied Plan Advice:
INDEX_SCAN(t_user t_user_pkey) /* matched */
10
(6 rows)

11.

REPACK コマンド 空き領域回収コマンド ● CLUSTER 、 VACUUM FULL コマンドを統合 ● CONCURRENTLY オプションで排他ロック ( ACCESS EXCLUSIVE ロック)取得範囲を最小化 ● pg_repack 、 pg_squeeze と似た実現方式 ● クリーンなコピーを作って、切り替え ● 再構築中の変更差分はロジカルデコーディングで採取 ● db=# REPACK (CONCURRENTLY) tbl1 USING INDEX tbl1_idx1; 11

12.

パーティションの併合/分割 ● ALTER TABLE ... MERGE/SPLIT PARTITIONS ● v17 beta1 で 1 度含まれて、取り下げられたもの (併合) ALTER TABLE t_log MERGE PARTITIONS (t_log_1, t_log_2) INTO t_log_1_2; HASH パー ティション は非対応 (分割) ALTER TABLE t_log SPLIT PARTITION t_log_1_2 INTO ( PARTITION t_log_1 FOR VALUES FROM (10000) TO (20000), PARTITION t_log_2 FOR VALUES FROM (20000) TO (30000)); LIST パーティションなら、 FOR VALUES IN ('…','…',… ) となる 12

13.

Autovacuum スコア ● テーブルとコンポーネントごとにスコアが付く 処理優先順を決める ● pg_stat_autovacuum_scores ビューで参照できる ● コンポーネントは : ● – ● XID 周回、 MXID 周回、デッドタプル、行挿入、プランナ統計 コンポーネントごとにスコア調整する係数の設定 : – autovacuum_freeze_score_weight – autovacuum_multixact_freeze_score_weight – autovacuum_vacuum_score_weight – autovacuum_vacuum_insert_score_weight – autovacuum_analyze_score_weight 13

14.

モニタリングビューの拡充 ● pg_stat_lock ビュー追加 ● pg_stat_recovery ビュー追加 ● pg_dsm_registry_allocations ビュー追加 ● pg_stat_replication_slots.mem_exceeded_count 列追加 ● pg_stat_all_*.stats_reset 列追加 ● pg_stat_progress_vacuum.started_by / pg_stat_progress_analyze.started_by 列追加 ● 他に pg_stat_progress_basebackup,pg_stat_wal, pg_stat_wal_receiver.status,pg_stats, pg_stats_ext_exprs,pg_available_extensions, pg_stats_ext,pg_stats_ext_exprs の変更拡充 14

15.

pg_stat_lock ロック待ち の累計統計 db1=# SELECT locktype, waits, wait_time, fastpath_exceeded FROM pg_stat_lock; locktype | waits | wait_time | fastpath_exceeded ------------------+-------+-----------+------------------relation | 11 | 113057 | 0 extend | 0 | 0 | 0 frozenid | 0 | 0 | 0 page | 0 | 0 | 0 tuple | 0 | 0 | 0 transactionid | 3 | 38415 | 0 virtualxid | 0 | 0 | 0 spectoken | 0 | 0 | 0 object | 0 | 0 | 0 userlock | 0 | 0 | 0 advisory | 0 | 0 | 0 applytransaction | 0 | 0 | 0 (12 rows) 15

16.

オンライン設定変更 ● wal_level ● 「 logical 」レベル書き出しの有無の変更がオンラインで – ● (WAL に書き出す情報量 ) 論理レプリケーションスロットが無ければ出力を自動縮減 データチェックサム pg_enable_data_checksums() 、 pg_disable_data_checksums() 関数で切替 ● pg_stat_progress_data_checksums ビュー ● – 有効化(無効化)している途中の状態がある 16

17.

COPY FROM の SIMD 化(性能向上) CSV からの 10 万行 COPY FROM ローディング所要時間 3500 20 %程度の高速化 3000 他に encode(..,'hex') decode(..,'hex') も SIMD 化 2500 ms 2000 1500 1000 500 0 適用前 SIMD 化適用後 ・数値、テキスト、タイムスタンプ型で計 30 列のテーブルで 一行あたり 300 バイト程度 × 10 万行 17

18.

各種高速化 ● 各種のプランナ改善 ● 基数ソート ● ● 整数等の高速ソート タプルデフォーム高速化 ● 列が多いテーブルのスキャン性能が向上 ● 外部キー制約検査の高速化 ● タイミング計測の高速化 ● auto_explain.log_timing = on の負荷軽減 18

19.

その他機能追加 ● バイナリ pg_dumpall ● GROUP BY ALL ● jsonpath メソッド追加 ● タイムスタンプを返す random() 関数 ● NULL ならエラーを出す error_on_null() 関数 ● COPY TO で JSON 形式 ● COPY FROM で複数行ヘッダ、 ON_ERROR SET_NULL ● CHECKPOINT (FLUSH_UNLOGGED, MODE SPREAD) ● AIX 再サポート 19

20.

ひとまず以上 ● 他にも多数の性能改善、機能追加があります ● ● 「わたしが開発に携わった項目が無いぞ」という方、 申し訳ありません。 SRA OSS K.K. で、例年通り詳しいレポートを作成中です。 20