TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
969594939291908988878685
Database
PostgreSQL 파티셔닝 — 수억 행 로그 테이블 다루기
큰 시계열 테이블을 RANGE 파티셔닝으로 나누기. 파티션 프루닝으로 조회를 빠르게, DROP으로 오래된 데이터를 즉시 지우는 실전 운영법을 담았습니다.
Database
pgvector — PostgreSQL로 벡터 검색·RAG 구현하기
PostgreSQL 안에서 임베딩 유사도 검색을 하는 pgvector. 거리 연산자 선택, HNSW 인덱스, 하이브리드·필터 검색까지 실전 관점으로 정리했습니다.
Database
prepared statement 플랜 캐시 — generic vs custom plan
빠르라고 넣은 prepared statement가 오히려 느려지는 이유. generic vs custom plan의 저울질, 편중 데이터의 함정, plan_cache_mode와 PgBouncer 조합까지.
Database
카디널리티 추정 — 플래너가 행 수를 예측하는 법
인덱스가 있는데 왜 안 탈까. 범인은 대개 틀린 행 수 추정입니다. pg_stats 통계와 EXPLAIN의 추정 대 실제, 확장 통계로 컬럼 상관을 바로잡는 법을 다룹니다.
Database
work_mem — 정렬과 해시가 디스크로 새는 순간
정렬·해시가 디스크로 스필하면 쿼리가 급격히 느려집니다. work_mem이 연산당이라는 함정, EXPLAIN으로 스필을 잡는 법, OOM 없이 안전하게 올리는 국소 튜닝.
Database
LISTEN/NOTIFY — PostgreSQL만으로 실시간 알림 구현하기
별도 메시지 브로커 없이 DB만으로 실시간 알림을. LISTEN/NOTIFY의 트랜잭션 결합·페이로드 한계와, 유실을 막는 아웃박스 패턴, 커넥션 풀 함정까지 정리했습니다.
Database
fillfactor — UPDATE 많은 테이블을 살리는 저장 옵션
페이지를 일부러 덜 채우는 fillfactor가 왜 UPDATE 헤비 테이블의 성능을 좌우할까. HOT 업데이트가 앉을 자리를 만드는 원리와 워크로드별 권장값, 검증법까지.
Database
HOT 업데이트 — 인덱스 쓰기를 건너뛰는 PostgreSQL 최적화
UPDATE 많은 테이블만 유독 인덱스가 부풀어 오른다면 HOT을 못 타는 겁니다. Heap-Only Tuple의 조건과 hot_pct 측정, 인덱스 다이어트·fillfactor로 끌어올리는 법.
Database
PostgreSQL MVCC — xmin·xmax와 스냅샷으로 보는 동시성
PostgreSQL의 UPDATE가 왜 테이블을 부풀리는지 궁금했다면. xmin·xmax 시스템 컬럼과 스냅샷으로 MVCC의 실제 동작과 블로트·wraparound라는 대가까지 파고듭니다.
Database
BRIN 인덱스 — 대용량 시계열에 맞는 초경량 인덱스
블록 범위의 min/max만 저장하는 초경량 BRIN 인덱스. B-트리와의 차이, 물리적 정렬 상관성이라는 전제, pages_per_range 튜닝과 함정을 시계열 관점으로 정리했다.
Database
UPSERT 완벽 정리 — INSERT ON CONFLICT와 MERGE
있으면 UPDATE 없으면 INSERT를 원자적으로 처리하는 UPSERT. ON CONFLICT·ON DUPLICATE KEY·MERGE 방언 비교와 EXCLUDED, 시퀀스 소모 같은 함정을 정리했다.
Database
머티리얼라이즈드 뷰 — 무거운 집계를 미리 계산해두기
무거운 집계·조인 결과를 저장해 조회를 빠르게 하는 머티리얼라이즈드 뷰. 일반 뷰와의 차이, REFRESH CONCURRENTLY 갱신 전략, 언제 쓰고 피할지 실무로 정리했다.