사용자 도구

사이트 도구


postgresql:vacuum

VACUUM

Introduction

PostgreSQL만의 특성 때문에 Table정리가 필요하다.

Vacuum은 PostgreSQL의 MVCC 구현 방법이 Oracle이나 MySQL 등 다른 DBMS와 다르고 그 차이로 인해 발생하는 문제점을 해결하기 위한 PostgreSQL만의 특별한 동작인데요.

Vacuum을 DB단에서 자동으로 수행하는 동작을 AutoVacuum이라고 하며 Vacuum & AutoVacuum(이하 Vacuum으로 통일)을 통해 아래 4가지 작업을 수행합니다.

  • 임계치 이상으로 발생한 Dead Tuple을 정리하여 FSM (Free Space Map) 으로 반환
  • Transaction ID Wraparound 방지
  • 통계정보 갱신
  • visibility map을 갱신하여 index scan 성능 향상

위 4개의 동작 모두 중요하지만 그 중 특히 중요한 것은 Dead Tuple을 정리하는 동작과 Trasaction ID Wraparound 방지 동작입니다.

Vacuum의 개념과 위 두 동작의 의미, 그리고 운영 방법에 대해 아래의 목차 순서대로 살펴보겠습니다.

  • MVCC란?
  • Vacuum은 왜 필요할까?
  • AutoVacuum은 언제 호출될까?
  • Vacuum 파라미터는 어떻게 튜닝할까?
  • Vacuum이 실패하고 있다면?
SELECT relname, n_live_tup, n_dead_tup,
       CASE WHEN n_live_tup > 0 THEN n_dead_tup / (n_live_tup::FLOAT) ELSE 0 END AS ratio
  FROM pg_stat_user_tables
 ORDER BY relname;
 
SELECT relname, n_live_tup, n_Dead_tup
  FROM pg_stat_user_tables;

MVCC(Multi-Version Concurrency Control)란?

Database를 많이 접하고 있지만 db 깊은 영역이라는 생각에 자세히 보려고 하지않았습니다.

Vacuum은 PostgreSQL MVCC의 독특한 구현 방식 덕분에 탄생한 개념이기 때문입니다.

대부분의 DBMS에서 동시성을 위해 제공하는 MVCC(Multi-Version Concurrency Control) 기능은 동시에 여러 트랜잭션이 수행되는 환경에서 각 트랜잭션에게 쿼리 수행 시점의 데이터를 제공하여 읽기 일관성을 보장하고 Read/Write 간의 충돌 및 lock을 방지하여 동시성을 높일 수 있는 기능으로, 모든 MVCC의 기본 원리는 트랜잭션이 시작된 시점의 Transaction ID와 같거나 작은 Transacion ID를 가지는 데이터를 읽는 것입니다.

Vacuum 개념 및 적절한 사용

Vacuum이란?

Vacuum은 postgresql에서 dead tuple이 차지하는 저장공간을 회수한다. 일반적으로 Postgresql에서 update, delete tuple 은 물리적으로 삭제되지 않으며 vacuum이 완료될 때까지 계속 존재한다.

(update, delete 시 tuple의 순환은 MVCC 개념에서 확인할 수 있다.)

그렇기 때문에 특히 자주 업데이트되는 테이블의 경우 주기적인 Vacuum 수행이 필요하다. Vacuum은 특정 테이블에 한해서도 실행이 가능하고, 테이블을 지정하지 않는다면 전체 테이블 (권한을 보유한)에 대해서 실행된다.

Vacuum 명령어

-- DB 전체 full vacuum
vacuum FULL analyze;
 
-- DB 전체 간단하게 실행
vacuum verbose analyze;
 
-- 해당 테이블만 간단하게 실행
vacuum analyze [테이블 명];
 
-- 특정 테이블만 full vacuum
vacuum FULL [테이블 명];
postgresql/vacuum.txt · 마지막으로 수정됨: 2025/04/15 10:05 저자 127.0.0.1