QUERY TRIAGE
느린 조회는 네 질문으로 먼저 좁힌다
인덱스, N+1, 페이지네이션, projection은 대부분의 NestJS ORM 병목을 빠르게 분류하는 1차 판단 기준이다.
얼마나 많이 읽는가
rows read와 반환 row 수를 분리해서 본다.
몇 번 왕복하는가
같은 SQL 반복과 관계 로딩 방식을 본다.
무엇을 반환하는가
화면에 없는 컬럼과 관계를 줄인다.
Index
신호
WHERE/ORDER BY가 큰 scan을 만든다.
해결
필터 순서에 맞는 단일 또는 복합 인덱스.
주의
쓰기 비용과 저장 공간 증가.
N+1
신호
목록 조회 뒤 같은 SQL이 반복된다.
해결
명시적 join 또는 batch loading.
주의
불필요한 eager loading은 다른 병목.
Pagination
신호
대량 row를 한 번에 가져온다.
해결
limit/offset 또는 cursor 방식.
주의
안정적인 정렬 기준이 필요.
Projection
신호
SELECT *와 큰 컬럼이 응답을 키운다.
해결
select와 DTO로 필요한 값만 반환.
주의
누락 컬럼으로 추가 조회가 생기지 않게.
1. 로그
반복 SQL과 느린 SQL을 찾는다.
2. 계획
EXPLAIN으로 rows와 index를 본다.
3. 변경
가장 작은 레버부터 바꾼다.
4. 검증
전후 지표가 좋아졌는지 확인한다.