진공 및 자동 진공의 목적 설명
행이 업데이트되면 각 업데이트는 삽입 및 삭제로 구성됩니다. 수정된 데이터가 삽입되고 이전 행이 삭제됩니다. PostgreSQL에서 문제가 있는 경우 트랜잭션이 롤백될 수 있도록 원래 행이 유지됩니다. 원래 행을 삭제하는 대신 나중에 삭제되도록 표시되어 디스크에 있지만 더 이상 필요하지 않은 “데드” 행(또는 튜플)이 생성됩니다.
적절하게 명명된 진공 프로세스는 이러한 행을 영구적으로 제거하여 손실될 수 있는 공간을 회수하고 통계를 업데이트합니다.
데드 행을 정리하는 프로세스를 진공 프로세스라고 합니다. 이러한 행이 디스크에 남아 있는 경우 데이터베이스는 필요한 디스크 공간을 더 많이 차지합니다(데이터베이스 “bloat”라고 함). VACUUM 프로세스는 다음과 같은 이유로 중요합니다.
- 삭제하도록 표시된 행이 차지하는 디스크 공간을 복구합니다.
- 쿼리 플래너에서 사용할 데이터 통계를 업데이트합니다.
- 인덱스 전용 검색 속도를 향상시키는 표시 유형 맵을 업데이트합니다.
- 트랜잭션 ID 랩어라운드로 인한 오래된 데이터 손실로부터 보호합니다.
PostgreSQL은 진공이라는 프로세스를 사용하여 행을 영구적으로 삭제하고 공간을 회수합니다. 공간을 회수하는 것 외에도 인덱스가 효과적인지 확인합니다.
진공 프로세스가 자동으로 트리거되면 프로세스를 자동 진공이라고 합니다. 프로세스를 실행해야 하는 빈도는 업데이트 및 삭제 작업의 양에 따라 달라집니다. 삭제로 표시된 행 수를 모니터링할 수도 있습니다.
진공 프로세스를 주기적으로 실행하면 다음을 수행하지 않습니다.
- 필요한 데이터베이스 및 테이블보다 큰 것을 포함하여 "bloat"를 경험합니다.
- 최적화되지 않은 큰 인덱스가 있습니다.
- I/O가 증가했습니다.
테이블의 “데드” 행 수를 모니터링하려면 SELECT 쿼리를 실행할 수 있습니다.
SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;
진공 프로세스를 수동으로 실행하려면 다음을 입력합니다.
vacuum