Tôi đã loay hoay VACUUM
và nhận thấy một số hành vi bất ngờ trong đó SELECT
các hàng ing từ một bảng dường như làm giảm công việc VACUUM
phải làm sau đó.
Kiểm tra dữ liệu
Lưu ý: autovacuum bị vô hiệu hóa
CREATE TABLE numbers (num bigint);
ALTER TABLE numbers SET (
autovacuum_enabled = 'f',
toast.autovacuum_enabled = 'f'
);
INSERT INTO numbers SELECT generate_series(1, 5000);
Thử nghiệm 1
Bây giờ chúng tôi chạy một bản cập nhật trên tất cả các hàng,
UPDATE numbers SET num = 0;
Và khi chúng tôi chạy, VACUUM (VERBOSE) numbers;
chúng tôi nhận được,
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.
Phiên tòa 2
Bây giờ chúng tôi phát hành một cái khác UPDATE
, nhưng lần này chúng tôi thêm một lần SELECT
sau,
UPDATE numbers SET num = 1;
SELECT * FROM numbers;
Và khi chúng tôi chạy, VACUUM (VERBOSE) numbers;
chúng tôi nhận được,
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.
Chính xác thì chuyện gì đang xảy ra ở đây? Tại sao phiên bản thứ hai tôi chạy, sau khi SELECT
xóa bộ dữ liệu chết khỏi các trang mà nó truy cập, khá giống như VACUUM
vậy?
Tôi đang chạy Postgres 11.3 trên macOS 10.14.5.