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. 검증전후 지표가 좋아졌는지 확인한다.