문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| postgresql:vacuum [2024/10/14 01:04] – [Introduction] taekgu | postgresql:vacuum [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | ====== VACUUM ====== | ||
| + | * [[https:// | ||
| + | ===== 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:: | ||
| + | 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 명령어 ===== | ||
| + | <code sql> | ||
| + | -- DB 전체 full vacuum | ||
| + | vacuum full analyze; | ||
| + | |||
| + | -- DB 전체 간단하게 실행 | ||
| + | vacuum verbose analyze; | ||
| + | |||
| + | -- 해당 테이블만 간단하게 실행 | ||
| + | vacuum analyze [테이블 명]; | ||
| + | |||
| + | -- 특정 테이블만 full vacuum | ||
| + | vacuum full [테이블 명]; | ||
| + | </ | ||