Database 94
- LATERAL 조인: 성능 기능이 아니라 스코프 규칙이다
- 실행계획은 하드웨어에서 어떻게 도는가: 페이지, 버퍼, work_mem
- PostgreSQL 실행계획 읽는 법: 트리, 숫자, 그리고 단위
- LIMIT에 들어가는 값의 타입을 의심하라
- 스키마도 버전 관리한다: 마이그레이션 도구의 내부
- 오래된 데이터를 지우는 안전한 방법
- 잘못 매핑된 이름을 일괄로 바로잡기 — 데이터 보정
- 느린 쿼리는 어떻게 잡아내는가
- 정규화를 깨야 빨라질 때
- 날짜 범위 조회에서 하루가 새는 이유
- 중복 INSERT를 막는 임시 적재 테이블
- 조인은 어떻게 실행되는가: 중첩루프부터 해시까지
- 가져온 데이터의 중복을 거르는 법
- 지우지 않고 제외했다가 되살리기 — 복원 가능한 제외
- 실행계획 읽는 법: 옵티마이저의 속마음
- DB 버전이 다르면 같은 쿼리가 깨진다 — PostgreSQL 버전 호환성
- 내보내기 도중 데이터가 바뀌면
- 격리수준: 더티리드부터 팬텀까지
- 중복 없는 개수 세기의 숨은 비용
- 한 방에 여러 행을 서로 다른 값으로 UPDATE 하기 — VALUES 조인 갱신
- '포함하지 않음' 필터의 함정 — 부정 조건과 NULL의 충돌
- 무거운 조회를 미리 계산해 두기 — 구체화 뷰와 요약 테이블
- 연관 데이터를 지울 때 따라 지워야 하나 — FK와 CASCADE의 양면
- 조인 컬럼 타입이 어긋나면 풀스캔이 난다 — 암묵적 형변환의 덫
- insert 후 생성된 PK를 돌려받는 법
- DB 컬럼에 JSON을 넣으면 생기는 일
- 컬럼이 너무 많은 테이블을 세로로 가르기
- 역할별 연관을 컬럼으로 둘까 연결 테이블로 둘까 — 다대다 모델링
- 조회 결과 30만 건이 메모리를 삼키기 전에
- 대소문자를 가리지 않는 검색의 비용 — collation과 함수 인덱스
- 반경 1km 안의 현장을 빠르게 — 거리 조건 쿼리의 함정
- 제약조건 설정 시 주의해야 할 부분
- 지도 화면에 보이는 만큼만 — 위경도 범위 조회와 인덱스
- 제약조건에 대해서 (PRIMARY KEY, UNIQUE, NOT NULL, CHECK)
- 텍스트 검색 최적화: phraseto_tsquery
- 끌어다 놓은 순서를 서버가 기억하게 하기 — 행 재정렬의 저장
- PostGIS 성능 비교: GEOMETRY vs TEXT 저장 방식
- 체크박스 여러 개로 거르는 필터를 쿼리로 옮기기
- PostGIS 설치 및 사용
- 있으면 수정 없으면 추가, 그 사이의 경쟁
- 배너 클릭을 세는 카운터를 만드는 법
- 주 단위 데이터 분석, DATE_TRUNC로 해결하기
- IN 절에 리스트를 넘길 때 생기는 일
- PostgreSQL B-tree 인덱스에 대해서
- 수정 이력을 버전으로 보관하는 설계
- 대량 저장에서 커밋 시점을 고르는 법
- 운영자가 끌어 정한 노출 순서를 저장하는 법
- 컬럼 기본값을 코드에서 줄까 DB에서 줄까
- 운영의 기술 + 현대 DB 지형 — 커넥션 풀부터 NewSQL·벡터·시계열까지
- INSERT 할 때 ID는 누가 만드나 — 시퀀스와 자동증가
- 캐싱과 일관성 — Redis를 앞에 두면 생기는 것들
- 상태가 바뀔 때마다 기록을 남기는 설계
- LIKE 검색은 왜 인덱스를 못 타는가
- NoSQL 지도 — Key-Value·Document·Wide-Column·Graph, 언제 무엇을
- 깊은 페이지에서 느려지는 진짜 이유와 keyset 페이징
- 분산 트랜잭션·CAP·합의 — 여러 노드가 하나처럼 합의하기
- 파티셔닝과 샤딩 — 테이블이 너무 커졌을 때
- 복제 — 한 대가 죽어도 살아남기 + 읽기를 여러 대로
- 플랜이 갑자기 느려졌어요 — 카디널리티 추정과 통계의 세계
- 실시간 집계와 사전 집계의 갈림길 — 신선도와 비용의 트레이드오프
- EXPLAIN을 읽는 법 + 조인 알고리즘 — Nested Loop·Hash·Merge
- 한 번의 쿼리로 여러 집계를 동시에 — 조건부 집계
- 결과를 다 모으지 말고 흘려보내기 — 커서와 fetchSize 스트리밍
- WAL과 크래시 복구 — 정전이 나도 데이터가 안 날아가는 이유
- 필요한 컬럼만 조회하면 빨라진다
- 잠금 — 행 락·테이블 락·2PL, 그리고 데드락은 왜 생기나
- MVCC 내부 — 읽기가 쓰기를 막지 않는 마법의 정체
- 격리 수준과 이상현상 — Dirty·Non-repeatable·Phantom, 그리고 그 너머
- WHERE 없는 UPDATE 한 줄의 공포
- 트랜잭션과 ACID — 원자성과 영속성은 대체 어떻게 보장되나
- B-Tree로 안 되는 것들 — Hash·GIN·GiST·BRIN 인덱스 지도
- 목록 화면이 느릴 때 의심할 첫 번째 범인
- 인덱스를 걸었는데 왜 안 타나 — 복합·커버링·부분·표현식 인덱스
- B-Tree 인덱스 — 어떻게 수억 건에서 한 건을 밀리초에 찾나
- 조인했더니 행이 사라지는 이유
- 중복을 코드가 아니라 DB가 막게 하라
- 디스크 위의 데이터 — 페이지·힙·로우는 어떻게 저장되나
- 삭제하지 않는 삭제: soft delete의 비용
- 집계 쿼리는 왜 느리고 어떻게 빨라지나
- SELECT 한 줄이 도는 길 — 파서·플래너·옵티마이저·익스큐터
- 관계형 모델과 정규화 — 왜 멀쩡한 표를 굳이 쪼개나
- 비관적 락과 SELECT FOR UPDATE
- 상태 코드 컬럼 설계: 매직넘버를 없애라
- SQL의 NULL은 거짓이 아니다
- 이 사용자가 흔적을 남겼나 — 존재 여부 컬럼을 만드는 법
- 데이터베이스란 무엇인가 — 왜 우리는 파일 대신 DBMS를 쓰는가
- 낙관적 락: 버전 컬럼 하나로 동시 수정 막기
- 총매출에서 환불을 빼는 집계 — 코드값을 명칭으로 바꾸기
- foreach 배치 insert: 1건씩 vs 한 방에
- 방문 통계에서 봇과 내부 계정을 걷어내기
- 접속 로그를 날짜로 잘라 내려받기 — 운영 감사 데이터 추출
- 어드민 대시보드 숫자는 어디서 계산되나 — 기능별 집계 카운트
- 복합 인덱스 컬럼 순서가 검색 속도를 가른다
- 검색과 페이징을 한 번에: 쿼리를 두 번 던지는 비용