Я поспіхував VACUUM
і помітив деяку несподівану поведінку, коли SELECT
інжини рядків із таблиці, здається, зменшують роботу VACUUM
після цього.
Дані тесту
Примітка: автовакуум вимкнено
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.
Що саме тут відбувається? Чому друга версія, яку я запускаю, після SELECT
вилучення мертвих кортежів зі сторінок, які вона відвідує, так само VACUUM
виглядає?
Я запускаю Postgres 11.3 на macOS 10.14.5.