Dead Tuple
2025. 2. 16. 01:43ㆍDatabase/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
실행 시
Alice
가 포함된 기존 행은 Dead Tuple이 됨Bob
이라는 새로운 행이 삽입됨- 기존 Dead Tuple은 VACUUM 실행 전까지 계속 테이블에 남아 있음
2. Dead Tuple이 많은 경우 발생하는 문제
문제점 | 영향 |
---|---|
불필요한 디스크 사용 증가 | 테이블 크기가 실제 데이터보다 커짐 |
쿼리 성능 저하 | 불필요한 Dead Tuple로 인해 Seq Scan 및 Index 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 FULL
은 Dead 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의 검색 속도를 높이고, 전체적인 데이터베이스 성능을 향상할 수 있음
'Database > PostgreSQL' 카테고리의 다른 글
PostgreSQL 복합 인덱스(Composite Index) 완벽 가이드 (0) | 2025.02.16 |
---|---|
PostgreSQL 조인 알고리즘 비교: 해시 조인(Hash Join), 중첩 루프 조인(Nested Loop Join), 병합 조인(Merge Join) (0) | 2025.02.16 |
PostgreSQL 성능 튜닝: ANALYZE vs EXPLAIN ANALYZE 차이점과 활용법 (0) | 2025.02.16 |
VACUUM 간단 정리 (0) | 2025.02.16 |