VACUUM - vacuum 사용 이유

yshjft·2024년 11월 26일
0

Postgresql

목록 보기
7/11

왜 VACUUM을 사용하는가?

Dead Tuple 정리

앞의 글에서도 언급했지만 PostgreSQL은 현재 데이터와 과거의 데이터가 한 곳에서 관리됩니다. 그리고 이 과거 데이터들은 Dead Tuple 이라고 불리며 어디에서도 사용되지 않고 자리만 차지하는 불필요한 친구입니다.

데이터베이스를 아주 조금이라도 공부 해봤다면 일정한 단위(block, page)만큼의 데이터가 디스크에서 메모리로 올려져 조회된다는 것을 아실겁니다. 메모리에 원하는 데이터가 없다면 디스크에서 다른 page를 가져와 메모리에 올려야 하는데 시간이 오래 걸리는 디스크에서의 데이터 조회는 적으면 적을 수록 성능에 좋습니다. 문제는 PostgreSQL에서 Dead Tuple이 쓸데 없이 page의 공간을 차지하여 필요한 데이터를 찾기 위해 더 많은 page를 디스크로부터 읽어오게 만든다는 것입니다. 따라서 이러한 Dead Tuple을 정리하여 공간 효율성과 쿼리 성능 향상을 위해서 사용하는 것이 VACUUM(VACUUM, AUTOVACUUM) 입니다.

VACUUM, VACUUM FULL

  • VACUUM(AUTOVACUUM)

    • Dead Tuple을 정리함으로서 해당 공간을 새로운 데이터가 사용할 수 있습니다.
    • 하지만 테이블의 공간을 회수하지는 않습니다.
  • VACUUM FULL

    • 테이블의 공간을 회수합니다.
    • 다만 Access Exclusive Lock을 획득해 select, DML을 모두 대기하게되기 때문에 운영 중에는 할 수 없습니다.
    • 또한 테이블 자체를 복사하는 방식으로 동작하기 때문에 디스크 가용량에 따라 못할 수도 있습니다.

... Vacuum과 관련한 파라미터의 적절한 튜닝과 정책을 잘 세워서 평소에 Dead Tuple 정리를 원활히 하여 불필요한 공간이 늘어나지 않도록 관리하는 것이 가장 중요합니다.
PostgreSQL Vacuum에 대한 거의 모든 것

Transaction ID Wraparound 방지

Transaction ID Wraparound

  • Dead Tuple은 성능 저하와 저장공간의 비효율성을 유발하긴 하지만 서비스를 중단시키지는 않습니다. 하지만 Transaction ID Wraparound는 서비스를 중단 시키는 문제를 발생시킵니다.

    제때 vacuum이 수행되지 않아 Transaction ID 정리가 안 되면 DB의 모든 write 작업이 멈출 수 있는 ...
    ... DB에서 AutoVacuum을 OFF 해놔도 관련 임계치를 초과하면 DB에서 강제로 수행하게 됩니다.
    PostgreSQL Vacuum에 대한 거의 모든 것

  • Transacion ID는 무한정 늘릴 수 없습니다. Transacion ID를 모두 소진하면 처음으로 돌아가야합니다.
  • 문제는 Transaction ID가 처음으로 돌아가면 기존 데이터들을 미래의 데이터로 취급하면서 읽을 수 없게 됩니다.
  • 이러한 문제를 Transaction ID Wraparound 라고 하며 이를 막기 위해 freeze(Anti Wraparound Vacuum)를 실행합니다.

freeze(Anti Wraparound Vacuum)

  • 임계치(autovacuum_freeze_max_age)에 Transaciton ID가 도달하면 과거의 데이터의 Transaction ID를 특정 값(FrozenXID)으로 동결시켜 Transaction ID가 계속 증가하다 순환되는 것을 방지합니다.
  • Tuple과 테이블에는 age라는 개념이 있습니다.
    • 테이블 생성 또는 tuple insert가 일어나면 age는 1로 설정됩니다.
    • DB에서 트랜잭션이 발생하면 모든 오브젝트와 tuple의 age가 1씩 증가합니다.
    • age가 임계치에 도달하면 Anti Wraparound Vacuum의 대상이 됩니다.
    • 테이블은 freeze의 대상이 아니지만 tuple은 freez의 대상입니다. 다만 테이블 age가 tuple의 age 중 가장 높은 값이기 때문에 테이블 age만 보고도 Anti Wraparound Vacuum 대상인지 아닌지 판단할 수 있습니다.
profile
꾸준히 나아가자 🐢

0개의 댓글