-
2025-03-10 PostgreSQLPostgreSQL バージョンアップ
VACUUM速度の比較(v15とv16)
本記事の概要
前回に引き続き、今回も VACUUM の処理速度を検証した結果を記載します。前回は v16 と v17 の比較でしたが、今回は v15 と v16 の比較検証となります。
v15 から v16 のバージョンアップで、どの程度 VACUUM の実行速度が向上したかを確認することで、v16 から v17 のバージョンアップでの性能向上の度合いを確認したいというのが主旨となります。
PostgreSQL 16 で行われた VACUUM の改善
PostgreSQL 15 から 16 のバージョンアップ時に、不要な凍結処理が行われなくなるなど効率的に VACUUM 処理されるようになりました。また、VACUUM 関連のパラメータやオプションが追加されているなどの機能アップも行われています。
実際に検証
では、実際に PostgreSQL 15 と 16 で、VACUUM を行い、その実行速度を確認してみます。
検証に利用した環境
検証に利用した環境は下記となります。
- RockyLinux 9.3
- PostgreSQL 15.10
- PostgreSQL 16.6
VACUUM の速度比較
pgbench のデータを利用して、VACUUM の実行速度を比較しました。
(前回と同様ですが)検証の手順を下記に記載します。
- pgbench の初期化(pgbench -i)
- 以下の 2 手順を 3 回繰り返す
- pgbench_accounts テーブルに対して更新
- pgbench_accounts テーブルに対して VACUUM(←この時間を計測
上記の検証を行った結果をまとめたものを下記に記載します。
PostgreSQL 15 と 16 の VACUUM 実行時間の比較(平均)
VACUUM を 3 回 行い、その 3 回の実行時間の平均をまとめたものが下記となります。
(パターン数が多いので表が長いです)
No | テーブルサイズ | maintenance_work_mem | 廃止行の割合 | v15の実行時間(平均) | v16の実行時間(平均) | v15との差 | v15との比率 |
---|---|---|---|---|---|---|---|
1 | 128MB | 100MB | 3 % | 426.39 ms | 390.93 ms | -35.46 ms | 91.68 % |
2 | 128MB | 100MB | 20 % | 577.54 ms | 577.25 ms | -0.29 ms | 99.95 % |
3 | 128MB | 100MB | 50 % | 1,295.72 ms | 920.76 ms | -374.97 ms | 71.06 % |
4 | 128MB | 100MB | 70 % | 1,635.74 ms | 1,391.13 ms | -244.60 ms | 85.05 % |
5 | 128MB | 1GB | 3 % | 403.05 ms | 300.69 ms | -102.36 ms | 74.60 % |
6 | 128MB | 1GB | 20 % | 520.27 ms | 514.78 ms | -5.49 ms | 98.94 % |
7 | 128MB | 1GB | 50 % | 942.99 ms | 896.07 ms | -46.92 ms | 95.02 % |
8 | 128MB | 1GB | 70 % | 1,505.30 ms | 1,198.84 ms | -306.46 ms | 79.64 % |
9 | 128MB | 2GB | 3 % | 435.44 ms | 366.10 ms | -69.34 ms | 84.08 % |
10 | 128MB | 2GB | 20 % | 591.52 ms | 508.27 ms | -83.25 ms | 85.93 % |
11 | 128MB | 2GB | 50 % | 960.38 ms | 846.66 ms | -113.72 ms | 88.16 % |
12 | 128MB | 2GB | 70 % | 1,100.91 ms | 948.73 ms | -152.18 ms | 86.18 % |
13 | 1.2GB | 100MB | 3 % | 1,202.68 ms | 1,255.49 ms | 52.81 ms | 104.39 % |
14 | 1.2GB | 100MB | 20 % | 1,898.52 ms | 1,899.89 ms | 1.37 ms | 100.07 % |
15 | 1.2GB | 100MB | 50 % | 4,318.47 ms | 3,672.44 ms | -646.03 ms | 85.04 % |
16 | 1.2GB | 100MB | 70 % | 7,279.29 ms | 6,105.10 ms | -1,174.19 ms | 83.87 % |
17 | 1.2GB | 1GB | 3 % | 1,302.64 ms | 1,466.26 ms | 163.61 ms | 112.56 % |
18 | 1.2GB | 1GB | 20 % | 1,988.87 ms | 2,172.92 ms | 184.05 ms | 109.25 % |
19 | 1.2GB | 1GB | 50 % | 4,723.81 ms | 3,644.15 ms | -1,079.66 ms | 77.14 % |
20 | 1.2GB | 1GB | 70 % | 7,234.14 ms | 6,436.27 ms | -797.87 ms | 88.97 % |
21 | 1.2GB | 2GB | 3 % | 1,431.84 ms | 1,451.44 ms | 19.60 ms | 101.37 % |
22 | 1.2GB | 2GB | 20 % | 2,303.80 ms | 1,829.87 ms | -473.93 ms | 79.43 % |
23 | 1.2GB | 2GB | 50 % | 4,137.97 ms | 4,157.50 ms | 19.54 ms | 100.47 % |
24 | 1.2GB | 2GB | 70 % | 7,420.57 ms | 6,188.14 ms | -1,232.43 ms | 83.39 % |
25 | 6.4GB | 100MB | 3 % | 1,637.85 ms | 1,781.20 ms | 143.35 ms | 108.75 % |
26 | 6.4GB | 100MB | 20 % | 5,902.86 ms | 5,146.64 ms | -756.22 ms | 87.19 % |
27 | 6.4GB | 100MB | 50 % | 20,688.82 ms | 18,773.99 ms | -1,914.83 ms | 90.74 % |
28 | 6.4GB | 100MB | 70 % | 120,672.18 ms | 95,888.70 ms | -24,783.48 ms | 79.46 % |
29 | 6.4GB | 1GB | 3 % | 2,799.80 ms | 3,011.47 ms | 211.66 ms | 107.56 % |
30 | 6.4GB | 1GB | 20 % | 7,640.71 ms | 7,101.87 ms | -538.84 ms | 92.95 % |
31 | 6.4GB | 1GB | 50 % | 18,829.81 ms | 16,404.66 ms | -2,425.15 ms | 87.12 % |
32 | 6.4GB | 1GB | 70 % | 109,957.23 ms | 88,320.60 ms | -21,636.63 ms | 80.32 % |
33 | 6.4GB | 2GB | 3 % | 3,356.35 ms | 2,938.97 ms | -417.38 ms | 87.56 % |
34 | 6.4GB | 2GB | 20 % | 7,775.93 ms | 6,806.48 ms | -969.45 ms | 87.53 % |
35 | 6.4GB | 2GB | 50 % | 20,143.55 ms | 16,694.91 ms | -3,448.64 ms | 82.88 % |
36 | 6.4GB | 2GB | 70 % | 117,707.80 ms | 88,428.00 ms | -29,279.80 ms | 75.13 % |
PostgreSQL 15 と 16 の VACUUM 実行時間の比較(最小)
VACUUM を 3 回 行い、最小となった実行時間をまとめたものが下記となります。
(パターン数が多いので表が長いです)
No | テーブルサイズ | maintenance_work_mem | 廃止行の割合 | v15の実行時間(最小) | v16の実行時間(最小) | v15との差 | v15との比率 |
---|---|---|---|---|---|---|---|
1 | 128MB | 100MB | 3 % | 392.84 ms | 345.03 ms | -47.81 ms | 87.83 % |
2 | 128MB | 100MB | 20 % | 538.32 ms | 550.83 ms | 12.52 ms | 102.33 % |
3 | 128MB | 100MB | 50 % | 1,079.38 ms | 811.89 ms | -267.50 ms | 75.22 % |
4 | 128MB | 100MB | 70 % | 1,531.56 ms | 1,242.48 ms | -289.08 ms | 81.13 % |
5 | 128MB | 1GB | 3 % | 389.58 ms | 275.71 ms | -113.87 ms | 70.77 % |
6 | 128MB | 1GB | 20 % | 441.88 ms | 425.07 ms | -16.81 ms | 96.20 % |
7 | 128MB | 1GB | 50 % | 867.40 ms | 841.99 ms | -25.41 ms | 97.07 % |
8 | 128MB | 1GB | 70 % | 1,306.41 ms | 999.68 ms | -306.73 ms | 76.52 % |
9 | 128MB | 2GB | 3 % | 405.52 ms | 331.10 ms | -74.42 ms | 81.65 % |
10 | 128MB | 2GB | 20 % | 575.45 ms | 495.26 ms | -80.19 ms | 86.06 % |
11 | 128MB | 2GB | 50 % | 783.91 ms | 784.74 ms | 0.82 ms | 100.10 % |
12 | 128MB | 2GB | 70 % | 1,081.30 ms | 912.72 ms | -168.59 ms | 84.41 % |
13 | 1.2GB | 100MB | 3 % | 1,161.58 ms | 968.59 ms | -192.99 ms | 83.39 % |
14 | 1.2GB | 100MB | 20 % | 1,636.36 ms | 1,540.69 ms | -95.67 ms | 94.15 % |
15 | 1.2GB | 100MB | 50 % | 3,890.38 ms | 3,416.94 ms | -473.44 ms | 87.83 % |
16 | 1.2GB | 100MB | 70 % | 6,770.60 ms | 5,577.01 ms | -1,193.60 ms | 82.37 % |
17 | 1.2GB | 1GB | 3 % | 995.68 ms | 970.80 ms | -24.88 ms | 97.50 % |
18 | 1.2GB | 1GB | 20 % | 1,774.37 ms | 1,946.36 ms | 171.99 ms | 109.69 % |
19 | 1.2GB | 1GB | 50 % | 4,571.87 ms | 3,545.97 ms | -1,025.90 ms | 77.56 % |
20 | 1.2GB | 1GB | 70 % | 6,950.32 ms | 6,209.32 ms | -741.00 ms | 89.34 % |
21 | 1.2GB | 2GB | 3 % | 1,013.39 ms | 1,017.17 ms | 3.79 ms | 100.37 % |
22 | 1.2GB | 2GB | 20 % | 2,044.81 ms | 1,600.13 ms | -444.68 ms | 78.25 % |
23 | 1.2GB | 2GB | 50 % | 3,621.74 ms | 3,997.26 ms | 375.52 ms | 110.37 % |
24 | 1.2GB | 2GB | 70 % | 6,773.94 ms | 5,632.03 ms | -1,141.91 ms | 83.14 % |
25 | 6.4GB | 100MB | 3 % | 733.72 ms | 750.96 ms | 17.24 ms | 102.35 % |
26 | 6.4GB | 100MB | 20 % | 5,643.11 ms | 4,880.01 ms | -763.10 ms | 86.48 % |
27 | 6.4GB | 100MB | 50 % | 20,038.02 ms | 17,287.59 ms | -2,750.43 ms | 86.27 % |
28 | 6.4GB | 100MB | 70 % | 101,675.48 ms | 88,237.58 ms | -13,437.90 ms | 86.78 % |
29 | 6.4GB | 1GB | 3 % | 1,847.27 ms | 2,003.05 ms | 155.77 ms | 108.43 % |
30 | 6.4GB | 1GB | 20 % | 6,971.21 ms | 6,735.83 ms | -235.39 ms | 96.62 % |
31 | 6.4GB | 1GB | 50 % | 17,553.07 ms | 15,545.11 ms | -2,007.96 ms | 88.56 % |
32 | 6.4GB | 1GB | 70 % | 102,810.39 ms | 79,510.03 ms | -23,300.36 ms | 77.34 % |
33 | 6.4GB | 2GB | 3 % | 1,996.73 ms | 1,958.47 ms | -38.25 ms | 98.08 % |
34 | 6.4GB | 2GB | 20 % | 7,225.07 ms | 6,522.35 ms | -702.73 ms | 90.27 % |
35 | 6.4GB | 2GB | 50 % | 19,050.56 ms | 16,282.01 ms | -2,768.55 ms | 85.47 % |
36 | 6.4GB | 2GB | 70 % | 109,977.49 ms | 78,676.40 ms | -31,301.09 ms | 71.54 % |
「v15との差」には「PostgreSQL 16 の実行時間 - PostgreSQL 15 の実行時間」したものを記載しています。数値が小さいほど、PostgreSQL 16 の方が高速化に実行されたことを表しています。
「v15との比率」には「PostgreSQL 16 の実行時間 / PostgreSQL 15 の実行時間」したものを記載しています。数値が小さいほど、PostgreSQL 16 の方が高速化に実行されたことを表しています。
結果から分かること
上記の結果より、基本的には PostgreSQL 16 の方が高速に実行されていることを確認できます。
ただ、いくつかの条件で PostgreSQL 15 の方が高速になっている場合もあります(No.18、No.25 など)。
「テーブルサイズが 1 GB を超えている」「廃止行の割合が少ない」場合には、PostgreSQL 16 でも v15 とあまり実行速度が変わらない傾向にあるようです。
PostgreSQL 16 の方が高速に行われるのは、「廃止行の割合が多い」場合のようです。
処理されるデータ量が多い場合に高速化されているということは、バージョンアップの恩恵が分かりやすく実感できる部分ではないかと思います。
まとめ
v15 → v16 では、高速になっている場合でも 70 % 前後の実行速度でしたが、v16 → v17 では 40 % 未満での実行速度となっている場合もありました。
このことから、v16 から v17 のバージョンアップにおける VACUUM 実行速度の向上は、通常のバージョンアップ時をはるかに超えるものであることを確認できました。