PostgreSQL
PostgreSQL10

はじめに

にゃーん
この記事は、PostgreSQL 10全部ぬこ Advent Calendar 2017 の21日目のエントリです。
今日も小ネタですいませんです。

今回のお題

PostgreSQLといえばVACUUM! だった時代は遠くに去りにけり。特殊なワークロードでもない限り、最近は自動VACUUMがよろしくやってくれるので、VACUUMを以前ほど意識して運用することは少ないかもしれない。
とはいえ、現状の追記方式をPostgreSQLが使っている限り、裏ではVACUUMが動いているわけで、未だに重要な機構の一つではある。
なので、VACUUMについてもやっぱり改善がされている。

PostgreSQL 10ではざっくり、以下の2つの改善項目がある。

  • VACUUM VERBOSEの表示内容改善
  • 末端のタプルが削除されたときの性能改善

これらの改善について、ちょこっと試してみた。

おためし方法

以下の操作を、PostgereSQL 9.6とPostgreSQL 10で実施する。

  • pgbench_accounts(scale = 30)のテーブルをpgbenchを使ってロードする。
  • pgbench_accountsに対して、一旦VACUUM FREEZEをかける。
  • pgbench_accountsの末端30%のタプルをDELETEする。
  • ALTER TABLEでpgbench_accountsのprimary key制約を除去する。
  • この状態で、VACUUM VERBOSEを実施する。

スクリプト自体はこんな感じ。

$ cat vacuum.sql 
\timing
SET log_min_duration_statement = 0;
VACUUM FREEZE VERBOSE pgbench_accounts;
DELETE FROM pgbench_accounts WHERE aid > 270000;
ALTER TABLE pgbench_accounts DROP CONSTRAINT pgbench_accounts_pkey ;
CHECKPOINT;
SELECT pg_relation_size('pgbench_accounts');
SET maintenance_work_mem = '256MB';
VACUUM VERBOSE pgbench_accounts;
SELECT pg_relation_size('pgbench_accounts');
TRUNCATE pgbench_accounts;

これで表示内容の改善と性能改善結果を確認してみる。

VACUUM VERBOSEの表示内容改善

  • PostgreSQL 9.6

うー、無駄に長い。

VACUUM VERBOSE pgbench_accounts;
psql:vacuum.sql:9: INFO:  vacuuming "public.pgbench_accounts"
psql:vacuum.sql:9: INFO:  "pgbench_accounts": removed 2730000 row versions in 44755 pages
psql:vacuum.sql:9: INFO:  "pgbench_accounts": found 2730000 removable, 14 nonremovable row versions in 44755 out of 49181 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins.
0 pages are entirely empty.
CPU 0.23s/0.41u sec elapsed 0.66 sec.
LOG:  duration: 1727.164 ms  statement: VACUUM VERBOSE pgbench_accounts;
psql:vacuum.sql:9: INFO:  "pgbench_accounts": truncated 49181 to 4427 pages
DETAIL:  CPU 0.20s/0.00u sec elapsed 1.04 sec
VACUUM
Time: 1727.355 ms
  • PostgreSQL 10
VACUUM VERBOSE pgbench_accounts;
psql:vacuum.sql:9: INFO:  vacuuming "public.pgbench_accounts"
psql:vacuum.sql:9: INFO:  "pgbench_accounts": removed 2730000 row versions in 44755 pages
psql:vacuum.sql:9: INFO:  "pgbench_accounts": found 2730000 removable, 14 nonremovable row versions in 44755 out of 49181 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 1288948
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 4426 frozen pages.
0 pages are entirely empty.
CPU: user: 0.24 s, system: 0.18 s, elapsed: 0.44 s.
psql:vacuum.sql:9: INFO:  "pgbench_accounts": truncated 49181 to 4427 pages
DETAIL:  CPU: user: 0.03 s, system: 0.17 s, elapsed: 0.86 s
VACUUM
Time: 1323.373 ms (00:01.323)

PostgreSQL 10では

  • 4426 frozen pages.
  • oldest xmin: 1288948

という情報が追加されている。

末端のタプルが削除されたときの性能改善

今回測定したケースだと、若干、PostgreSQL 10のほうが良いケースも見られたが、思ったよりも測定結果のブレが大きく、この検証結果だけでは、PostgreSQL 10のほうが性能的に有意な結果は得られなかった。残念。

おわりに

  • 今でもVACUUMの改善は続いているのだなあと。

参考:該当するリリースノート

本エントリに関連するPostgreSQL 10リリースノートの記載です。

E.2.3.4. Utility Commands

  • Make VACUUM VERBOSE report the number of skipped frozen pages and oldest xmin (Masahiko Sawada, Simon Riggs)
  • Improve speed of VACUUM's removal of trailing empty heap pages (Claudio Freire, Álvaro Herrera)