PostgreSQL 성능 최적화: VACUUM, VACUUM FULL, pg_repack, pg_reorg 완벽 비교

이세현·2024년 9월 26일
0

Postgresql_Monitoring

목록 보기
8/8

PostgreSQL에서 테이블의 성능을 유지하고, 비효율적인 공간을 회수하는 것은 매우 중요합니다. 이 작업을 위해 네 가지 대표적인 방법이 있는데, 각각의 특성에 따라 상황에 맞는 선택이 필요합니다. 이번 글에서는 PostgreSQL 초보자를 위해 VACUUM, VACUUM FULL, pg_repack, 그리고 pg_reorg의 차이점을 자세히 비교하고 어떤 상황에서 어떤 방법을 사용하는 것이 좋은지 설명해 드리겠습니다.

1. VACUUM

개요

VACUUM은 PostgreSQL에서 기본 제공되는 테이블 청소 작업으로, 테이블에서 삭제되거나 수정된 튜플을 "죽은 튜플(dead tuple)"로 인식하고 이 공간을 재사용 가능하도록 처리합니다. 그러나 이 공간은 실제로 반환되지 않고, 새 데이터가 들어올 때까지 예약된 상태로 남아 있습니다.

특징

  • 장점:

    • 빠르고 성능에 큰 영향을 미치지 않습니다.
    • PostgreSQL에 기본 내장된 기능으로, 별도의 설치가 필요 없습니다.
    • 자동 VACUUM 설정이 가능하여 관리 부담이 적습니다.
  • 단점:

    • 테이블에서 삭제된 행을 실제로 삭제하지 않고, 새로운 데이터로 교체할 수 있는 공간으로만 표시합니다.
    • 테이블의 물리적 크기를 줄이진 않으므로, 디스크 공간 절약에는 한계가 있습니다.

사용 사례

데이터가 많이 삭제되지 않은 테이블에서 정기적인 공간 최적화를 위해 사용.
기본적인 성능 유지 및 데이터베이스 관리를 위해 사용.

2. VACUUM FULL

개요

VACUUM FULL은 기본 VACUUM과 달리 테이블의 물리적 크기를 줄이고 디스크 공간을 회수하는 작업을 수행합니다. 테이블 내의 데이터를 재배치하여 실제로 사용되지 않는 공간을 반환하며, 이 작업을 위해 테이블을 잠그고 완전히 재구성합니다.

특징

  • 장점:

    • 테이블의 물리적 크기를 줄여 실제 디스크 공간을 확보할 수 있습니다.
    • 테이블 데이터를 재구성하여 성능이 향상될 수 있습니다.
  • 단점:

    • 긴 테이블 락이 발생하며, 테이블에 액세스하는 모든 쿼리가 중단될 수 있습니다.
    • 큰 테이블의 경우 시간이 오래 걸릴 수 있습니다.

사용 사례

디스크 공간이 부족한 경우, 즉각적인 디스크 공간 회수가 필요할 때 사용.
테이블 크기가 많이 커진 경우, 서비스 중단 시간이 허용될 때 사용.

3. pg_repack

개요

pg_repack은 PostgreSQL의 확장 모듈로, 테이블의 공간을 정리하면서도 테이블에 락을 거의 걸지 않고 작업을 수행할 수 있습니다. VACUUM FULL과 유사하게 테이블을 재구성하여 공간을 회수하지만, 서비스 중단 시간을 줄이는 데 최적화되어 있습니다.

특징

  • 장점:

    • 락을 최소화하며 테이블의 공간을 최적화합니다.
    • 테이블과 인덱스를 모두 재구성하여 성능 향상에 도움을 줍니다.
    • VACUUM FULL보다 성능에 미치는 영향이 적습니다.
  • 단점:

    • PostgreSQL의 외부 확장 모듈로, 별도의 설치가 필요합니다.
    • 트리거나 외래 키 제약 등이 있는 복잡한 테이블에서는 사용에 주의가 필요합니다.

사용 사례
트래픽이 많은 서비스에서 테이블을 잠그지 않고 최적화가 필요한 경우.
디스크 공간 회수와 성능 최적화를 동시에 해야 할 때.

4. pg_reorg

개요

pg_reorg는 PostgreSQL에서 테이블을 재구성하는 외부 도구로, VACUUM FULL과 pg_repack의 중간 단계에 위치한 도구입니다. 짧은 시간 동안 테이블에 락을 걸어 공간을 정리하면서도, 성능을 최대한 유지할 수 있도록 설계되었습니다.

특징

  • 장점:

    • 락을 최소화하면서도 테이블과 인덱스를 재구성하여 공간을 최적화합니다.
    • pg_repack과 유사하게 큰 테이블에서도 사용할 수 있으며, 공간 효율을 높입니다.
  • 단점:

    • 확장 모듈로, 별도의 설치가 필요합니다.
    • 최신 PostgreSQL 버전과 호환성이 떨어질 수 있어, 일부 환경에서는 설정에 주의가 필요합니다.

사용 사례

테이블을 완전히 재구성하면서도 잠금 시간을 줄이려는 경우.
서비스 중단 시간에 대한 여유가 있을 때 사용.

네 가지 방법의 비교

기능VACUUMVACUUM FULLpg_repackpg_reorg
테이블 락없음 (작업 중 일부 락)긴 락 발생거의 없음짧은 락 발생
추가 설치필요 없음필요 없음필요필요
성능 최적화기본적인 공간 회수완전한 공간 회수 및 성능 향상성능 최적화 가능성능 최적화 가능
트래픽에 미치는 영향적음높음적음중간
디스크 공간 회수없음완전한 회수완전한 회수완전한 회수
사용 편의성쉬움테이블 락 고려 필요설치 및 설정 필요설치 및 설정 필요

결론

VACUUM은 가볍고 빠르게 테이블의 공간을 최적화하지만, 디스크 공간을 직접적으로 회수하지는 않습니다.
VACUUM FULL은 디스크 공간을 회수하고 성능 최적화를 도모할 수 있지만, 테이블에 락이 발생하여 큰 테이블에서는 성능 저하가 발생할 수 있습니다.

pg_repack은 테이블을 잠그지 않으면서도 공간을 최적화할 수 있어, 트래픽이 많은 환경에서 유용합니다.
pg_reorg는 짧은 락을 사용해 공간을 회수할 수 있으며, pg_repack과 유사한 기능을 제공하되, 사용 환경에 따라 조금 더 유연하게 사용할 수 있습니다.

상황에 따라 이러한 도구를 적절히 조합하여 사용할 수 있으며, 테이블의 크기나 서비스 중단 시간에 민감한 환경에서는 pg_repack과 같은 도구가 적합할 수 있습니다. PostgreSQL 최적화 작업에 대한 이해를 바탕으로, 필요에 맞는 도구를 선택해 성능을 향상시킬 수 있기를 바랍니다! 🚀

profile
pglover_12

0개의 댓글