PostgreSQL 17の新機能 - パフォーマンスと使いやすさが向上

2025.12.10

PostgreSQL 17の概要

PostgreSQL 17は、JSONBのSQL/JSON標準準拠、インクリメンタルバックアップ、大幅なパフォーマンス改善を含むメジャーリリースです。

SQL/JSON標準のサポート

JSON_TABLE

JSONデータをリレーショナルテーブルとして扱えます。

SELECT *
FROM JSON_TABLE(
  '[{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]',
  '$[*]'
  COLUMNS (
    id INT PATH '$.id',
    name TEXT PATH '$.name'
  )
) AS users;

-- 結果:
-- id | name
-- ---+------
--  1 | Alice
--  2 | Bob

JSON_QUERY / JSON_VALUE

-- JSON_VALUE: スカラー値を取得
SELECT JSON_VALUE(data, '$.user.name') as name
FROM events;

-- JSON_QUERY: JSON値(配列・オブジェクト)を取得
SELECT JSON_QUERY(data, '$.user.tags' WITH WRAPPER) as tags
FROM events;

JSON_EXISTS

-- 条件に一致するJSONが存在するかチェック
SELECT *
FROM products
WHERE JSON_EXISTS(attributes, '$.colors[*] ? (@ == "red")');

インクリメンタルバックアップ

前回のバックアップからの変更分のみをバックアップできます。

# フルバックアップを取得
pg_basebackup -D /backup/base --checkpoint=fast

# インクリメンタルバックアップを取得
pg_basebackup -D /backup/incr1 \
  --incremental=/backup/base/backup_manifest

# 復元時にマージ
pg_combinebackup /backup/base /backup/incr1 -o /restore

利点

項目フルバックアップインクリメンタル
時間長い短い
容量大きい小さい
復元簡単マージが必要

パフォーマンス改善

VACUUMの高速化

PostgreSQL 16 vs 17:
- 大規模テーブルのVACUUM: 最大20倍高速化
- メモリ使用量: 最大20倍削減

I/O最適化

-- 新しいI/O統計
SELECT * FROM pg_stat_io;

-- 結果にはバックエンドタイプごとのI/O統計が含まれる

インデックスの改善

-- BRIN(Block Range Index)の改善
CREATE INDEX ON events USING BRIN (created_at)
WITH (pages_per_range = 32);

-- より効率的なマルチカラムBRIN

新しい機能

MERGE文の拡張

MERGE INTO inventory t
USING new_items s
ON t.product_id = s.product_id
WHEN MATCHED THEN
  UPDATE SET quantity = t.quantity + s.quantity
WHEN NOT MATCHED THEN
  INSERT (product_id, quantity)
  VALUES (s.product_id, s.quantity)
RETURNING *;  -- PostgreSQL 17で追加

部分的な集計プッシュダウン

-- パーティションテーブルでの集計が高速化
SELECT date_trunc('month', created_at), COUNT(*)
FROM events  -- パーティション化されたテーブル
GROUP BY 1;

新しいシステムビュー

-- 実行中のクエリの進捗
SELECT * FROM pg_stat_progress_copy;
SELECT * FROM pg_stat_progress_basebackup;

論理レプリケーションの改善

フェイルオーバースロット

-- スタンバイサーバーでレプリケーションスロットを同期
ALTER SUBSCRIPTION my_sub
SET (failover = true);

サブスクライバーでの競合解決

-- 競合発生時の動作を設定
ALTER SUBSCRIPTION my_sub
SET (disable_on_error = false);

移行のポイント

# アップグレード前のチェック
pg_upgrade --check

# pg_upgradeでのアップグレード
pg_upgrade \
  -b /usr/lib/postgresql/16/bin \
  -B /usr/lib/postgresql/17/bin \
  -d /var/lib/postgresql/16/main \
  -D /var/lib/postgresql/17/main

まとめ

PostgreSQL 17は、SQL/JSON標準への対応、インクリメンタルバックアップ、大幅なパフォーマンス改善により、エンタープライズでの利用がさらに容易になりました。特にJSONデータを扱うアプリケーションでは、新しいJSON関数が大きな恩恵をもたらします。

← 一覧に戻る