✅ WITH 절의 장점

  1. 가독성 향상
    • 복잡한 서브쿼리를 미리 정의하고, 메인 쿼리에서 깔끔하게 사용할 수 있음.
    • 중첩 서브쿼리보다 이해하기 쉬움.
    예제 (서브쿼리 vs 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 절의 단점

  1. 일부 DBMS에서 성능 저하 발생
    • WITH 절이 항상 최적화되는 것은 아님.
    • 일부 DB에서는 WITH 절을 임시 테이블처럼 저장하지 않고 매번 실행하여 성능이 저하될 수 있음.
    • 특히, WITH 절을 반복적으로 사용하는 경우 서브쿼리를 직접 조인하는 것이 더 빠를 수도 있음.
  2. 모든 DB에서 Materialization(임시 저장) 지원하지 않음
    • PostgreSQL, MySQL 8.0 이상 → WITH 절을 임시 테이블처럼 저장 (Materialized)
    • Oracle, SQL Server → WITH 절이 여러 번 사용될 경우, 매번 다시 실행됨 (비효율적).
    • 해결 방법: 임시 테이블(TEMP TABLE)을 직접 생성하는 방법 고려.
  3. 대규모 데이터 처리에는 적합하지 않을 수 있음
    • WITH 절이 대량의 데이터를 포함할 경우, 인덱스를 활용하지 못해 성능 저하가 발생할 수 있음.
    • 대량 데이터 처리 시에는 임시 테이블(TEMP TABLE)을 활용하는 것이 더 유리할 수도 있음.
  4. 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

+ Recent posts