#데이터베이스

28 편의 글

PostgreSQL 실전 강좌 #7 파티셔닝: 거대 테이블을 시간 단위로 나누기
4 분 소요

PostgreSQL 실전 강좌 #7 파티셔닝: 거대 테이블을 시간 단위로 나누기

수억 행 테이블의 표준 처방인 선언적 파티셔닝을 다룹니다. 파티셔닝이 실제로 해결하는 문제(오래된 데이터 삭제가 DROP 한 방·파티션 프루닝·VACUUM 부담 분산)와 해결하지 않는 문제, RANGE 파티셔닝으로 월별 테이블을 만드는 문법, 파티션 키가 PK에 포함되어야 하는 제약, 파티션 프루닝이 적용되는 쿼리 조건, 새 파티션을 계속 만들어야 하는 운영 부담과 pg_partman, 그리고 "언제 도입하는가"의 판단 기준까지 다루겠습니다.

PostgreSQL 실전 강좌 #6 잠금과 동시성: 데드락, DDL 락, SKIP LOCKED
4 분 소요

PostgreSQL 실전 강좌 #6 잠금과 동시성: 데드락, DDL 락, SKIP LOCKED

MVCC가 다 해결해 주지 않는 영역, 잠금을 다룹니다. 행 잠금(쓰기끼리의 충돌)과 테이블 잠금(DDL)의 층위, 잠금 대기를 pg_locks와 pg_blocking_pids로 추적하는 법, 데드락이 나는 구조(교차 순서 갱신)와 예방 규칙(같은 순서로 잡기), SELECT FOR UPDATE로 읽고-판단-쓰기를 안전하게 만드는 법, 그리고 작업 큐의 표준 패턴 FOR UPDATE SKIP LOCKED까지 다루겠습니다.

PostgreSQL 실전 강좌 #5 VACUUM과 autovacuum: dead tuple 청소의 원리와 튜닝
4 분 소요

PostgreSQL 실전 강좌 #5 VACUUM과 autovacuum: dead tuple 청소의 원리와 튜닝

PostgreSQL 운영 지식의 한가운데인 VACUUM을 다룹니다. MVCC가 남기는 dead tuple과 VACUUM이 하는 일(공간 재사용 표시·가시성 지도 갱신·트랜잭션 ID 되감기 방지), 보통은 autovacuum에 맡기면 되는 이유와 기본 문턱의 한계(큰 테이블일수록 청소가 늦음), 테이블별 스케일 팩터 조정, 청소를 방해하는 장기 트랜잭션, 블로트 확인 쿼리, 그리고 VACUUM FULL의 위험성까지 다루겠습니다.

PostgreSQL 실전 강좌 #4 인덱스 전략 심화: 부분·복합·커버링, 그리고 GIN·BRIN
4 분 소요

PostgreSQL 실전 강좌 #4 인덱스 전략 심화: 부분·복합·커버링, 그리고 GIN·BRIN

기초 4편의 B-tree 기본기 위에 실전 전략을 쌓습니다. WHERE 조건까지 인덱스에 넣는 부분 인덱스, 테이블 접근을 생략하는 커버링 인덱스(INCLUDE)와 Index Only Scan의 조건, B-tree 밖의 선택지(GIN·GiST·BRIN)를 고르는 기준, 안 쓰는 인덱스를 pg_stat_user_indexes로 찾아 정리하는 법, 인덱스 블로트와 REINDEX CONCURRENTLY까지 다루겠습니다.

PostgreSQL 실전 강좌 #3 성능 진단 루틴: pg_stat_statements로 느린 쿼리 찾기
4 분 소요

PostgreSQL 실전 강좌 #3 성능 진단 루틴: pg_stat_statements로 느린 쿼리 찾기

"DB가 느려요"에서 출발해 범인 쿼리까지 도달하는 표준 루틴을 만듭니다. 지금 무슨 일이 벌어지는지 보는 pg_stat_activity(활성 쿼리·대기·오래 걸리는 트랜잭션), 누적 통계로 비싼 쿼리를 찾는 pg_stat_statements의 설치와 핵심 컬럼(total_exec_time·mean_exec_time·calls), 총합 상위와 평균 상위의 다른 의미, 느린 쿼리 로그(log_min_duration_statement) 설정, 그리고 EXPLAIN으로 넘기는 연결까지 다루겠습니다.

PostgreSQL 실전 강좌 #2 커넥션 풀: max_connections의 오해와 PgBouncer
4 분 소요

PostgreSQL 실전 강좌 #2 커넥션 풀: max_connections의 오해와 PgBouncer

트래픽이 늘면 반드시 만나는 커넥션 문제를 다룹니다. PostgreSQL 커넥션이 프로세스 하나라서 비싼 이유, max_connections를 올리는 것이 답이 아닌 이유(많은 커넥션은 오히려 처리량을 떨어뜨립니다), 애플리케이션 풀과 PgBouncer 같은 외부 풀러의 역할 분담, PgBouncer transaction 모드의 효과와 제약(세션 상태 기능 사용 불가), 그리고 적정 풀 크기의 감각까지 다루겠습니다.

PostgreSQL 실전 강좌 #1 스키마 마이그레이션: 서비스 중단 없이 테이블 바꾸기
4 분 소요

PostgreSQL 실전 강좌 #1 스키마 마이그레이션: 서비스 중단 없이 테이블 바꾸기

실전 편의 시작은 운영 중인 테이블을 바꾸는 기술입니다. 마이그레이션을 코드로 관리해야 하는 이유(순서·재현성), DDL도 트랜잭션이 되는 PostgreSQL의 강점, 잠금을 오래 잡는 위험한 변경과 안전한 변경의 구분, NOT NULL 추가를 단계로 쪼개는 법, CREATE INDEX CONCURRENTLY, 그리고 컬럼 개명·타입 변경을 확장-이관-축소(expand-contract)로 푸는 전략까지 다루겠습니다.

PostgreSQL 기초 강좌 #9 롤·권한·백업 기초: 운영의 최소 규율
4 분 소요

PostgreSQL 기초 강좌 #9 롤·권한·백업 기초: 운영의 최소 규율

기초 강좌의 마무리로 운영에 필요한 최소 규율을 정리합니다. 롤(role) 하나로 사용자와 그룹을 통일한 PostgreSQL의 권한 모델, 애플리케이션에 superuser를 주지 않고 최소 권한 계정을 만드는 실전 순서(GRANT와 기본 권한), public 스키마의 주의점, pg_dump·pg_restore로 하는 논리 백업과 복원 리허설의 중요성, 그리고 기초 9편의 회고와 실전 편 예고까지 다루겠습니다.

PostgreSQL 기초 강좌 #8 뷰·CTE·윈도 함수: 복잡한 쿼리를 읽기 쉽게
4 분 소요

PostgreSQL 기초 강좌 #8 뷰·CTE·윈도 함수: 복잡한 쿼리를 읽기 쉽게

커진 쿼리를 구조화하는 세 가지 도구를 다룹니다. 반복되는 쿼리에 이름을 붙이는 뷰와 물리 사본인 구체화 뷰의 구분, WITH 절(CTE)로 쿼리를 단계별로 서술하는 법, 윈도 함수의 기본 구조(OVER, PARTITION BY)와 ROW_NUMBER로 그룹별 상위 N건을 뽑는 대표 패턴, 집계 함수와 윈도 함수의 차이(행이 줄지 않음), LAG로 전월 대비를 구하는 예까지 다루겠습니다.

SQLAlchemy 2.0 #7 Alembic과 실전 구성: 마이그레이션, 비동기, 팀 규약
6 분 소요

SQLAlchemy 2.0 #7 Alembic과 실전 구성: 마이그레이션, 비동기, 팀 규약

시리즈 마지막 편으로 운영 단계의 주제를 정리합니다. create_all이 스키마 변경을 해결하지 못하는 이유와 Alembic 도입, autogenerate가 감지하는 것과 놓치는 것, 마이그레이션 파일 리뷰 원칙, create_async_engine과 AsyncSession으로 넘어가는 비동기 구성과 지연 로딩 제약, 모델·세션·설정을 배치하는 프로젝트 구조, 팀에서 지킬 규약까지 다룹니다.

PostgreSQL 기초 강좌 #7 JSONB: 관계형 데이터베이스에 유연함 더하기
4 분 소요

PostgreSQL 기초 강좌 #7 JSONB: 관계형 데이터베이스에 유연함 더하기

PostgreSQL이 NoSQL의 자리까지 넘보게 만든 JSONB를 다룹니다. json과 jsonb의 차이(jsonb가 기본값인 이유), 값 꺼내기 연산자(->, ->>, #>>)와 존재·포함 연산자(?, @>)의 사용법, JSONB 검색을 받치는 GIN 인덱스, 갱신(jsonb_set)의 특성, 그리고 가장 중요한 "어디까지 컬럼으로 두고 어디부터 JSONB에 넣는가"의 설계 경계까지 다루겠습니다.

SQLAlchemy 2.0 #6 쿼리 심화: 조인, 집계, 서브쿼리, 대량 처리
5 분 소요

SQLAlchemy 2.0 #6 쿼리 심화: 조인, 집계, 서브쿼리, 대량 처리

select() 하나로 실전 쿼리를 조립하는 법을 정리합니다. scalars와 execute의 반환 형태 차이, 여러 조건과 or_, 조인과 명시적 ON 절, group_by와 집계 함수에 라벨을 붙여 읽는 법, 서브쿼리와 EXISTS, LIMIT·OFFSET 페이지네이션과 그 한계, ORM 단위 작업을 우회하는 대량 INSERT·UPDATE까지, 2.0 스타일 쿼리의 실무 레퍼토리를 다룹니다.