오픈소스 관계형 데이터베이스다. 표준 SQL 을 충실히 따르면서 확장 기능이 많아, 범용 데이터베이스가 필요할 때 기본 선택지로 자주 쓰인다.

ACID 를 보장하는 트랜잭션, 외래 키 같은 제약조건, 복잡한 조인과 윈도우 함수를 모두 지원한다. 라이선스가 관대해서 상용 제품에 그대로 넣을 수 있다.

특징

MVCC — 읽기와 쓰기가 서로를 막지 않는다. 행을 수정하면 기존 행을 덮어쓰지 않고 새 버전을 추가하므로, 수정 중에도 다른 트랜잭션은 이전 버전을 읽는다. 대신 쓸모없어진 옛 버전이 쌓이기 때문에 이를 청소하는 VACUUM 이 주기적으로 돌아야 한다. 갱신이 잦은 테이블에서 이 청소가 밀리면 디스크가 부풀고 질의가 느려진다.

확장 기능 — 사용자 정의 타입과 함수, 인덱스 방식을 확장으로 붙일 수 있다. 지리 정보를 다루는 PostGIS, 벡터 유사도 검색을 붙이는 pgvector 처럼 별도 시스템을 도입하지 않고 해결하는 경우가 많다.

풍부한 자료형 — JSONB, 배열, 범위 타입 등을 기본 제공한다. JSONB 는 문서를 그대로 넣고 그 안의 필드에 인덱스를 걸 수 있어, 스키마가 유동적인 부분을 관계형 테이블 안에서 다룰 수 있다.

도구

psql 은 명령줄 클라이언트로, 접속·질의 실행·스키마 조회를 모두 여기서 한다.

분석 작업에서 마주치는 지점

Apache Spark 로 PostgreSQL 테이블을 읽을 때, 파티션을 지정하지 않으면 전체를 단일 연결로 가져와 한 executor 에 몰린다. 데이터가 크면 그 executor 에서 메모리 부족이 난다. 숫자형 열과 범위를 주어 여러 연결로 나눠 읽게 해야 한다.

애초에 PostgreSQL 은 행 단위 저장이라 대량 스캔 집계에는 불리하다. 그런 작업이 주가 되면 data warehousecolumnar storage 기반 엔진으로 데이터를 옮겨 처리하는 편이 맞다.