PostgreSQL

PostgreSQL: VACUUM index_cleanup 옵션과 REINDEX의 차이

dewstream 2025. 1. 17. 08:00

※ PostgreSQL: Difference Between VACUUM index_cleanup and REINDEX.

 

안녕하세요. 듀스트림입니다.

 

오늘의 주제는 VACUUM의 옵션인 index_cleanup과 REINDEX입니다.

 

두 기능의 목적과 특징 그리고 적합한 상황에 대해 살펴보도록 하겠습니다.


1. VACUUM의 index_cleanup 옵션

• 목적
- 테이블의 불필요한 공간(데드 튜플)을 정리하면서 인덱스도 함께 최적화합니다.
- 인덱스에서 사용되지 않는 엔트리를 제거하여 검색 성능을 유지합니다.

 

동작 방식
- index_cleanup: VACUUM 작업 중 인덱스 클린업 수행 여부를 설정하는 옵션입니다.
- index_cleanup = auto: PostgreSQL이 자동으로 판단하여 클린업 수행 여부를 결정. (Default)
- index_cleanup = on: 모든 인덱스에서 클린업 수행.
- index_cleanup = off: 인덱스 클린업을 건너뜀(데드 튜플 제거는 수행).

 

특징
- 테이블의 쓰레기 데이터(데드 튜플)를 정리하면서, 해당 인덱스에서 불필요한 엔트리도 제거합니다.
- 전체 인덱스를 재구성하지 않음.
- 비교적 빠르고, 작업 중에도 테이블과 인덱스는 사용 가능.

 

적합한 상황

- 테이블과 인덱스를 정상적으로 유지하며, 큰 부하를 주지 않고 정기적인 정리를 수행하고 싶을 때.
- 데이터 삽입/삭제가 빈번히 발생하여 데드 튜플이 자주 쌓이는 테이블.

 

+ Autovacuum은 기본적으로 인덱스 클린업까지 수행합니다.


2. REINDEX

• 목적

- 손상되었거나 비효율적으로 커진 인덱스를 완전히 재구성합니다.
- 테이블의 기존 인덱스를 삭제하고, 새로 생성하여 최적화.

 

동작 방식
- 기존 인덱스를 삭제하고 동일한 설정으로 새로 생성.
- 인덱스에 포함된 데이터만 새로 정리되며, 테이블 자체는 변경되지 않음.

 

특징
- 전체 인덱스를 새로 생성하기 때문에, 기존 인덱스의 비효율적 구조를 완전히 해결.
- 테이블 크기가 크거나 인덱스가 복잡할수록 시간이 오래 걸릴 수 있음.
- REINDEX 중에는 테이블에 락이 걸려, 해당 인덱스를 사용하는 작업이 일시적으로 중단될 수 있음.

 

적합한 상황
- 인덱스가 손상되었거나 비효율적으로 조각화된 경우.
- 인덱스 크기가 비정상적으로 커져 공간과 성능 문제가 발생한 경우.
- 테이블이 아닌 특정 인덱스만 문제를 해결하고자 할 때.

 

• 주의 사항

- 특정 인덱스에 문제가 발생하거나, 불필요하게 커진 경우에만 수행하는 것이 효율적입니다.
- 큰 테이블의 경우 서비스에 영향을 줄 수 있으니 유지보수 시간에 수행하는 것이 좋습니다.


주요 차이점 요약

구분 VACUUM index_cleanup REINDEX
목적 불필요한 인덱스 엔트리 제거 인덱스를 완전히 재구성
동작 범위 데드 튜플 제거 및 인덱스 정리 인덱스를 삭제하고 새로 생성
수행 시간 상대적으로 빠름 상대적으로 오래 걸릴 수 있음
테이블 락 가벼운 락(병렬 작업 가능) 작업 중 테이블 및 인덱스 락 발생
적합한 환경 주기적 관리로 성능 유지 손상된 인덱스 복구 및 최적화

3. 사용 구문 예시

▸ VACUUM index_cleanup

# 특정 테이블에 대해 실행
VACUUM (index_cleanup ON) table_name;

 

▸ REINDEX

-- 특정 인덱스 재구성
REINDEX INDEX index_name;
-- 특정 테이블의 모든 인덱스 재구성
REINDEX TABLE table_name;
-- 전체 데이터베이스의 모든 인덱스 재구성
REINDEX DATABASE database_name;

오늘은 여기까지~

다음 포스팅에서 뵙겠습니다 :)