스마트웹앱콘텐츠전문가/Oracle

CTE로 SQL 쿼리 간결하게 작성하기 – 성능 최적화와 재귀 쿼리 활용법

9D4U 2025. 5. 7. 17:46
728x90
반응형

SQL에서 복잡한 쿼리를 효율적으로 작성하고, 가독성과 유지보수성을 높이기 위한 방법 중 하나가

바로 CTE(Common Table Expression)입니다.

 

 

이 글에서는 CTE의 개념, 사용법, 장단점, 실전 예제까지 자세히 설명드릴게요.

 

 

 

 

 

 


📌 CTE란? Common Table Expression의 정의

 

 

CTE(Common Table Expression)는 SQL에서 사용되는 임시 결과 집합입니다. 이는 쿼리 시작 시 WITH 키워드를 사용해 선언하며, 이후의 메인 SELECT 쿼리에서 마치 테이블처럼 사용할 수 있습니다.

CTE는 복잡한 서브쿼리를 깔끔하게 정리할 수 있어, SQL 코드의 가독성 향상, 중복 제거, 재귀적 데이터 처리 등에 유용하게 활용됩니다.

 

 

 

img

 


🔍 CTE 문법 구조

 

 

기본적인 CTE 문법은 다음과 같습니다:

 

WITH cte_name AS (
    SELECT ...
    FROM ...
    WHERE ...
)
SELECT *
FROM cte_name;

 

✅ 예시: 급여가 높은 직원 조회

 

WITH high_salary_employees AS (
    SELECT emp_id, name, salary
    FROM employees
    WHERE salary > 100000
)
SELECT name
FROM high_salary_employees
WHERE name LIKE 'J%';

 

 

 

 

 

 


💡 CTE를 사용해야 하는 이유

 

 

1. 가독성 향상

복잡한 쿼리를 여러 개의 CTE로 나눠 구성하면 SQL 문이 훨씬 읽기 쉬워집니다.

 

 

2. 서브쿼리 중복 제거

같은 서브쿼리를 반복해서 사용할 필요 없이, CTE 한 번 정의로 여러 번 참조 가능(일부 DBMS 지원).

 

 

3. 재귀 쿼리 처리 가능

조직도, 트리 구조 등 계층형 데이터를 재귀적으로 처리할 수 있는 구조를 제공합니다.

 

 

4. 중간 결과 디버깅에 용이

CTE는 마치 테이블처럼 SELECT가 가능하므로 중간 데이터를 추적하고 디버깅하기가 쉽습니다.

 

 

 

 

 

 

반응형

 

 

 

 


🔁 재귀 CTE 예제: 조직도 계층 조회

 

 

WITH RECURSIVE org_chart AS (
    SELECT emp_id, manager_id, name, 1 AS level
    FROM employees
    WHERE manager_id IS NULL  -- 최고 관리자

    UNION ALL

    SELECT e.emp_id, e.manager_id, e.name, o.level + 1
    FROM employees e
    JOIN org_chart o ON e.manager_id = o.emp_id
)
SELECT *
FROM org_chart;

 

이 방식은 자기 자신을 반복 호출(재귀)하여 트리 구조의 데이터를 쉽게 탐색합니다.

 

 

 

 

 


⚠️ CTE 사용 시 주의할 점

 

 

  • 성능 이슈: 일부 DBMS에서는 CTE가 인라인 뷰보다 느릴 수 있습니다. 특히 재귀 CTE의 경우 인덱스를 타지 못하는 경우가 있으므로 실행 계획을 꼭 확인하세요.
  • 데이터 재사용: Oracle에서는 CTE가 사실상 인라인 뷰처럼 작동해 여러 번 참조해도 실행이 중복되지만, PostgreSQL은 결과를 캐시하므로 성능에 유리할 수 있습니다.

 

 

 

 


✅ 일반 서브쿼리 vs CTE

 

비교 항목 서브쿼리 CTE

 

위치 FROM, WHERE 등 내부 쿼리 시작 시 정의
재사용성 한 번만 사용 가능 일부 DBMS에서 여러 번 사용 가능
재귀 처리 불가능 가능
가독성 복잡할수록 떨어짐 구조화 가능

 

 

 

 

 

 


🧩 CTE vs VIEW vs TEMP TABLE

 

  • VIEW: 저장되고 재사용 가능하지만 동적으로 파라미터 전달이 어려움
  • TEMP TABLE: 물리적 테이블로 만들어지므로 디스크 사용
  • CTE: 쿼리 단위에서만 유효하며 가볍고 빠름

 

 

 

 


🔚 CTE를 적극적으로 활용해보세요!

 

CTE(Common Table Expression)는 SQL 쿼리를 보다 효율적이고 가독성 높게 작성할 수 있게 해주는 매우 강력한 기능입니다. 특히 PostgreSQL, Oracle, SQL Server와 같은 최신 데이터베이스에서는 CTE를 사용한 쿼리 작성이 실무에서도 활발히 쓰이고 있습니다.

복잡한 로직이 많은 쿼리라면, 지금부터라도 CTE를 적극적으로 도입해 보세요. 성능 이슈만 주의한다면 개발 생산성과 유지보수성 모두 향상됩니다.

728x90