0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pgbenchで学ぶPostgreSQL16と17のパフォーマンスチューニング入門 ─ 環境構築から本番対応まで一気通貫

0
Last updated at Posted at 2026-05-12

1. はじめに

本記事は、私がこの1ヶ月で書いたPostgreSQL16パフォーマンスシリーズ9本の「まとめ記事」です。

(2026/05/23) PostgreSQL17の分についても追記しました。

シリーズを通じての一番の売りは 「全記事、実際に手を動かして試せる」 こと。EC2(t3.micro)上にPostgreSQL16環境を構築し、pgbenchで実際に負荷をかけながら、TPSやレイテンシ・実行計画・統計ビューを数字で観察します。「チューニングって何から始めるの?」という方から、「設定パラメータをいじったときの効果を実測したい」という方まで、順を追って読めるように構成しています。

1.1 このシリーズで何ができるようになるか

  • EC2上にPostgreSQL16環境を立て、pgbenchで負荷をかけられる
  • TPSレイテンシEXPLAIN ANALYZEpg_stat_statementsで数字を読める
  • shared_bufferswork_memVACUUMの変更効果を実測で確認できる
  • 本番環境で「どのクエリが遅いか」を統計ビューから特定できる

1.2 検証環境

AWSを契約すれば簡単に構築可能な最低限な環境で検証しました。pgbenchは、PostgreSQLをインストールすると普通に使える便利なベンチマークツールです。

項目 内容
OS Amazon Linux 2023
PostgreSQL 16,17
インスタンスタイプ t3.micro(2 vCPU、1GiB メモリ) EBS 30GB
ベンチマークツール pgbench

【補足】東京リージョンで立ち上げても1時間あたり0.0136ドルで8時間立ち上げても20円ぐらいです。ただ、NAT Gatewayを立ち上げているとそれなりに料金がかかるので注意してください(24時間残っていると240円かかるので、注意が必要)。

2. シリーズ全体マップ

環境の構築から、pgbenchを利用して、PostgreSQLのパフォーマンス関係を手を動かして試せる記事にしています。

# PostgreSQLバージョン タイトル ひと言
1 16 Amazon Linux 2023にPostgreSQL16を構築 はじめての環境構築
2 16 pgbench入門 ─ TPS・レイテンシの読み方 まずここから。基本コマンドと結果の読み方
3 16 postgresql.confを変更して負荷をかけてみる shared_buffers等の変更が数字にどう現れるか
4 16 チェックポインタとバックグラウンドライタを見てみる 書き込みの仕組みをpg_stat_bgwriterで観察
5 16 EXPLAIN ANALYZEを実行してみる 「なぜ遅いか」を実行計画で読む
6 16 pg_stat_statementsでスロークエリを特定する 本番で「どのクエリが遅いか」を数字で特定
7 16 VACUUMとautovacuumの挙動を観察する デットタプル(dead tuple)とテーブル膨張をpgstattupleで可視化
8 16 並列実行時のI/Oやロックの状態を確認する 待機イベントとロック競合をpg_stat_activityで観察
9 16 パーティショニングを実測する 大量データのSeq ScanをPartition Pruningで根本から削減
10 17 PostgreSQL16から17へのバージョンアップ PostgreSQL16から17へのバージョンアップ手順
11 17 PostgreSQL17のWAL改善とVACUUM強化 pgbenchで見るPostgreSQL17の変化 ─ t3.microで確かめるWAL改善とVACUUM強化
12 17 PostgreSQL17の実行計画の改善内容 pgbenchで見るPostgreSQL17の変化 ─ t3.microで確かめる実行計画の改善
13 17 PostgreSQL17のCOPY性能向上とか PostgreSQL17の変化を実測する ─ t3.microで確かめるCOPY性能向上・ストリームI/O・ON_ERRORオプション

3. どこから読めばいいか

全部を順番に読む必要はありません。自分の状況に合わせて飛んでください。

「PostgreSQLを気軽に操作出来る環境ってなかなか無いよね?」
  └─ 1番から順に読む

「PostgreSQLのパフォーマンスって何から学べばいい?」
  └─ 2番(pgbench入門)から順に読む

「設定パラメータをいじったらどう変わるの?」
  └─ 3番(postgresql.conf)・4番(チェックポインタ) 

「クエリが遅い。原因を調べたい」
  └─ 5番(EXPLAIN ANALYZE)→ 6番(pg_stat_statements)

「テーブルサイズが大きくなっている気がする」
  └─ 7番(VACUUM・autovacuum)

「単発では遅くないけど、同時に並列実行すると遅い気がする」
  └─ 8番(並列実行時のI/Oとかの確認手順について)

「大量データのテーブルのSeq Scanをどうにかしたい」
  └─ 9番(パーティショニング)

「PostgreSQL17へバージョンアップしたい」
  └─ 10番(17のインストール、データ移行の手順について)

「PostgreSQL17の機能強化」
  └─ 11番、12番、13番(WALとかVACUUMとか、実行計画とか)

4. 各記事のポイント

#2 pgbench入門 ─ TPS・レイテンシの読み方

pgbenchは、PostgreSQL付属のベンチマークツールです。デフォルトでは簡単なトランザクション(SELECT・UPDATE・INSERT混在)を指定した並列クライアント数で連続実行し、TPS(1秒あたりトランザクション数)レイテンシ(ms) を計測します。

本記事ではt3.micro上の実測値をもとに、結果の読み方・オプションの意味を解説しています。

#3 postgresql.confを変更して負荷をかけてみる

shared_bufferswork_memなどの主要パラメータを段階的に変更し、pgbenchの結果がどう変わるかを実測します。「設定を変えたらなんとなく速くなった」ではなく、変更前後のTPSとI/O量を数字で比較しています。

#4 チェックポインタとバックグラウンドライタを見てみる

PostgreSQLの書き込み処理を担う2つのバックグラウンドプロセス(チェックポインタ・bgwriter)の動きを、pg_stat_bgwriterビューで観察します。checkpoint_completion_targetbgwriter_lru_maxpagesの変更効果もpgbenchと組み合わせて確認しています。

#5 EXPLAIN ANALYZEを実行してみる

EXPLAIN ANALYZEは、特定のクエリが「どのような実行計画で動いているか」を可視化するツールです。Seq Scan・Index Scan・Hash Joinなど各ノードのコスト・実行行数・実際の処理時間を読み解く方法を、pgbenchのテーブルを使った実例で解説します。

#6 pg_stat_statementsでスロークエリを特定する

EXPLAIN ANALYZEが「特定クエリの解剖」ならば、pg_stat_statementsは「本番で問題を起こしているクエリの洗い出し」ツールです。累積実行時間・ディスクI/O・実行時間のばらつきの3つの軸でクエリを絞り込む方法を実測値つきで解説します。

#7 VACUUMとautovacuumの挙動を観察する

PostgreSQLのMVCCはUPDATE/DELETEのたびにdead tupleを蓄積します。放置するとテーブルが膨張し、Seq Scanのコストが増大します。本記事ではpgstattuple拡張でdead tupleを可視化し、VACUUM実行前後のテーブルサイズ変化を実測します。

#8 並列実行時のI/Oやロックの状態を確認する

pg_stat_activitywait_eventでロック待ち・I/O待ちを観察します。並列クライアントが増えたときに何が起きているかを数字で追うことで、「なんとなく詰まっている」状態の原因を特定する手順を解説します。

#9 パーティショニングを実測する

shared_bufferswork_memを増やしても、そもそも読み込むブロック数が多ければ根本的な改善は難しいです。レンジパーティショニングを設定したテーブルと非パーティションテーブルでEXPLAIN ANALYZEを比較し、Partition Pruning(不要パーティションの刈り込み)が実行計画にどう現れるかを実測します。

5. もっと深く学びたい方へ

公式ドキュメント(日本語)

各コマンドや設定パラメータの詳細は、公式の PostgreSQL 日本語マニュアル(JPUG)を参照するのが一番確実です。以下の表(PostgreSQL 16版)のほか、17版のドキュメントも同様に充実しており、URLの 16 を 17 に変えるだけで簡単に各バージョンの詳細を参照可能です。

ページ URL
pgbench https://www.postgresql.jp/docs/16/pgbench.html
EXPLAIN https://www.postgresql.jp/docs/16/sql-explain.html
VACUUM https://www.postgresql.jp/docs/16/sql-vacuum.html
postgresql.conf パラメータ https://www.postgresql.jp/docs/16/runtime-config.html

書籍

書籍名称 内容
[改訂3版]内部構造から学ぶPostgreSQL―設計・運用計画の鉄則 使った事がある人向けの設計・運用の鉄則。大変お世話になりました。
PostgreSQL実践入門 ─⁠─アーキテクチャ、運用監視、性能改善 (最近発売されたようで注目中)こちらも基本からチューニングまで幅広い内容。特に監視面のところが充実してそう。

6. おわりに

本シリーズは「理論の説明」よりも「手を動かして数字を見る」ことを優先して書きました。EC2を立ち上げてpgbenchを実行するまでの手順も各記事に含まれているので、すぐに試せます。

パフォーマンスチューニングの第一歩は、勘や経験ではなく数字を見ることです。TPSが上がった・レイテンシが下がった・buffers_backendが改善した──そういった小さな「測れた」体験を積み重ねていくことが、性能劣化や本番障害に強いエンジニアへの近道だと思っています。

自身のことをまだまだ経験不足だと感じている方に、こちらの記事を実際に読んでもらって、手元のターミナルを開きながら記事を読み進めてもらえると嬉しいです。まずは、手を動かしていくことで、自身の技術力のステップアップに繋げてください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?