All Day Tired

CTE 본문

Back/DB

CTE

yu.dev 2024. 9. 3. 15:42

쿼리를 짜는데 검색하고 검색하다 보니 CTE라고 처음 보게 되어서 정리.

 

CTE : Common Table Expression
  • 공통 테이블 표현식, 일반 테이블 표현식 등으로 불림
  • with절을 사용하여 정의
  • with절을 통해서 뽑아내고 싶은 결과를 임시의 테이블로 정의한다고 보면 됨(결과의 집합)
  • 보통 트리구조로 select할 때 많이 쓰임

이러한 특징으로 view와 비교를 많이 함

 

CTE vs View
  CTE View
유효 범위 쿼리 내로 제한
쿼리가 실행되는 동안만 존재하고, 쿼리가 끝나면 사라짐
주로 단일 쿼리에서 여러 번 참조되거나 복잡한 쿼리의 일부분으로 사용
데이터베이스에 영구적으로 저장
일단 생성되면, 데이터베이스의 다른 모든 쿼리에서 참조
여러 쿼리에서 반복적으로 사용 OK
재사용성 제한적
동일 쿼리 내에서만 재사용
다른 쿼리에서 다시 사용하려면 CTE를 재정의 필
여러 쿼리에서 재사용
(데이터베이스에 저장되기 때문)

성능 영향 인라인화되어 실행
성능에 큰 영향 X
재귀적 CTE의 경우 큰 데이터를 처리할 때 성능에 영향
참조할 때마다 쿼리가 실행
복잡한 뷰나 중첩된 뷰는 성능에 영향
물리적 뷰(Materialized View)를 사용할 경우, 데이터가 미리 계산되어 저장되므로 성능 향상
갱신 가능성 단순히 쿼리의 일부분
갱신(INSERT, UPDATE, DELETE)을 지원 X
단순한 뷰는 데이터 갱신이 가능
복잡한 뷰(예: 조인, 집계 함수 포함)는 갱신이 불가능할 수도
특정 조건을 만족하면 INSTEAD OF 트리거를 통해 갱신 가능

 

 

CTE는 with절로 쓰인다는데 그러면 with절의 문법?

with절
WITH 
     별칭1 AS (
               SELECT
                      컬럼명1
                    , 컬럼명2
                    , ...
                 FROM 테이블명1
              )
   , 별칭2 AS (
               SELECT 
                      컬럼명1
                    , 컬럼명2
                    , ...
                 FROM 테이블명2
              )
SELECT 
       컬럼명1
     , 컬럼명2 
  FROM 별칭1
     , 별칭2
 WHERE 별칭1.컬럼명1 = 별칭2.컬럼명1;
Comments