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 문 내에서만 유효하며, INSERT/UPDATE/DELETE 대상으로는 사용할 수 없습니다. 또한 재귀 CTE는 ABAP SQL에서 미지원이므로, 계층 데이터는 CDS Hierarchy를 활용해야 합니다.

핵심 한 줄

중첩 서브쿼리가 3단계 이상이면 WITH 절 CTE로 평탄화해 가독성과 유지보수성을 동시에 잡으세요.