1. はじめに
本記事は、私がこの1ヶ月で書いたPostgreSQL16パフォーマンスシリーズ9本の「まとめ記事」です。
(2026/05/23) PostgreSQL17の分についても追記しました。
シリーズを通じての一番の売りは 「全記事、実際に手を動かして試せる」 こと。EC2(t3.micro)上にPostgreSQL16環境を構築し、pgbenchで実際に負荷をかけながら、TPSやレイテンシ・実行計画・統計ビューを数字で観察します。「チューニングって何から始めるの?」という方から、「設定パラメータをいじったときの効果を実測したい」という方まで、順を追って読めるように構成しています。
1.1 このシリーズで何ができるようになるか
- EC2上にPostgreSQL16環境を立て、pgbenchで負荷をかけられる
-
TPS・レイテンシ・EXPLAIN ANALYZE・pg_stat_statementsで数字を読める -
shared_buffers・work_mem・VACUUMの変更効果を実測で確認できる - 本番環境で「どのクエリが遅いか」を統計ビューから特定できる
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_buffers・work_memなどの主要パラメータを段階的に変更し、pgbenchの結果がどう変わるかを実測します。「設定を変えたらなんとなく速くなった」ではなく、変更前後のTPSとI/O量を数字で比較しています。
#4 チェックポインタとバックグラウンドライタを見てみる
PostgreSQLの書き込み処理を担う2つのバックグラウンドプロセス(チェックポインタ・bgwriter)の動きを、pg_stat_bgwriterビューで観察します。checkpoint_completion_targetやbgwriter_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_activityのwait_eventでロック待ち・I/O待ちを観察します。並列クライアントが増えたときに何が起きているかを数字で追うことで、「なんとなく詰まっている」状態の原因を特定する手順を解説します。
#9 パーティショニングを実測する
shared_buffersやwork_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が改善した──そういった小さな「測れた」体験を積み重ねていくことが、性能劣化や本番障害に強いエンジニアへの近道だと思っています。
自身のことをまだまだ経験不足だと感じている方に、こちらの記事を実際に読んでもらって、手元のターミナルを開きながら記事を読み進めてもらえると嬉しいです。まずは、手を動かしていくことで、自身の技術力のステップアップに繋げてください。