PostgreSQL에서 가장 싫어하는 부분
- PostgreSQL는 최근 5년간 인터넷에서 가장 사랑받는 DBMS로 자리 잡았음. 이는 신뢰성, 기능성, 확장성, 그리고 대부분의 운영 워크로드에 적합하기 때문임.
- 그러나 PostgreSQL의 다중 버전 동시성 제어(MVCC) 구현 방식은 다른 관계형 DBMS들에 비해 가장 나쁜 것으로 평가됨.
다중 버전 동시성 제어란?
- MVCC의 목표는 여러 쿼리가 동시에 데이터베이스를 읽고 쓸 수 있도록 하여 서로 간섭하지 않도록 하는 것임.
- DBMS는 기존 행을 덮어쓰지 않고 여러 버전을 유지하여 쿼리가 요청을 만족시키기 위해 적절한 버전을 선택함.
- 이 방식은 명시적인 레코드 잠금이 필요 없게 하여 쿼리가 데이터베이스의 스냅샷을 관찰할 수 있게 함.
PostgreSQL의 다중 버전 동시성 제어
- PostgreSQL는 기존 행을 업데이트할 때 새로운 버전을 생성하여 변경 사항을 적용하는 추가 전용 버전 저장 방식을 사용함.
- 이 방식은 여러 가지 복잡한 문제를 야기함.
다중 버전 저장
- PostgreSQL는 모든 행 버전을 동일한 저장 공간에 저장함.
- 업데이트 시 새로운 버전 슬롯을 할당하고, 기존 버전을 복사하여 변경 사항을 적용함.
- PostgreSQL는 버전 체인을 사용하여 버전 간의 관계를 기록함.
버전 진공
- PostgreSQL는 오래된 버전을 제거하기 위해 진공 절차를 사용함.
- 자동 진공(autovacuum)은 정기적으로 실행되어 만료된 버전을 제거하고 공간을 재사용함.
PostgreSQL의 MVCC가 최악인 이유
- PostgreSQL의 MVCC 구현은 1980년대의 설계로, 현대의 로그 구조 시스템 패턴과 맞지 않음.
- PostgreSQL의 MVCC에서 발생하는 네 가지 주요 문제를 설명함.
문제 1: 버전 복사
- PostgreSQL는 모든 열을 새로운 버전으로 복사하여 데이터 중복과 저장 요구량을 증가시킴.
- MySQL과 Oracle은 델타를 저장하여 이러한 문제를 피함.
문제 2: 테이블 부풀림
- PostgreSQL의 만료된 버전은 공간을 차지하며, 자동 진공이 이를 제거하지 못하면 데이터베이스가 계속 성장함.
- 이는 쿼리 성능을 저하시킴.
문제 3: 보조 인덱스 유지보수
- PostgreSQL는 각 업데이트마다 모든 인덱스를 업데이트해야 함.
- 이는 쿼리 성능을 저하시킴.
문제 4: 진공 관리
- PostgreSQL의 성능은 자동 진공의 효과성에 크게 의존함.
- 자동 진공이 제대로 작동하지 않으면 성능 문제가 발생함.
GN⁺의 정리
- PostgreSQL는 여전히 많은 사랑을 받는 DBMS이지만, MVCC 구현 방식은 현대적이지 않음.
- PostgreSQL의 MVCC 문제를 해결하기 위해 많은 시간과 노력이 필요함.
- PostgreSQL의 자동 진공 설정을 최적화하여 성능을 개선할 수 있음.
- PostgreSQL의 MVCC 문제를 해결하기 위한 대안으로 MySQL과 Oracle을 고려할 수 있음.