PostgreSQL - 베큠 `Vacuum` 간단한 소개

베큠 Vacuum 에 대한 간단한 소개

Vacuum 사전적 정의

1
2
3
4
5
 Vacuum

1. 진공
2. 공백
3. 진공청소기를 이용한 청소

네이버 국어 사전을 참고하면 Vacuum의 뜻은 위와 같습니다. PostgreSQL에서의 Vacuum은 저장공간에 불필요하게 남은 데드 튜플(tuple)을 정리하는 것을 뜻 합니다.


Vacuum을 왜 진행하는지

VACUUM은 데드 튜플(tuple)이 차지하는 스토리지를 회수합니다. 일반적인 PostgreSQL 작업에서 업데이트에 의해 삭제되거나 폐기 된 튜플은 테이블에서 물리적으로 제거되지 않습니다.
다시 말해서 PostgreSQL에서는 삭제나 수정을 해도 저장공간에서 사라지는 것이 아니라 데드 튜플이라는 형태로 남아 있게 됩니다.

데드 튜플(tuple)

만약 아래와 같은 테이블이 있다고 가정한 후에 데드 튜플이 어떻게 생겨나는지 알아 본다면.

예시 테이블.

Modify : 나나의 이름을 가가로 변경
여기에서 주의해야 하는 점은 변경하면 2번째 줄에 있는 나나의 이름이 변경되는 것이 아니라 기존 2번째 줄에 있는 나나는 데드 튜플로 변경된 후에 새로운 가가로 추가된다.
데드 튜플을 회색으로 표현하였다.

수정된 테이블.

Delete : 3번 아름행 삭제
행을(row) 삭제할 때에도 데드 튜플이 생성됩니다.

삭제된 테이블.

Insert : 철수 삽입된다면?
위의 테이블에 인서트 문을 실행할 경우 우선적으로 데드 튜플에 삽입 됩니다.

Insert문으로 데드튜플이 사라진 것을 확인 할 수 있다.

그래도 아름이 행은 불필요하게 존재하고 있는데 이를 삭제하고 저장공간을 확보하는 것이 Vacuum 입니다.
위와 같은 이유로 특히 자주 업데이트되는 테이블에서 정기적으로 VACUUM 을 수행해야 합니다.

Vacuum 실행문

1
2
3
4
5
6
7
8
9
10
11
12
13
// DB 전체 풀 실행
//주의: full 옵션으로 실행 시 데이터베이스가 잠김(Lock)처리가 되므로 운영중인 데이터베이스에서는 해당 옵션으로 사용하지 마세요.
vacuum full analyze;

// DB 전체 간단하게 실행
vacuum verbose analyze;

// 해당 테이블만 간단하게 실행
vacuum analyse [테이블 명];

// 특정 테이블만 풀 실행
//주의: full 옵션으로 실행 시 데이터베이스가 잠김(Lock)처리가 되므로 운영중인 데이터베이스에서는 해당 옵션으로 사용하지 마세요.
vacuum full [테이블명];

위와 같이 매개 변수가 없으면 VACUUM 은 현재 사용자에게 vacuum 권한이있는 현재 데이터베이스의 모든 테이블을 처리합니다. 매개 변수를 사용하면 VACUUM 은 해당 테이블만 처리합니다.

추가 노트

사용 불능 행을 제거하려면 활성 프로덕션 데이터베이스를 자주 (적어도 밤마다) 비우기하는 것이 좋습니다. 많은 수의 행을 추가하거나 삭제 한 후 영향을받는 테이블에 대해 VACUUM ANALYZE 명령을 실행 하는 것이 좋습니다 . 이렇게하면 최근의 모든 변경 결과로 시스템 카탈로그가 업데이트되고 PostgreSQL 쿼리 플래너가 쿼리 계획에서 더 나은 선택을 할 수 있습니다.

FULL 옵션은 일상적인 사용하지 않는 것이 좋습니다,하지만 특별한 경우에 유용 할 수 있습니다. 예를 들어 테이블에있는 대부분의 행을 삭제하거나 업데이트하고 테이블을 물리적으로 축소하여 디스크 공간을 덜 차지하고 테이블 스캔 속도를 높이려는 경우가 있습니다. VACUUM FULL 은 일반적으로 일반 VACUUM 보다 테이블을 더 축소합니다 .

VACUUM 은 I / O 트래픽을 상당히 증가시켜 다른 활성 세션의 성능을 저하시킬 수 있습니다. 따라서 비용 기반 진공 지연 기능을 사용하는 것이 좋습니다. 자세한 내용은 Cost-based Vacuum Delay를 참조하십시오.

Reference
Share