ฉันเล่นซอVACUUM
และสังเกตเห็นพฤติกรรมที่ไม่คาดคิดบางอย่างที่SELECT
ไอเอ็นจีแถวจากตารางดูเหมือนว่าจะลดงานที่VACUUM
ต้องทำหลังจากนั้น
ทดสอบข้อมูล
หมายเหตุ: autovacuum ถูกปิดใช้งาน
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
ลบ tuples ตายจากหน้าเว็บที่เข้าชมค่อนข้างชอบVACUUM
ไม่?
ฉันใช้งาน Postgres 11.3 บน macOS 10.14.5