1. 과도하게 복잡한 CASE WHEN 구문
빠른 개발을 위해 하나의 VIEW에만 CASE WHEN 로직을 다량으로 추가하는 것은 장기적으로 안티패턴에 해당함
이는 중복 로직 복사/붙여넣기, 해석 불일치 문제를 유발하여 전체 쿼리 환경을 난잡하게 만듦
- 해결책
차원 테이블 (dimension table) 또는 공용 뷰를 별도로 만들어 재사용성을 확보
2. 인덱스 컬럼에서 함수 사용
"WHERE UPPER(name) = 'ABC'" 처럼 인덱스가 걸린 함수에 함수를 적용하면 인덱스 효율이 사라짐 (full scan 발생 가능)
- 해결책
함수 적용 컬럼을 별도로 인덱싱하거나 입력 값을 변환해 쿼리 조건을 단순화
3. 뷰에서 SELECT * 사용
SELECT * 을 사용하면 편해보이지만 스키마가 변경되면 뷰가 쉽게 깨질 수 있음
불필요한 컬럼까지 포함돼 의도치 않은 의존성 및 성능 문제가 발생
- 해결책
SELCT 시 명시적으로 컬럼을 선택해야함
4. DISTINCT 남용으로 중복 문제 "해결"
잘못된 JOIN으로 중복된 결과가 발생할 때 SELECT DISTINCT로 임시 해결하는 것은 데이터 무결성 문제를 감춤
근본 원인은 조인 조건의 불완전함이나 관계 정의(1:1, N:N) 오류
- 해결책
JOIN 로직 보강을 통해 관계 정의를 명확화하고 집계나 리포트 이전에 관계 정합성을 확보
5. 뷰 중첩 (Excessive View Later Staking)
여러 팀이 기존 뷰를 재활용하여 새로운 뷰를 계속 쌓을 경우 종속성 체인이 복잡해지고 성능이 급격히 저하됨
- 해결책
주기적으로 변환 로직을 평탄화(flatten)하고 복잡한 연산은 명확한 베이스 뷰나 테이블로 머티리얼라이즈(matrialize) 하는 전략이 필요함
6. 과도한 깊이의 서브쿼리
3~4단계 이상으로 깊게 중첩된 서브쿼리는 가독성을 떨어트리고 디버깅을 어렵게 함
- 해결책
CTE (Common Table Expression)를 활용하면 논리적 단계 구분이 쉬워지고 쿼리의 명확성이 높아짐
Reference
https://news.hada.io/topic?id=23756
피해야 할 SQL 안티패턴들 | GeekNews
SQL 안티패턴은 쿼리와 데이터 파이프라인의 유지보수를 어렵게 하고, 예상보다 느린 성능을 유발함CASE WHEN 남용, 인덱스 컬럼에 함수 적용, SELECT *, DISTINCT 남용, 중첩된 뷰와 서브쿼리, 깊은 의존
news.hada.io
'Database > MySQL' 카테고리의 다른 글
| MariaDB Galera Cluster에 대해 알아보자 (0) | 2025.12.08 |
|---|---|
| SQL을 떠나고 싶지만 떠날 수 없는 이유 13가지 (0) | 2025.10.19 |
| mariaDB 터미널 모니터링 (0) | 2025.02.02 |
| mySQL 날짜 속성 비교 (DATE / DATETIME / TIME / TIMESTAMP) (0) | 2024.11.30 |
| SQL 문장 가독성 향상 방법 (7) | 2024.09.28 |