Tôi đã loay hoay VACUUMvà nhận thấy một số hành vi bất ngờ trong đó SELECTcác hàng ing từ một bảng dường như làm giảm công việc VACUUMphả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 SELECTsau,
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 SELECTxóa bộ dữ liệu chết khỏi các trang mà nó truy cập, khá giống như VACUUMvậy?
Tôi đang chạy Postgres 11.3 trên macOS 10.14.5.