4P by neo 25일전 | favorite | 댓글 1개

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을 고려할 수 있음.
Hacker News 의견
  • OrioleDB는 새로운 저장 엔진으로 문제를 해결하려고 했음

    • INSERT 작업이 주로 이루어질 경우 추가 공간이 필요하지 않음
    • 트랜잭션 내의 명령문 수에는 제한이 있지만, COPY FROM을 사용하면 이를 피할 수 있음
    • DBA 관점에서 롤백/언두 공간을 별도로 관리할 필요가 없음
  • PostgreSQL의 설계가 모든 면에서 나쁜 것은 아님

    • MySQL과 Oracle은 새로운 버전과 현재 버전 간의 압축 델타를 저장함
    • git은 diff를 저장하지 않고 PostgreSQL과 유사하게 전체 객체를 저장함
  • Oracle과 MySQL의 MVCC 구현은 새로운 버전의 물리적 주소를 저장하지 않음

    • 대신 논리적 식별자를 저장하여 DBMS가 현재 버전의 물리적 주소를 찾음
    • 이로 인해 보조 인덱스 읽기가 느려질 수 있지만, 다른 장점으로 오버헤드를 줄임
  • MySQL에서 단일 행을 업데이트할 때 SELECT id WHERE something; UPDATE what WHERE id=id가 훨씬 빠름

    • 일반적인 작업에서는 이러한 방식이 사용되지 않으며, 이는 일회성 DML을 느리게 함
  • 2010년대에는 MongoDB가 비내구성 쓰기로 인해 "webscale"로 인식되었음

    • 이는 마케팅의 결과였음
  • pg_repack에 대한 설명에 동의하지 않음

    • VACUUM FULL은 무겁지만, repack은 더 빠르고 가벼운 대안임
  • PostgreSQL이 인기를 얻은 이유는 다음과 같음

    • 데이터 안전성, ACID, Oracle과의 유사성, MVCC, SQL 표준 준수, Postgres 팀, 커뮤니티, 데이터 타입, 높은 성능, BSD 유연성
    • PostgreSQL은 지속적으로 발전하고 있으며, 커뮤니티가 큰 역할을 하고 있음
  • PostgreSQL의 전체 새로운 행-튜플 버전 저장은 기본 저장 엔진의 속성인지에 대한 질문이 있음

  • 기사가 잘 작성되어 읽기 쉽고 이해하기 쉬웠음

    • 진공 관련 문제를 이해하는 데 도움이 되었으며, 다이어그램도 좋았음