私はいじくり回していて、テーブルから行をingすることで、後で行う必要のある作業が減るようVACUUMな予期しない動作に気づきました。SELECTVACUUM
テストデータ
注:自動バキュームは無効になっています
CREATE TABLE numbers (num bigint);
ALTER TABLE numbers SET (
  autovacuum_enabled = 'f',
  toast.autovacuum_enabled = 'f'
);
INSERT INTO numbers SELECT generate_series(1, 5000);試験1
次に、すべての行に対して更新を実行します。
UPDATE numbers SET num = 0;そして走るVACUUM (VERBOSE) numbers;と、
INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 5000 row versions in 23 pages
INFO:  "numbers": found 5000 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6585
There were 0 unused item pointers.試験2
次にUPDATE、別のを発行しますが、今回はSELECT後で追加します。
UPDATE numbers SET num = 1;
SELECT * FROM numbers;そして走るVACUUM (VERBOSE) numbers;と、
INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 56 row versions in 22 pages
INFO:  "numbers": found 56 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6586
There were 56 unused item pointers.ここで何が起こっているのですか?なぜ私が実行する2番目のバージョンは、SELECTアクセスするページから不要なタプルを削除した後、まったく同じようにVACUUM実行するのですか?
MacOS 10.14.5でPostgres 11.3を実行しています。