Dead Tuple

2025. 2. 16. 01:43Database/PostgreSQL

PostgreSQL의 Dead Tuple과 성능 영향 분석


1. Dead Tuple이란?

  • Dead Tuple : PostgreSQL에서 삭제(DELETE)되거나 업데이트(UPDATE)된 레코드가 물리적으로 삭제되지 않고 그대로 남아 있는 데이터
  • PostgreSQL은 MVCC(Multi-Version Concurrency Control)를 사용하기 때문에 업데이트가 발생하면 기존 데이터를 즉시 삭제하는 것이 아니라 새로운 버전을 생성하며, 이전 버전은 Dead Tuple로 남음

Dead Tuple 생성 과정 예시

-- 기존 데이터 삽입
INSERT INTO users (id, name) VALUES (1, 'Alice');

-- 데이터 업데이트 (기존 데이터를 삭제하고 새로운 데이터 삽입)
UPDATE users SET name = 'Bob' WHERE id = 1;

위와 같은 UPDATE 실행 시

  1. Alice가 포함된 기존 행은 Dead Tuple이 됨
  2. Bob이라는 새로운 행이 삽입됨
  3. 기존 Dead Tuple은 VACUUM 실행 전까지 계속 테이블에 남아 있음

2. Dead Tuple이 많은 경우 발생하는 문제

문제점 영향
불필요한 디스크 사용 증가 테이블 크기가 실제 데이터보다 커짐
쿼리 성능 저하 불필요한 Dead Tuple로 인해 Seq ScanIndex Scan이 느려짐
인덱스 비효율 Dead Tuple이 많은 경우, 인덱스 크기가 커지고 검색 속도 저하됨
AutoVacuum 부하 증가 Dead Tuple이 많아지면 AutoVacuum 프로세스가 과부하 상태가 될 수 있음

3. Dead Tuple 제거 방법

1) VACUUM 실행하여 Dead Tuple 제거

VACUUM ANALYZE users;
  • VACUUM: Dead Tuple을 정리하여 디스크 공간 확보
  • ANALYZE: 테이블 통계를 갱신하여 쿼리 최적화
  • 실행 후 PostgreSQL이 최신 데이터를 더 빠르게 검색할 수 있도록 도와줌

2) AUTOVACUUM 설정 최적화

PostgreSQL에서는 AutoVacuum이 자동으로 Dead Tuple을 정리하지만, 트래픽이 많을 경우 수동 튜닝이 필요할 수 있음

SHOW autovacuum;
SHOW autovacuum_vacuum_threshold;

기본값이 적절한지 확인 후, 필요한 경우 postgresql.conf에서 조정 가능

autovacuum_vacuum_threshold = 50  # Dead Tuple이 50개 이상이면 VACUUM 실행
autovacuum_vacuum_scale_factor = 0.1  # 테이블의 10% 이상이 변경되면 VACUUM 실행

3) VACUUM FULL로 강제 공간 회수

VACUUM FULL users;

VACUUM FULLDead Tuple이 많은 경우 강제로 공간을 회수하지만, 테이블을 잠그기 때문에 주의 필요

4) REINDEX로 인덱스 최적화

Dead Tuple은 인덱스에서도 발생할 수 있음. 인덱스 최적화를 위해 다음 명령어 실행

REINDEX TABLE users;

이 명령어는 인덱스를 재구성하여 불필요한 공간 사용을 줄이고 성능을 최적화


4. Dead Tuple이 많은 경우 확인하는 방법

다음 쿼리로 특정 테이블의 Dead Tuple 상태를 확인할 수 있음

SELECT relname, n_live_tup, n_dead_tup
FROM pg_stat_user_tables
WHERE relname = 'users';

출력

테이블명 활성 튜플 Dead Tuple
users 36 12

Dead Tuple이 많을 경우 VACUUM ANALYZE 또는 VACUUM FULL 실행 필요


5. 결론

  • Dead Tuple이 많으면 테이블과 인덱스 크기가 증가하여 성능 저하
  • AutoVacuum을 적절히 튜닝하고, 필요 시 VACUUM ANALYZE, VACUUM FULL, REINDEX를 실행하여 최적화해야 함
  • Dead Tuple을 관리하면 PostgreSQL의 검색 속도를 높이고, 전체적인 데이터베이스 성능을 향상할 수 있음