고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
Index 활용 여부 | WHERE/JOIN 조건이 인덱스를 탈 수 있는가 | 인덱스를 무력화하는 연산 사용 |
Partition Pruning | 파티션 키를 조건에 넣어야 함 | 파티션 범위 제한 실패로 전체 스캔 |
Clustering / Z-ordering | 물리 저장 순서와 쿼리 패턴 일치 여부 | 분산 스캔으로 I/O 증가 |
필터 조건 위치 | WHERE에서 조기 필터링 가능 여부 | 늦은 필터링으로 불필요한 처리 발생 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
JOIN 순서 | 작은 테이블을 먼저 읽는 구조가 유리 | 큰 테이블 선조인으로 리소스 낭비 |
JOIN 방식 | 해시, 중첩 루프 등 방식의 적절성 | 인덱스 없이 전수 비교 발생 |
중복된 조인 제거 | 동일 서브쿼리를 반복해서 JOIN | 중복 계산으로 성능 저하 유발 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
Group Key Cardinality | 그룹핑 키의 고유값 수 크기 | 메모리 기반 해시 테이블 과부하 |
Pre-Aggregation | 미리 요약된 결과를 쓸 수 있는가 | 불필요한 raw 데이터 집계 발생 |
중첩 Aggregation | 복수 집계 함수 중첩 사용 여부 | 중간 결과 반복 처리로 부담 증가 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
함수 위치 | WHERE, JOIN, GROUP BY 내부 함수 여부 | 인덱스 무력화로 전량 스캔 발생 |
중복 계산 제거 | 동일 표현식 재사용 여부 | 반복 계산으로 CPU 과부하 유발 |
복잡한 UDF / Regex / JSON | 고비용 연산 함수의 다량 호출 여부 | 함수 반복 호출로 CPU 병목 발생 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
SELECT * 사용 여부 | 모든 컬럼을 가져오는지 여부 | 불필요한 컬럼까지 I/O 발생 |
Wide Table 처리 여부 | 컬럼 수가 매우 많은 테이블 여부 | 디코딩 비용 증가로 CPU 부담 |
Row 수 / Table Size | 테이블 행 수가 많은 경우 | 기본 Scan만으로도 응답 지연 초래 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
Full Table Scan | 테이블 전체를 순차적으로 탐색 | 필터 부재로 인한 전체 스캔 발생 |
Temp Table / Spill | 메모리 부족 시 디스크 사용 여부 | 정렬, 조인 중 디스크 I/O 증가 |
Shuffle 발생 (분산환경) | 노드 간 데이터 재배치 유무 | 네트워크 전송량 급증으로 병목 발생 |
고려 요소 | 설명 | 성능 저하 유발 원인 |
---|---|---|
컬럼형 포맷 사용 여부 | 필요한 컬럼만 읽을 수 있는 구조인지 | Row 포맷 사용으로 전체 읽기 유발 |
파일 사이즈/분할 수 | 적절한 크기와 병렬성 유지 여부 | 너무 작은 파일로 Executor 낭비 |
데이터 스키마 변경 | 스키마 진화 및 호환성 처리 여부 | 스키마 병합 과정에서 I/O 증가 |
고려 요소 | 좋은 습관 | 나쁜 습관 |
---|---|---|
필터 조건 먼저 작성 | WHERE → JOIN → GROUP BY 순서 유지 | 필터 없이 모든 데이터 JOIN |
CTE / TEMP TABLE로 쿼리 분리 | 가독성과 디버깅 용이 | 긴 서브쿼리 중첩으로 유지보수 어려움 |
Explain Plan 자주 확인 | 사전 성능 예측 가능 | 결과만 보고 성능 판단 |