====== 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이 실패하고 있다면? 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 [테이블 명];