사용자 도구

사이트 도구


postgresql:vacuum

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
postgresql:vacuum [2024/08/01 04:44] – [MVCC(Multi-Version Concurrency Control)란?] taekgupostgresql:vacuum [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +====== VACUUM ======
 +  * [[https://techblog.woowahan.com/9478/|PostgreSQL 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이 실패하고 있다면?
 +
 +<code sql>
 +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;
 +</code>
 +
 +===== 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 명령어 =====
 +<code sql>
 +-- DB 전체 full vacuum
 +vacuum full analyze;
 + 
 +-- DB 전체 간단하게 실행
 +vacuum verbose analyze;
 + 
 +-- 해당 테이블만 간단하게 실행
 +vacuum analyze [테이블 명];
 + 
 +-- 특정 테이블만 full vacuum
 +vacuum full [테이블 명];
 +</code>