PostgreSQL
PostgreSQL은 객체-관계형 데이터베이스 관리 시스템(ORDBMS)의 일종이다. BSD 허가권으로 배포되며 오픈소스 개발자 및 관련 회사들이 개발에 참여하고 있다.
최초설치시 기본 포트로 5432를 사용한다.
Categories
Commandline
Extensions
- pg_cron
- hstore
- Apache AGE - A Graph Extension for PostgreSQL.
- pg_graphql - PostgreSQL용 GraphQL 확장
- pg_crdt - 실험적인 Postgrest용 CRDT 확장 오픈소스
- PgBouncer - lightweight connection pooler for PostgreSQL
- pg_flo - PostgreSQL 데이터를 실시간으로 스트리밍, 변환 및 재라우팅
- pgrx - Rust로 PostgreSQL 확장을 개발하는 프레임워크
- pglite-fusion - PostgreSQL 테이블에 SQLite 임베딩하기
- VectorChord - 40만개 벡터를 PostgreSQL에 $1로 저장하기
PostgreSQL을 사용한 프로젝트들
- PolarDB - Postgres를 Share-nothing 분산 DB로 만들어주는 오픈소스
- MangoDB - MongoDB의 오픈소스 대체제 (프록시로 동작해서 MongoDB Wire Protocol 쿼리를 SQL로 변환하고 PostgreSQL을 DB엔진으로 사용)
- Babelfish for PostgreSQL - PostgreSQL에서 MS SQL Server용으로 작성된 어플리케이션을 실행 가능하게 만드는 오픈소스 확장
- TimescaleDB
- Postgres 를 Pub/Sub Server 로 이용하기 https://news.hada.io/topic?id=877
- Message-DB, PostgreSQL기반의 Pub/Sub 메시지&이벤트 스토어 https://news.hada.io/topic?id=1096
- Apache Age, Postgres에 Graph DB 기능을 추가하는 확장 https://news.hada.io/topic?id=3844
- PolarDB for PostgreSQL https://news.hada.io/topic?id=4362
- Supabase 공개 베타 시작 - 오픈소스 Firebase 대체제 https://news.hada.io/topic?id=3347
- EdgeDB - 개발자를 위한 차세대 오픈소스 ORDB https://news.hada.io/topic?id=4602
- RudderStack - Segment의 오픈소스 대체제 https://news.hada.io/topic?id=1759
- OrioleDB - 클라우드 네이티브 스토리지 엔진 (PostgreSQL을 위한 새로운 스토리지 엔진)
- IaSQL - Infrastructure as data in PostgreSQL
- Fly Postgres - fly.io에서 제공하는 postgresql
- PeerDB - Postgres를 위한 ETL/ELT 플랫폼
- Postgres-wasm - 브라우저에서 실행되는 PostgreSQL 서버
- Postgres Language Server (postgres_lsp)
- SQLedge - Edge에서 Postgres를 SQLite로 복제해주는 도구
- Pongo - Postgres 기반 Mongo with Strong Consistency
- PgQueuer – PostgreSQL을 작업 대기열로 이용하는 파이썬 라이브러리
- rainfrog - Postgres용 데이터 관리 TUI 도구
Client
Tools
AI Agents
- Xata Agent - PostgreSQL 전문가 AI 에이전트
- Snap-QL - Postgres에 AI로 쿼리하는 데스크탑 앱
ETC
- Postgres.app - macOS용 PostgreSQL
- Inquery - Postgres 변경시 웹훅 호출해주는 유틸리티
- broadcaster (python) - Simple broadcast channels
- Retake - Postgres용 하이브리드 검색 오픈소스
- PGMQ - Postgres 기반의 SQS 대체제
- Postgres Language Server
- Hatchet - Postgres에 기반한 작업 오케스트레이션 플랫폼
- PgDog - PostgreSQL를 위한 초고속 트랜잭션 풀링 및 샤딩 관리자
- pgactive - Postgres 액티브-액티브 복제 확장
- Ivory - Postgres / Patroni 클러스터 관리 도구
- pgschema - Terraform 스타일의 선언적 Postgres 스키마 마이그레이션 도구
Extension
PostgreSQL은 SQL 객체를 패키지로 만들어 하나의 단위로 사용함으로써 데이터베이스 기능을 확장하는 방법을 제공합니다.
PostGIS
PostGIS 2.3 확장 프로그램 그룹 및 PostGIS 3.0 확장 프로그램은 JSON-C 지원을 포함하여 Cloud SQL에서 지원됩니다.
- postgis
- postgis_tiger_geocoder
- postgis_topology
데이터 유형 확장 프로그램
- btree_gin - B-tree와 동등한 동작을 구현하는 샘플 GIN 연산자 클래스를 제공합니다.
- btree_gist - B-tree와 동등한 동작을 구현하는 GiST 색인 연산자 클래스를 제공합니다.
- chkpass - 암호화된 비밀번호를 저장하기 위해 설계된 데이터 유형 chkpass를 구현합니다. Cloud SQL용 PostgreSQL 12에서는 지원되지 않습니다.
- citext - 대소문자를 구분하지 않는 문자열 유형 citext를 제공합니다.
- cube - 다차원 큐브를 나타내는 데이터 유형 cube를 구현합니다.
- hstore - 단일 PostgreSQL 값 내에서 키-값 쌍 조합을 저장하기 위한 hstore 데이터 유형을 구현합니다.
- isn - 일부 국제 제품 번호 지정 표준에 대한 데이터 유형을 제공합니다.
- ltree - 계층 트리 구조에 저장된 데이터 라벨을 나타내는 데이터 유형 ltree를 구현합니다.
- lo - 대형 객체(LO 또는 BLOB) 관리를 지원합니다.
- postgresql-hll - 새로운 데이터 유형인 hll(HyperLogLog 데이터 구조)을 도입합니다. 아래의 postgresql-hll 섹션도 참조하세요.
언어 확장 프로그램
- plpgsql - 함수, 절차, 트리거를 만들기 위한 로드 가능한 절차적 언어입니다. DO 블록에서 코드를 직접 실행하는 데 이 언어를 사용할 수도 있습니다.
기타 확장 프로그램
- dict_int - 전체 텍스트 검색을 위한 부가기능 사전 템플릿으로 정수 색인 생성을 제어합니다.
- earthdistance - 지구 표면에서 대원 거리를 계산하는 두 가지 접근법을 제공합니다.
- fuzzystrmatch - 문자열 간의 유사점과 거리를 확인하는 여러 기능을 제공합니다.
- intagg - 정수 애그리게이터와 열거자를 제공합니다.
- intarray - null이 없는 정수 배열을 조작하고 이에 대한 색인이 생성된 검색을 수행하는 데 필요한 함수 및 연산자 세트를 제공합니다.
- pageinspect - 하위 수준에서 데이터베이스 페이지의 콘텐츠를 검사합니다. 아래의 pageinspect 섹션도 참조하세요.
- pgaudit - 감사 데이터를 수집합니다. Cloud SQL에서 이 확장 프로그램을 사용하는 방법은 pgAudit를 사용하여 PostgreSQL 감사를 참조하세요.
- pg_buffercache - 공유 버퍼 캐시의 변경사항을 실시간으로 검사하는 수단을 제공합니다.
- pgfincore - PostgreSQL에서 운영체제 디스크 캐시 메모리의 페이지를 관리하는 함수 집합입니다. 아래의 pgfincore 섹션도 참조하세요.
- pg_freespacemap - 여유 공간 맵(FSM)을 검사합니다. 아래의 pg_freespacemap 섹션도 참조하세요.
- pgcrypto - PostgreSQL의 암호화 기능을 제공합니다.
- pgstattuple - 튜플 수준 통계를 얻기 위한 다양한 함수를 제공합니다.
- pg_repack - 테이블 및 색인에서 블로트를 제거할 수 있습니다. 원하는 경우 온라인 CLUSTER(클러스터 색인별로 테이블 정렬)를 수행할 수 있습니다. 아래의 pg_repack 섹션도 참조하세요.
- pgrowlocks - 지정된 테이블에 대한 행 잠금 정보를 제공합니다.
- pg_prewarm - 관계 데이터를 운영체제 버퍼 캐시나 PostgreSQL 버퍼 캐시로 편리하게 로드하는 방법을 제공합니다.
- pg_stat_statements - 실행된 모든 SQL 구문 실행 통계를 추적하는 수단을 제공합니다.
- pg_trgm - 빠른 유사 문자열 검색을 지원하는 인덱스 연산자 클래스뿐 아니라 트라이그램 매칭을 기반으로 하는 영숫자 텍스트의 유사성을 결정하는 데 필요한 함수와 연산자를 제공합니다.
- pg_visibility - 테이블의 가시성 지도(VM) 및 페이지 수준의 가시성 정보를 검사할 수 있는 방법을 제공합니다. 아래의 pg_visibility 섹션도 참조하세요.
- PL/Proxy - PostgreSQL 데이터베이스 간에 리모트 프로시져 콜을 허용하는 프로시져 언어 핸들러이며, 선택 사항인 샤딩이 있습니다. 아래의 PL/Proxy 섹션도 참조하세요.
- postgres_fdw - 인스턴스 내에서 또는 인스턴스 간에 외부 데이터 래퍼를 만들 수 있습니다. 아래의 postgres_fdw 섹션도 참조하세요.
- sslinfo - 현재 클라이언트가 인스턴스에 연결할 때 제공한 SSL 인증서에 대한 정보를 제공합니다.
- tablefunc - 테이블(여러 행)을 반환하는 다양한 함수를 포함합니다.
- tsm_system_rows - SELECT 명령어의 TABLESAMPLE 절에서 사용할 수 있는 테이블 샘플링 메서드인 SYSTEM_ROWS를 제공합니다.
- tsm_system_time - SELECT 명령어의 TABLESAMPLE 절에서 사용할 수 있는 테이블 샘플링 메서드인 SYSTEM_TIME을 제공합니다.
- unaccent - 어휘소에서 악센트(발음 구별 기호)를 제거하는 텍스트 검색 사전입니다.
- uuid-ossp - 여러 표준 알고리즘 중 하나를 사용하여 범용 고유 식별자(UUID)를 생성하는 기능을 제공합니다.
ETC
- Citus
- Github - supabase/postgres - 유용한 확장을 포함한 Postgres Docker 이미지들
ERD Tools
- pgModeler - PostgreSQL Database Modeler
Show all parameters
show the value of a run-time parameter.
데이터 디렉토리 확인 방법
Timestamp
MIN/MAX
최대/최소 추출. 레코드 집계 함수.
GREATEST/LEAST
레코드 집계 함수가 아닌 경우 사용할 수 있다. Array 같은 자료형, 즉 1객 데이터 또는 plpgsql의 함수 안에서 변수 단위로 사용 가능.
ARRAY
EMPTY ARRAY
또는:
Tips
잘 알려지지 않은 PostgreSQL 기능들:
- Insert on Conflict(Upsert) 시 수정/추가된 Row 수 알기 :
xmax - 특정 컬럼에 권한 부여하기
- 멀티 패턴 매칭:
SIMILAR TO또는~정규식 - 현재 시퀀스값 증가시키지 않고 알아내기:
pg_sequence_last_value() - 멀티라인 SQL과
\COPY같이 사용하려면 : TEMPORARY VIEW 또는COPY와\g이용 - 자동 생성 키에 값 설정 막기: 테이블 생성시
GENERATED ALWAYS지정 (GENERATED BY DEFAULT대신) - Pivot 테이블 만들기:
pandas.pivot_table,\crosstabview또는 tablefunc 확장 사용 - Dollar Quoting
-
$$와$$사이의 모든 글자는 문자열로 인식 -
$JSON$/$function$처럼 안에 Tag이용 가능 -
::jsonb를 붙이면 빠르게jsonb객체 생성
-
COMMENT ON TABLE/COLUMN, Dollar Quoting 이용해서 긴 문자열 설명 추가도 가능- 작성:
COMMENT ON TABLE sale IS 'Sales made in the system'; - 보기:
\d+ sale
-
\set HISTFILE ~/.psql_history- :DBNAME
\set COMP_KEYWORD_CASE upper pg_sleep(초), pg_sleep_for('4 minutes 14 seconds') DISTINCT ON (그룹 컬럼) gen_random_uuid() - version 4 UUID를 생성 setseed() 로 시드를 같게 NOT VALID 로 조건만 먼저 추가하고, ALTER VALIDATE로 기존 데이터 검증은 따로 실행 OVERLAPS 연산자 Postgres를 모든 곳에 사용하세요
Postgres는 (수백만명의 사용자까지) 수많은 백엔드 기술을 대체 가능
- Kafka, RabbitMQ, Mongo, Redis,..
- 캐시에 Redis 대신 UNLOGGED 테이블에 TEXT 를 JSON 형으로 사용
- 스토어드 프로시저로 데이터에 대한 만료기간을 설정
Query History
- check history along with dates for queries in Postgres - pg_stat_activity 테이블에서 확인하는 방법.
Partial Index (부분 인덱스)
조건을 만족하는 것만 indexing 하기 위해 쓰입니다.
아래의 DDL 예시 참조:
CREATE UNIQUE INDEX email_idx ON public.myapp_email USING btree (email) WHERE (email IS NOT NULL and email <> '');
where 절을 보면 email이 not NULL이면서, email이 빈 문자열이 아닌 경우에만 indexing을 한다는 것을 의미합니다.
with Node.js
LISTEN & NOTIFY
테이블의 컬럼 출력 순서
"[wiki.postgresql.org/wiki/Alter_column_position Alter column position]" in the PostgreSQL Wiki says:
PostgreSQL currently defines column order based on the ``attnum`` column of the ``pg_attribute`` table. The only way to change column order is either by recreating the table, or by adding columns and rotating data until you reach the desired layout.
That's pretty weak, but in their defense, in standard SQL, there is no solution for repositioning a column either. Database brands that support changing the ordinal position of a column are defining an extension to SQL syntax.
One other idea occurs to me: you can define a VIEW that specifies the order of columns how you like it, without changing the physical position of the column in the base table.
varchar(n)를 기본적으로 사용하지 말아야 하는 이유
해당 행목 참조.
varchar(n) 대신 글자수 제한 방법
PostgreSQL:Constraints#글자 수 제한 항목 참조. 간단히:
문자열 계산 방법
- SQL 'LENGTH' & 'CHAR_LENGTH' Functions | Reintech media
- Postgres Length Functions With Practical Examples - CommandPrompt Inc.
select length('abcd'); -- 4 -- 문자열의 길이를 "바이트 단위"로 반환.
select char_length('abcd'); -- 4 -- length() 와 비슷하지만. "문자 단위"로 반환한다.
select length('Dž') -- 2
select char_length('Dž'); -- 1
select character_length('abcd'); -- 4 -- char_length() 와 동일
select bit_length('1234'); -- 32 -- 문자열의 비트 수
select octet_length('1234'); -- 4 -- 문자열의 바이트 수
데이터 웨어하우스로 사용하기
데이터분석을 통한 의사결정 지원시스템 Narrative가 경험을 통해 정리한 주요 트윅들
- 프로덕션 시스템과 같은 서버 사용하지 말 것
- PG 12+로 업그레이드(CTE 사용하지 말 것)
- 인덱스는 가능한 작게
- 테이블 파티셔닝(range/list)
- 디스크 I/O 최소화
- 벌크 인서트 후 Vacuum
- 병렬 쿼리 사용하기
- 통계 샘플링을 증가시키기 (컬럼별 또는 DB 전체. 기본값 100 이지만 500)
- 더 적은 컬럼 사용하기 (row 기반 저장이기 때문)
- 5천만~1억로우 테이블에서는 Postgres가 훌륭하게 동작
- 10억단위로 스케일하게 될때는 Citus 를 추천
- https://www.citusdata.com - Postgres를 분산 DB로 바꿔주는 오픈소스
[추천] PostgreSQL 사용 시 도움 되는 패턴들
Postgres를 더 생산적이고 안전하게 사용하는 데 도움이 되는 실용적인 패턴들을 정리한 글. 각 패턴은 작지만 누적되면 큰 차이를 만들어냄.
UUID 기본 키 사용
- UUID는 무작위이기 때문에 정렬이나 인덱스 성능 면에서 단점이 있음
- 숫자 ID보다 공간을 더 많이 차지함
- 하지만 다음과 같은 장점이 있음
- DB에 연결하지 않고도 UUID를 생성할 수 있음
- 외부에 안전하게 노출 가능함
created_at과 updated_at 필드 항상 추가
- 디버깅 시 레코드 생성 및 변경 시점을 아는 것이 매우 유용함
- updated_at은 트리거를 통해 자동으로 갱신되도록 설정 가능함
- 함수는 한 번만 만들고, 트리거는 각 테이블에 적용해야 함
외래 키에는 on update/delete restrict 설정
- 외래 키 제약 조건을 설정할 때 on update restrict on delete restrict를 반드시 사용해야 함
- 데이터 삭제 시 실수로 연쇄 삭제가 발생하지 않도록 방지함
- 저장 공간은 저렴하지만 데이터 복구는 매우 어렵기 때문에 보수적으로 처리하는 것이 좋음
스키마 사용 권장
- 기본 스키마는 public이지만, 애플리케이션이 커지면 별도의 스키마로 분리하는 것이 좋음
- 스키마는 네임스페이스처럼 작동하며, 서로 다른 스키마 간에도 조인이 가능함
- 테이블 수가 많아질수록 스키마를 활용하는 것이 가독성과 유지보수에 유리함
Enum 테이블 패턴 사용
- PostgreSQL의 enum 타입이나 check constraint 대신 enum 테이블을 사용하는 방식이 더 유연함
- enum 값을 별도 테이블로 관리하면, 메타데이터를 추가하거나 enum 값을 쉽게 확장 가능함
- 외래 키로 enum 테이블의 값을 참조하여 제약 조건을 유지함
테이블 이름은 단수형으로 지정
- 테이블 이름은 복수가 아닌 단수형으로 지정하는 것이 바람직함
- 쿼리 작성 시 단수형이 더 명확하며, 복수형은 소유격이나 의미적 혼란을 야기할 수 있음
조인 테이블은 기계적으로 이름 지정
- 다대다 관계를 위한 조인 테이블은 두 테이블명을 이어붙여 명명하는 것이 안전하고 명확함
- 예: person_pet
- 조합에 대한 고유 인덱스를 추가하여 중복 방지
삭제 대신 soft delete 사용
- 데이터를 실제로 삭제하기보다, 삭제 시점을 나타내는 revoked_at 같은 timestamp 필드를 사용하는 것이 좋음
- 삭제 여부뿐 아니라, 언제 삭제되었는지를 추적할 수 있음
- Boolean 값보다 timestamp가 더 많은 정보를 제공함
상태(Status)는 로그 테이블로 표현
- 단일 컬럼으로 상태를 표현하는 대신, 상태 변경 이력을 별도 테이블로 저장
- 상태 발생 시점은 valid_at 컬럼으로 명시
- 최신 상태를 빠르게 조회할 수 있도록 latest 플래그 및 유니크 인덱스 + 트리거를 설정함
- 이는 비동기 이벤트 처리나 순서가 뒤섞일 수 있는 상황에서 유리함
특별한 행에는 system_id 추가
- enum 테이블 외에도, 특정 "시스템 행"이 필요한 경우가 있음
- system_id 텍스트 필드를 nullable로 추가하고 유니크 인덱스를 설정
- system_id를 통해 특정 행을 명확하게 조회 가능
뷰(View)는 최소한으로 사용
- 뷰는 복잡한 쿼리를 추상화하는 데 유용하지만 유지보수가 어려움
- 컬럼 제거 시 뷰 재생성이 필요
- 뷰 위에 뷰를 만들면 성능 및 가독성 문제가 생김
JSON 쿼리 적극 활용
- Postgres는 JSON 저장뿐 아니라 JSON 반환 쿼리도 매우 강력함
- 중첩된 관계를 한 번의 쿼리로 JSON 형태로 반환 가능함
- N+1 문제 없이 필요한 모든 데이터를 한 번에 가져올 수 있음
- 단점: 타입 정보 손실, 전체 데이터를 한 번에 메모리에 불러와야 함
- 성능이나 구조 상 장점이 더 큼
Function pipelines - PostgreSQL에 함수형 프로그래밍 추가하기
- Function pipelines: Building functional programming into PostgreSQL using custom operators
- SQL을 이용한 데이터 분석을 훨씬 더 편하게
- Postgres의 "커스텀 데이터타입/연산자/함수"를 이용해서 SQL에 함수형 프로그래밍 컨셉을 도입
- Pandas, PromQL 과 비슷
SELECT device_id,
ㅤㅤtimevector(ts, val) -> sort() -> delta() -> abs() -> sum()
ㅤㅤㅤㅤas volatility
FROM measurements
WHERE ts >= now()-'1 day'::interval
GROUP BY device_id;
데이터 백업 및 복구 하는 방법
## 데이터베이스 전체 백업
pg_dumpall -f all-backup.sql -U postgres -W
## 특정 데이터베이스 선택 백업
pg_dump -h 127.0.0.1 -p 5432 -U postgres -W --compress=5 -f sample_db-20201219.sql.gz sample
## 특정 데이터베이스의 테이블 백업
pg_dump -h 127.0.0.1 -p 5432 -U postgres -W -d sample -t sample_table -f sample_table-20201219.sql
쿼리파일로 복구하는 방법:
Postgres에서 컬럼을 삭제하면 실제로 무슨 일이 일어나는가
결론: DROP COLUMN은 “숨기기”일 뿐 “삭제”가 아님
- 성능을 위한 설계지만, 컬럼이 쌓이면 1600개 제한에 걸릴 수 있음
- 필요한 경우 VACUUM FULL 또는 테이블 재작성으로 데이터 정리 필요
- 시스템 설계나 컴플라이언스 관점에서 PostgreSQL의 내부 동작 이해는 매우 유용
다른 데이터베이스 동기화 방법
PostgreSQL에서 다른 데이터베이스(DB), 예를 들어 MariaDB의 특정 테이블을 동기화하여 PostgreSQL의 테이블로 복제하는 방법은 다양한 도구와 기술을 통해 가능합니다.
일반적으로 이를 위해 사용되는 옵션은 다음과 같습니다:
- Foreign Data Wrapper (FDW)
- PostgreSQL에서 외부 데이터베이스의 테이블에 접근하고 이를 복제할 수 있는 방법으로, mysql_fdw라는 외부 데이터 래퍼를 사용해 MariaDB에 연결할 수 있습니다.
- Bucardo, SymmetricDS
- 이들 도구는 이기종 데이터베이스 간의 동기화를 지원하며, MariaDB에서 PostgreSQL로 데이터 복제를 설정할 수 있습니다.
- Bucardo - PostgreSQL 환경에서 사용하는 마스터-슬레이브 또는 마스터-마스터 동기화 도구입니다.
- SymmetricDS - MariaDB와 PostgreSQL 간의 양방향 및 일방향 동기화를 지원하며, 테이블 단위로 동기화할 수 있습니다.
- 이들 도구는 데이터 변경 사항을 트리거 방식 또는 로그 기반으로 감지하여 다른 데이터베이스에 실시간 또는 주기적으로 동기화합니다.
- ETL (Extract, Transform, Load) 솔루션 사용
- Apache NiFi나 Talend와 같은 ETL 도구를 사용하여 MariaDB의 데이터를 추출하고 이를 PostgreSQL로 로드하는 작업을 주기적으로 수행할 수 있습니다.
bigint vs uuid
CREATE UNLOGGED TABLE test_bigint (
id bigint GENERATED ALWAYS AS IDENTITY (CACHE 200) PRIMARY KEY
);
uuid-ossp 확장 필요.
serial vs slug
Uniform Resource Identifier#Slug vs ID 항목 참조.
Docker-Compose Example
version: '2.1'
services:
root_db:
image: postgres
restart: always
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
POSTGRES_DB: root_db
healthcheck:
test: pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"
interval: 10s
timeout: 2s
retries: 10
volumes:
db_data: {}
Database URL: pg://root_db:5432?u=postgres&p=password&d=root_db
2025년을 위한 7개의 데이터베이스 중 하나
- Database#2025년을 위한 7개의 데이터베이스 (GeekNews) 참조
- PostgreSQL은 기본적으로 사용되는 안정적인 기술
- "Just use Postgres"라는 문구는 널리 알려진 밈이자 신뢰성을 상징하는 표현임
- ACID를 준수하며 물리적 및 논리적 복제를 포함한 강력한 기능을 제공함
- 주요 벤더들 간에 광범위한 지원을 받고 있는 안정적 데이터베이스임
- 확장 기능(Extensions)을 통해 독창적인 기능을 추가 가능함
- 주요 확장 기능 예시:
- AGE: 그래프 데이터 구조와 Cypher 쿼리 언어 지원
- TimescaleDB: 시계열 데이터 작업 지원
- Hydra Columnar: 열 기반 스토리지 엔진 제공
- 확장 기능은 PostgreSQL을 타 데이터베이스와 차별화시키는 핵심 요소임
- 다양한 생태계를 갖추고 있으며, 기본 설정이 합리적이고 사용자 친화적임
- 비 PostgreSQL 서비스에서도 Postgres 와이어 프로토콜을 사용해 클라이언트 호환성을 제공함
- WebAssembly(Wasm) 환경에서도 설치 가능할 정도로 가벼움
- PostgreSQL의 가능성과 한계를 이해하기 위해 시간을 투자할 가치가 있음
- 예: MVCC(Multi-Version Concurrency Control)의 복잡성 이해
- 간단한 CRUD 애플리케이션 개발, PostgreSQL 확장 기능 작성 등을 추천함
See also
Favorite site
- PostgreSQL web site
- [추천] 한국 포스트그레스큐엘 홈페이지
- Wikipedia (en) PostgreSQL에 대한 설명
- 한눈에 살펴보는 PostgreSQL 2
- PostgreSQL 특집 1) 설치 / JDBC 설치
- w3ii.com - PostgreSQL의 C / C ++ 인터페이스
- Slideshare - PostgreSQL로 배우는 SQL 기초
- [추천] Github - Awesome Postgres
- [추천] PostgreSQL INSERT 문 (DBeaver, PostgreSQL)
- PostgreSQL에서 테이블 만들기 기초
- PostgreSQL 14 Internals : Postgres Professional - PostgreSQL 14의 내부구조(스냅샷, 버퍼캐시, WAL, 잠금, 질의 실행, 각종 색인)에 대해 소개한 무료 이북
Article
- [원문] When Did Postgres Become Cool?
- Postgres가 멋있어지기(Cool) 시작한것은 2010년 Postgres 9.0 과 9.1 의 출시부터 였음
- listen/notify(DB에 대한 pub-sub) 지원
- hstore(키/밸류 데이터 타입)
- pg_upgrade를 통한 쉬운 업그레이드
- GIN/GiST 인덱스의 출시로 표준 B-Tree Index를 뛰어 넘음
- [원문] Just use Postgres
- [원문] Maciej Walkowiak | PostgreSQL and UUID as primary key
- 이 글은 "UUID가 키에 적합한 형식인가"에 초점을 맞추지 않고 PostgreSQL에서 UUID를 기본 키로 효율적으로 사용하는 방법에 대해 설명
- Postgres에서 Serial vs. Random UUID vs. Ordered UUID를 고려하기 전에 다른 많은 것들을 걱정해야 함
- [원문] OpenAI: Scaling PostgreSQL to the Next Level | PixelsTech
- OpenAI는 PostgreSQL을 샤딩 없이 사용하면서도 수억 명의 사용자 트래픽을 효과적으로 처리하는 방법을 PGConf.dev 2025에서 공유함
- 쓰기 병목 문제를 해결하기 위해 쓰기 분산, 쿼리 최적화, 스키마 관리 등 다양한 접근 방식을 도입함
- 주요 이슈로 MVCC 디자인의 테이블/인덱스 팽창, WAL로 인한 복제 지연 등 PostgreSQL 구조상의 한계와 운영 난점을 언급
- 읽기 부하 분산과 긴 트랜잭션 제한, ORM 최소화 등의 쿼리 최적화 전략이 핵심
- OpenAI는 지리적으로 분산된 40개 이상의 복제본을 통해 100만 QPS를 달성하고, 장애 발생 시에도 높은 가용성을 보장함
Guide
- 왜 PostgreSQL 을 선택 했나? ( PostgreSQL vs MySQL ) (번역)
- 한눈에 살펴보는 PostgreSQL
- Notion이 Postgres 샤딩하면서 배운 것들 | GeekNews
- VACUUM이 지속적으로 중단되기 시작했고, 곧 TXID wraparound 가 발생할 것으로 예상되어 샤딩 작업 시작
- (원문) Herding elephants: Lessons learned from sharding Postgres at Notion
- (원문) Index Merges vs Composite Indexes in Postgres and MySQL
- 컴포지트 인덱스가 인덱스 머지보다 10배 빠름. Postgres에서는 MySQL보다 그 차이가 더 큰데, Postgres가 인덱스 머지가 들어가는 쿼리에 대해서 인덱스-온리 스캔을 지원하지 않기 때문
- Postgres를 사용중이라면, 인덱스 머지 기능 사용에 유의할 것
Tip & Trick
- Postgres Tips | Crunchy Data
- Postgres Tips And Tricks - pgDash
- Custom Column for Auto-Updating updated_at in PostgreSQL (Duplicate) - Postgresql
- osom-db 항목에 여러 쿼리 있다.
- Postgres 메모리 설정을 최대한 활용하는 방법 | GeekNews