PostgreSQL VACUUM의 페이지 수준 내부 동작: 바이트 단위 분석
Vacuum at the Page Level

PostgreSQL의 VACUUM이 실제로 페이지에서 무엇을 하는지 궁금한 적이 있나요? 이 글은 pageinspect, pg_visibility, pg_freespacemap을 사용하여 VACUUM의 각 단계 전후 페이지 헤더, 라인 포인터, 튜플 헤더의 변화를 추적합니다. 인덱스가 있는 테이블에서 VACUUM이 3단계(힙 스캔, 인덱스 정리, 힙 정리)로 나뉘어 진행되며, 삭제된 튜플의 저장 공간은 첫 번째 단계에서 회수되지만 라인 포인터는 인덱스 정리가 끝날 때까지 LP_DEAD 상태로 유지된다는 점을 보여줍니다. PostgreSQL 17의 radix tree 기반 TID 저장소와 인덱스 없는 테이블의 차이도 설명합니다.
프루닝은 삭제된 튜플의 라인 포인터를 LP_UNUSED로 표시할 수 없습니다. 인덱스가 여전히 TID로 그 튜플을 가리키기 때문입니다.