PostgreSQL에서 테이블의 성능을 유지하고, 비효율적인 공간을 회수하는 것은 매우 중요합니다. 이 작업을 위해 네 가지 대표적인 방법이 있는데, 각각의 특성에 따라 상황에 맞는 선택이 필요합니다. 이번 글에서는 PostgreSQL 초보자를 위해 VACUUM, VACUUM FULL, pg_repack, 그리고 pg_reorg의 차이점을 자세히 비교하고 어떤 상황에서 어떤 방법을 사용하는 것이 좋은지 설명해 드리겠습니다.
개요
VACUUM은 PostgreSQL에서 기본 제공되는 테이블 청소 작업으로, 테이블에서 삭제되거나 수정된 튜플을 "죽은 튜플(dead tuple)"로 인식하고 이 공간을 재사용 가능하도록 처리합니다. 그러나 이 공간은 실제로 반환되지 않고, 새 데이터가 들어올 때까지 예약된 상태로 남아 있습니다.
특징
장점:
단점:
사용 사례
데이터가 많이 삭제되지 않은 테이블에서 정기적인 공간 최적화를 위해 사용.
기본적인 성능 유지 및 데이터베이스 관리를 위해 사용.
개요
VACUUM FULL은 기본 VACUUM과 달리 테이블의 물리적 크기를 줄이고 디스크 공간을 회수하는 작업을 수행합니다. 테이블 내의 데이터를 재배치하여 실제로 사용되지 않는 공간을 반환하며, 이 작업을 위해 테이블을 잠그고 완전히 재구성합니다.
특징
장점:
단점:
사용 사례
디스크 공간이 부족한 경우, 즉각적인 디스크 공간 회수가 필요할 때 사용.
테이블 크기가 많이 커진 경우, 서비스 중단 시간이 허용될 때 사용.
개요
pg_repack은 PostgreSQL의 확장 모듈로, 테이블의 공간을 정리하면서도 테이블에 락을 거의 걸지 않고 작업을 수행할 수 있습니다. VACUUM FULL과 유사하게 테이블을 재구성하여 공간을 회수하지만, 서비스 중단 시간을 줄이는 데 최적화되어 있습니다.
특징
장점:
단점:
사용 사례
트래픽이 많은 서비스에서 테이블을 잠그지 않고 최적화가 필요한 경우.
디스크 공간 회수와 성능 최적화를 동시에 해야 할 때.
개요
pg_reorg는 PostgreSQL에서 테이블을 재구성하는 외부 도구로, VACUUM FULL과 pg_repack의 중간 단계에 위치한 도구입니다. 짧은 시간 동안 테이블에 락을 걸어 공간을 정리하면서도, 성능을 최대한 유지할 수 있도록 설계되었습니다.
특징
장점:
단점:
사용 사례
테이블을 완전히 재구성하면서도 잠금 시간을 줄이려는 경우.
서비스 중단 시간에 대한 여유가 있을 때 사용.
기능 | VACUUM | VACUUM FULL | pg_repack | pg_reorg |
---|---|---|---|---|
테이블 락 | 없음 (작업 중 일부 락) | 긴 락 발생 | 거의 없음 | 짧은 락 발생 |
추가 설치 | 필요 없음 | 필요 없음 | 필요 | 필요 |
성능 최적화 | 기본적인 공간 회수 | 완전한 공간 회수 및 성능 향상 | 성능 최적화 가능 | 성능 최적화 가능 |
트래픽에 미치는 영향 | 적음 | 높음 | 적음 | 중간 |
디스크 공간 회수 | 없음 | 완전한 회수 | 완전한 회수 | 완전한 회수 |
사용 편의성 | 쉬움 | 테이블 락 고려 필요 | 설치 및 설정 필요 | 설치 및 설정 필요 |
VACUUM은 가볍고 빠르게 테이블의 공간을 최적화하지만, 디스크 공간을 직접적으로 회수하지는 않습니다.
VACUUM FULL은 디스크 공간을 회수하고 성능 최적화를 도모할 수 있지만, 테이블에 락이 발생하여 큰 테이블에서는 성능 저하가 발생할 수 있습니다.
pg_repack은 테이블을 잠그지 않으면서도 공간을 최적화할 수 있어, 트래픽이 많은 환경에서 유용합니다.
pg_reorg는 짧은 락을 사용해 공간을 회수할 수 있으며, pg_repack과 유사한 기능을 제공하되, 사용 환경에 따라 조금 더 유연하게 사용할 수 있습니다.
상황에 따라 이러한 도구를 적절히 조합하여 사용할 수 있으며, 테이블의 크기나 서비스 중단 시간에 민감한 환경에서는 pg_repack과 같은 도구가 적합할 수 있습니다. PostgreSQL 최적화 작업에 대한 이해를 바탕으로, 필요에 맞는 도구를 선택해 성능을 향상시킬 수 있기를 바랍니다! 🚀