우리가 가장 싫어하는 PostgreSQL 부분 (2023)

1 week ago 3

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을 고려할 수 있음.

Read Entire Article