CTE vs 서브쿼리 성능차이 #shorts #SAP #ABAP
Moderator
CTE란 무엇인가
CTE(Common Table Expression)는 ABAP SQL에서 WITH 절을 사용해 임시 결과 집합을 정의하는 기능입니다. 복잡한 중첩 서브쿼리를 평탄화해 가독성을 높이고, 동일 서브쿼리의 반복 작성을 줄여줍니다. ABAP 7.50 이상에서 지원되며, Open SQL과 ABAP CDS 모두에서 활용 가능합니다.
중첩 서브쿼리 방식
전통적인 방식은 SELECT 문 안에 또 다른 SELECT를 중첩해 작성합니다. 조건이 많아질수록 들여쓰기가 깊어지고 디버깅이 어려워집니다.
SELECT carrid, connid, SUM( seatsocc ) AS total_occ
FROM sflight
WHERE carrid IN ( SELECT carrid
FROM scarr
WHERE currcode = 'USD'
AND carrid IN ( SELECT carrid
FROM spfli
WHERE deptime > '080000' ) )
GROUP BY carrid, connid
INTO TABLE @DATA(lt_result).
위 코드는 USD 통화권 항공사 중 오전 출발 노선이 있는 항공사의 좌석 점유 합계를 구하지만, 의도가 한눈에 들어오지 않습니다.
CTE로 재작성
같은 로직을 WITH 절로 분해하면 단계별 의미가 명확해집니다.
WITH
+usd_carriers AS (
SELECT carrid FROM scarr
WHERE currcode = 'USD' ),
+morning_routes AS (
SELECT DISTINCT carrid FROM spfli
WHERE deptime > '080000' ),
+target_carriers AS (
SELECT u~carrid FROM +usd_carriers AS u
INNER JOIN +morning_routes AS m
ON u~carrid = m~carrid )
SELECT f~carrid, f~connid, SUM( f~seatsocc ) AS total_occ
FROM sflight AS f
INNER JOIN +target_carriers AS t
ON f~carrid = t~carrid
GROUP BY f~carrid, f~connid
INTO TABLE @DATA(lt_result).
각 CTE는 + 접두어로 시작하며, 위에서 정의한 CTE를 아래 CTE에서 참조할 수 있습니다.
가독성과 성능 비교
- 가독성: CTE는 단계별로 이름을 부여해 SQL이 자기 문서화됩니다.
- 재사용: 동일 서브쿼리를 여러 번 참조할 때 한 번만 정의하면 됩니다.
- 성능: HANA 옵티마이저가 CTE를 인라인 전개하므로 일반적으로 중첩 서브쿼리와 동등하거나 더 나은 실행 계획을 보입니다. 단, 데이터 양과 인덱스 상황에 따라 결과는 달라질 수 있어 ST05 트레이스로 확인이 권장됩니다.
- 유지보수: 중간 단계 디버깅 시 CTE 하나만 SELECT로 떼어내 검증하기 쉽습니다.
주의사항
CTE는 단일 SQL 문 내에서만 유효하며, INSERT/UPDATE/DELETE 대상으로는 사용할 수 없습니다. 또한 재귀 CTE는 ABAP SQL에서 미지원이므로, 계층 데이터는 CDS Hierarchy를 활용해야 합니다.
핵심 한 줄
중첩 서브쿼리가 3단계 이상이면 WITH 절 CTE로 평탄화해 가독성과 유지보수성을 동시에 잡으세요.