PostgreSQL만의 특성 때문에 Table정리가 필요하다.
Vacuum은 PostgreSQL의 MVCC 구현 방법이 Oracle이나 MySQL 등 다른 DBMS와 다르고 그 차이로 인해 발생하는 문제점을 해결하기 위한 PostgreSQL만의 특별한 동작인데요.
Vacuum을 DB단에서 자동으로 수행하는 동작을 AutoVacuum이라고 하며 Vacuum & AutoVacuum(이하 Vacuum으로 통일)을 통해 아래 4가지 작업을 수행합니다.
위 4개의 동작 모두 중요하지만 그 중 특히 중요한 것은 Dead Tuple을 정리하는 동작과 Trasaction ID Wraparound 방지 동작입니다.
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;
Database를 많이 접하고 있지만 db 깊은 영역이라는 생각에 자세히 보려고 하지않았습니다.
Vacuum은 PostgreSQL MVCC의 독특한 구현 방식 덕분에 탄생한 개념이기 때문입니다.
대부분의 DBMS에서 동시성을 위해 제공하는 MVCC(Multi-Version Concurrency Control) 기능은 동시에 여러 트랜잭션이 수행되는 환경에서 각 트랜잭션에게 쿼리 수행 시점의 데이터를 제공하여 읽기 일관성을 보장하고 Read/Write 간의 충돌 및 lock을 방지하여 동시성을 높일 수 있는 기능으로, 모든 MVCC의 기본 원리는 트랜잭션이 시작된 시점의 Transaction ID와 같거나 작은 Transacion ID를 가지는 데이터를 읽는 것입니다.
Vacuum은 postgresql에서 dead tuple이 차지하는 저장공간을 회수한다. 일반적으로 Postgresql에서 update, delete tuple 은 물리적으로 삭제되지 않으며 vacuum이 완료될 때까지 계속 존재한다.
(update, delete 시 tuple의 순환은 MVCC 개념에서 확인할 수 있다.)
그렇기 때문에 특히 자주 업데이트되는 테이블의 경우 주기적인 Vacuum 수행이 필요하다. Vacuum은 특정 테이블에 한해서도 실행이 가능하고, 테이블을 지정하지 않는다면 전체 테이블 (권한을 보유한)에 대해서 실행된다.
-- DB 전체 full vacuum vacuum FULL analyze; -- DB 전체 간단하게 실행 vacuum verbose analyze; -- 해당 테이블만 간단하게 실행 vacuum analyze [테이블 명]; -- 특정 테이블만 full vacuum vacuum FULL [테이블 명];