-
2025-11-10 PostgreSQLPostgreSQL バージョンアップ
PostgreSQLのバージョン間の性能差を検証(1)
本記事の概要
PostgreSQL のバージョン 15〜18 において、pgbench のベンチマークスクリプトを利用して性能を比較検証しました。
PostgreSQL のメジャーバージョンアップでは、クエリプランナや並列処理、ストレージ管理などに様々な改善が行われています。
そこで、一般的なベンチマークスクリプトである pgbench でどの程度の性能差が出るのかを確認した内容となります。
検証
検証は以下の環境で実施しました。
- RockyLinux 9.6
- PostgreSQL 15.14
- PostgreSQL 16.10
- PostgreSQL 17.6
- PostgreSQL 18.0
各バージョンとも、同一サーバ上でビルド・初期化を行い、同一設定で実施しています。
shared_buffers や work_mem などは、マシンスペックに合わせて一般的な目安とされている値に設定しました。
検証方法
pgbench のデフォルトスクリプトを用いて、以下の 2 パターンで性能を測定しました。
データサイズ = 約 650 MB でのテスト
テストに利用したコマンドは下記となります。
$ pgbench -i -s 50
$ pgbench -c 1 -j 1 -T 300
データサイズ = 約 6.5 GB でのテスト
テストに利用したコマンドは下記となります。
$ pgbench -i -s 500
$ pgbench -c 24 -j 12 -T 600
オプションの意味は
- -i は、データベースの初期化
- -s は、初期化するデータベースのスケール(サイズ、データ件数)
- -c は、テストの同時接続数
- -j は、テストのスレッド数
- -T は、テストの実行時間(秒)
となります。
「データサイズ = 約 650 MB でのテスト」では、1 接続(並列)で SQL 実行されています。
「データサイズ = 約 6.5 GB でのテスト」では、24 接続(並列)で SQL 実行されています。
「データサイズ = 約 650 MB でのテスト」の結果
「データサイズ = 約 650 MB でのテスト」の結果を、各バージョンごとに比較したものが下記となります。
| バージョン | count | tps | min | max | p95 | p99 |
|---|---|---|---|---|---|---|
| 15 | 131,702 回 | 439.029 t/s | 0.772 ms | 94.617 ms | 3.081 ms | 3.671 ms |
| 16 | 117,048 回 | 390.185 t/s | 0.825 ms | 123.628 ms | 3.114 ms | 3.685 ms |
| 17 | 124,010 回 | 413.392 t/s | 0.719 ms | 93.071 ms | 3.220 ms | 3.850 ms |
| 18 | 132,579 回 | 441.962 t/s | 0.711 ms | 123.412 ms | 3.058 ms | 3.703 ms |
各項目の説明は下記となります。
- count: 実行されたトランザクション数。
- tps: 1秒あたりに処理されたトランザクション数。数値が高いほど高性能です。
- min: 実行時間の最小値。最も短いトランザクション処理時間です。
- max: 実行時間の最大値。最も遅いトランザクション処理時間です。
- p95: 全トランザクションのうち 95% が、この時間以下で完了したことを表しています。
- p99: 全トランザクションのうち 99% が、この時間以下で完了したことを表しています。
「データサイズ = 約 6.5 GB でのテスト」の結果
「データサイズ = 約 6.5 GB でのテスト」の結果を、各バージョンごとに比較したものが下記となります。
| バージョン | count | TPS | min | max | p95 | p99 |
|---|---|---|---|---|---|---|
| 15 | 640,942 回 | 1,068.148 t/s | 3.213 ms | 326.528 ms | 35.488 ms | 45.360 ms |
| 16 | 640,286 回 | 1,067.007 t/s | 3.157 ms | 321.920 ms | 35.635 ms | 45.356 ms |
| 17 | 643,062 回 | 1,071.746 t/s | 2.718 ms | 357.700 ms | 35.415 ms | 45.279 ms |
| 18 | 645,866 回 | 1,076.410 t/s | 2.568 ms | 318.386 ms | 35.163 ms | 44.910 ms |
検証結果から確認できること
上記の通り、PostgreSQL 15 から 18 の間で大きな性能差は見られませんでした。
pgbench のテストスクリプトは比較的シンプルな SQL で構成されていますので、このような単純な処理であれば、バージョン間の性能差を特に気にする必要はないと考えられます。
※ pgbench のテストスクリプトの詳細は、公式ドキュメントを参照してください
【 PostgreSQL 17.5文書 - pgbench - 】
https://www.postgresql.jp/document/17/html/pgbench.html
また、pgbench に -N や -S オプションをつけることで、実行される SQL の傾向を変更できますが、その場合でも同じくバージョン間で特に大きな性能差は見られませんでした。
一方で、PostgreSQL はバージョンアップに伴い、並列処理やソート処理などの性能改善が行われています。
新機能を活用する SQL を実行している場合は、バージョンによる性能差が出る可能性があります。
また、パラメータ調整などによっても、異なる結果となる可能性がありますので、引き続き検証を続けていく予定です。
まとめ
今回の検証で、pgbench のテストスクリプトにおいて、PostgreSQL のバージョン間による大きな性能差は確認できませんでした。
PostgreSQL 15 から 18 のいずれのバージョンでも、極端な性能低下や向上はなく、安定したトランザクション処理性能を確認できました。
ただし、今回の検証は、pgbench のテストスクリプトを、インサイト社内での環境で実行した結果である点にご留意ください。
SQL の内容やパラメータ設定、サーバスペックなどによっては、今回の結果と異なる可能性があります。
そのため、実際に PostgreSQL をバージョンアップする際には、標準的なベンチマークだけでなく、実際の運用で使用されている SQL やワークロードを用いて性能検証を行うことが推奨となります。