[Database] 임시 테이블 VS CTE
개요
2025.02.18-[MySQL] Temporary Table에서 임시 테이블이라는 개념을 살펴보았는데, 비슷한 개념으로 WITH문을 사용하는 CTE (2022.06.01-[MySQL] WITH - 임시 테이블 생성)가 존재한다.
이번 글에서는 두 개념 사이에 어떤 차이점이 존재하는지 살펴보려고 한다.
임시 테이블과 CTE
CTE
WITH CTE_Name (Column1, Column2, ...) AS (
SELECT Column1, Column2
FROM TableName
WHERE Condition
)
SELECT * FROM CTE_Name;
단일 SELECT, INSERT, UPDATE, DELETE 문 실행 범위 내에서 정의된 임시 결과 집합. 복잡한 서브쿼리의 결과일 수도 있다. WITH문을 사용하여 정의하고 현재 쿼리 내에서만 수명이 유지된다.
CTE를 적절히 사용하면 복잡한 쿼리 및 서브쿼리의 가독성을 개선할 수 있다. 또한 재귀적 쿼리를 만들 수 있다.
참고로 함수, 프로시저, 트리거, 뷰도 CTE로 정의할 수 있고, 테이블이 뷰로 정의한 후에는 데이터 조회, 삽입, 갱신, 삭제 등의 작업을 수행할 수 있다.
임시 테이블
CREATE TABLE TempTable (
Column1 INT,
Column2 NVARCHAR(50)
);
INSERT INTO TempTable
SELECT Column1, Column2
FROM TableName
WHERE Condition;
세션이나 트랜잭션 중에 데이터를 임시로 저장하는 데이터베이스 객체. 재사용이 필요한 대규모 데이터셋이나 중간 결과를 처리하는데 유용하다.
임시 테이블은 대체로 일반 테이블에서 할 수 있는 모든 작업을 지원한다.
임시 데이터를 격리하여 다른 사용자 세션이나 일반 테이블에 영향을 주지 않고 작업을 수행할 수 있다. 또한, 복잡한 쿼리는 중간 결과를 저장하여 사용하면 성능 및 가독성 개선에 도움이 된다.
차이점
CTE와 임시 테이블 간의 차이점을 표로 표현하면 다음과 같다.
CTE | 임시 테이블 | |
정의 | WITH 문을 사용 | CREATE TEMPORARY TABLE 문 사용 |
지속성 | 쿼리 실행 중에 존재한다. | 세션 또는 트랜잭션 동안 존재한다. |
성능 | 더 작은 데이터를 다룰 때 적합 재귀 논리는 사용할 때 효율적 |
큰 데이터를 다룰 때 적합 |
재귀 | 지원 | 미지원 |
특징 | 가독성, 유지 관리성 향상 쿼리 내 재사용 가능 |
인덱스, 제약 조건, 통계 지원 |
요약하면 CTE와 임시 테이블 모두 쿼리 중간 결과를 저장하는 등의 용도로 사용하여 쿼리 가독성을 개선할 수 있다.
하지만 CTE는 쿼리 수행 동안만 존재하며, 적은 데이터 그리고 재귀적인 논리를 사용할 때 적합한 반면, 임시 테이블은 세선이 유지되는 동안 존재하고 큰 데이터를 다룰 때 적합하다.
즉, 큰 데이터를 다룰 때에는 CTE를 사용하는 것이 도리어 쿼리 성능 저하를 부를 수 있다. 때문에 상황에 맞게 적절히 사용하는 것이 중요하다.
참고 문서
https://www.geeksforgeeks.org/difference-between-cte-and-temp-table-in-sql/
https://stackoverflow.com/questions/690465/which-are-more-performant-cte-or-temporary-tables