2025-10-26
1일 1아티클
Data Methods
SQL 안티패턴
배경
- 안티패턴 : 피해야 할 나쁜 습관/방식
- 쿼리, 데이터 파이프라인 유지보수 어려워짐
- 데이터 신뢰도 및 성능 저하
안티패턴 종류
- 과도한
CASE WHEN구문- 수백 개의 애플리케이션 상태 코드를 사람이 읽을 수 있는 값으로 변환하는 긴
CASE WHEN구문 필요한 상황 - 문제 : 빠르게 대시보드 생성을 위해, 이 긴 로직을 특정 대시보드 전용 View 안에 두는 것
- 근거 : 로직이 중앙화되지 않아 일관성을 잃고 재사용성 저하
- 해결책 : 별도의 차원 테이블이나 공용 뷰로 생성하여 관리
- 수백 개의 애플리케이션 상태 코드를 사람이 읽을 수 있는 값으로 변환하는 긴
- 인덱스가 걸린 컬럼에 함수 사용
- 인덱스가 설정된 컬럼을
WHERE절에서 조회하는 상황 - 문제 : 해당 컬럼에 함수 적용 (ex.
WHERE UPPER(name) = 'ABC') - 근거 : DB는 해당 컬럼의 원본 값을 기준으로 인덱스 생성, 이를 함수로 변형시킬 경우 인덱스 활용 불가
- 해결책 : 비교하려는 값을 변경하여 함수 사용 지양 / 필요시, 함수 기반 인덱스로 미리 생성
- 인덱스가 설정된 컬럼을
- View에서
SELECT *사용- 뷰를 만드는 상황
- 문제 : 편리하다는 이유만으로 모든 컬럼을 선택하는 쿼리를 사용하는 습관
- 근거 : 스키마 변경에 취약, 불필요한 리소스 낭비
- 해결책 : 뷰 생성 시 필요한 컬럼만 명시적으로 지정
- 중복 제거를 위한
DISTINCT남용- 잘못된 조인으로 중복 데이터 발생한 상황
- 문제 : 상황을 해결하고자
SELECT DISTINCT사용하여 덮어버리는 경우 - 근거 :
DISTINCT는 근본 원인을 무시하는 임시방편, 이후 집계 시 데이터 불일치 문제 발생 - 해결책 : 조인 로직 자체를 검토하고 수정하여 중복의 원인 제거
- 과도한 View 중첩
- 뷰를 만드는 상황
- 문제 : View A 기반으로 다른 View B 생성, View B 기반으로 다른 View C 생성, …
- 근거 : 의존성 관계 복잡도 증가로 관리 어려워짐, 성능 저하 및 디버깅 난도 상승
- 해결책 : 주기적으로 변환 로직 단순화, 무거운 로직은 테이블이나 구체화된 뷰로 생성
- 많은 일을 하는 중첩 서브쿼리
- 서브쿼리를 작성하는 상황
- 문제 : 서브쿼리를 3~4겹 이상 깊이 중첩하여 사용, 하나의 서브쿼리가 많은 필터링 및 집계 동시 처리
- 근거 : 쿼리 로직 복잡성 증가로 디버깅 난도 상승, 가독성 저하
- 해결책 : CTE(
WITH절) 사용으로 논리성 및 가독성 향상
작은 편법들이 시간이 지나며 쌓이는 것이 안티패턴. 처음부터 쿼리 명확성을 위해 몇 분 더 고민할 것!
오늘 배운 것
- AI 관통 프로젝트
- 파인튜닝(con.)
- 모델을 SOTA 버전으로 하고 싶었으나, 용량 문제 발생…