TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
888786858483828180797877
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 갱신 전략, 언제 쓰고 피할지 실무로 정리했다.
Database
부분 인덱스 — WHERE로 인덱스를 작게 만드는 기술
WHERE 조건으로 일부 행만 인덱싱하는 부분 인덱스. 소프트 삭제 유니크, 치우친 상태값 최적화 등 실전 사례와 immutable 조건 같은 함정을 정리했다.
Database
EXPLAIN ANALYZE로 실행계획 읽기 — 느린 쿼리를 눈으로 잡기
EXPLAIN ANALYZE로 데이터베이스가 쿼리를 실제 어떻게 실행했는지 읽는 법 — actual time·rows 추정치·스캔 종류를 보고 느린 쿼리를 감이 아니라 근거로 잡는다.
Database
PostgreSQL 전문검색 — tsvector·GIN으로 검색 만들기
LIKE의 한계를 넘어 PostgreSQL 내장 전문검색으로 빠른 검색 만들기. tsvector·tsquery·GIN 인덱스, ts_rank 랭킹, 한국어 형태소 처리까지 실무 흐름으로 설명한다.
Database
커버링 인덱스 — SELECT가 테이블을 아예 안 읽게 만들기
커버링 인덱스로 Index Only Scan을 유도해 테이블 힙 페치를 없애는 법. INCLUDE 절, 키 컬럼과의 차이, Heap Fetches가 0이 안 되는 이유까지 실무 관점으로 정리했다.
Database
무중단으로 컬럼 추가하기 — 안전한 마이그레이션
NOT NULL+DEFAULT를 큰 테이블에 한 번에 걸면 잠금으로 장애가 난다. 단계적(expand-contract) 마이그레이션 절차.
Database
EXPLAIN ANALYZE 읽는 법 — 느린 쿼리 진단
Seq Scan·Nested Loop·actual time·rows 추정 오차. EXPLAIN ANALYZE에서 진짜 병목을 찾는 읽기 순서.
Database
복합 인덱스 컬럼 순서, 왜 중요한가
복합 인덱스 (a,b)는 a로 시작하는 조건엔 쓰이지만 b만으론 못 탄다. 등호·범위·정렬을 고려한 순서 설계.
Database
DB 커넥션 풀 사이즈, 크게 잡을수록 좋은 게 아니다
풀을 무작정 키우면 DB가 컨텍스트 스위칭으로 더 느려진다. 코어 수 기반 공식과 서버리스 환경의 함정.