✅ WITH 절의 장점
- 가독성 향상
- 복잡한 서브쿼리를 미리 정의하고, 메인 쿼리에서 깔끔하게 사용할 수 있음.
- 중첩 서브쿼리보다 이해하기 쉬움.
⛔ 서브쿼리 사용 (복잡하고 가독성이 낮음)
SELECT e.name, d.department_name
FROM employees e
JOIN (
SELECT id, department_name FROM departments
) d ON e.department_id = d.id;
✅ WITH 절 사용 (더 직관적)
WITH dept AS (
SELECT id, department_name FROM departments
)
SELECT e.name, d.department_name
FROM employees e
JOIN dept d ON e.department_id = d.id;
2. 코드 재사용 가능
- 동일한 서브쿼리를 여러 번 사용해야 할 때, WITH 절을 사용하면 중복 방지 가능.
- SQL 실행 시 최적화되어 성능이 향상될 수도 있음.
3. 쿼리 최적화 가능 (일부 DBMS에서 Materialization 지원)
- 일부 DB에서는 WITH 절을 내부적으로 임시 테이블처럼 캐싱하여 여러 번 사용할 경우 성능이 향상됨.
- 하지만 모든 DBMS에서 최적화되는 것은 아님 (아래 단점 참고).
4. 재귀적 쿼리 작성 가능 (WITH RECURSIVE)
- 계층 구조(예: 트리 구조) 데이터를 다룰 때 매우 유용.
✅ 예제: 계층형 데이터(부서 구조) 조회
- 위 쿼리는 부모-자식 관계를 재귀적으로 조회하여 부서 계층 구조를 출력함.
WITH RECURSIVE dept_hierarchy AS (
SELECT id, department_name, parent_id, 1 AS level
FROM departments
WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.department_name, d.parent_id, dh.level + 1
FROM departments d
JOIN dept_hierarchy dh ON d.parent_id = dh.id
)
SELECT * FROM dept_hierarchy;
❌ WITH 절의 단점
- 일부 DBMS에서 성능 저하 발생
- WITH 절이 항상 최적화되는 것은 아님.
- 일부 DB에서는 WITH 절을 임시 테이블처럼 저장하지 않고 매번 실행하여 성능이 저하될 수 있음.
- 특히, WITH 절을 반복적으로 사용하는 경우 서브쿼리를 직접 조인하는 것이 더 빠를 수도 있음.
- 모든 DB에서 Materialization(임시 저장) 지원하지 않음
- PostgreSQL, MySQL 8.0 이상 → WITH 절을 임시 테이블처럼 저장 (Materialized)
- Oracle, SQL Server → WITH 절이 여러 번 사용될 경우, 매번 다시 실행됨 (비효율적).
- 해결 방법: 임시 테이블(TEMP TABLE)을 직접 생성하는 방법 고려.
- 대규모 데이터 처리에는 적합하지 않을 수 있음
- WITH 절이 대량의 데이터를 포함할 경우, 인덱스를 활용하지 못해 성능 저하가 발생할 수 있음.
- 대량 데이터 처리 시에는 임시 테이블(TEMP TABLE)을 활용하는 것이 더 유리할 수도 있음.
- DBMS별 지원 기능 차이 존재
- MySQL 8.0 이상, PostgreSQL, SQL Server, Oracle 등에서 지원.
- 하지만 MySQL 5.x 이하에서는 지원되지 않음.
- 또한, WITH RECURSIVE는 일부 DB에서만 지원됨.
💡 WITH 절을 사용할 때 고려할 점
- 단순한 서브쿼리는 WITH 절 없이 작성하는 것이 더 빠를 수도 있음.
- WITH 절이 여러 번 사용되면 성능을 테스트해야 함.
- 대량 데이터 처리에는 임시 테이블(TEMP TABLE) 활용 고려.
✅ WITH 절을 사용하면 좋은 경우:
✔ 복잡한 서브쿼리를 여러 번 사용할 때
✔ 가독성을 높이고 유지보수를 쉽게 하고 싶을 때
✔ WITH RECURSIVE를 활용하여 계층형 데이터를 다룰 때
❌ WITH 절 사용을 피해야 하는 경우:
✘ 데이터가 매우 많고 인덱스를 적극 활용해야 할 때
✘ 서브쿼리를 한 번만 사용하고 최적화가 필요할 때
📌 결론
- WITH 절은 코드 가독성을 높이고 재사용성을 증가시키는 강력한 기능
- 하지만 모든 경우에 최적화되지 않으므로, 성능 테스트가 필수
- DBMS별 최적화 방식이 다르므로 주의가 필요
'[DB]SQL실무' 카테고리의 다른 글
[기타]SQLSTATE=22001 오류 (0) | 2025.04.15 |
---|---|
[SQL]WITH 절 (1) | 2025.03.18 |
[DB2]가상 테이블(DUAL vs SYSDUMMY1) (0) | 2025.03.18 |
[SQL]Agent stack size 에러 (0) | 2025.03.18 |
DBMS별 숫자 형변환 함수 예시 (0) | 2025.03.07 |