CTE, 하위 쿼리와 임시 표 비교하기
구체화, 재사용, 최적화 도구 동작의 장단점을 비교합니다.
CTE, 하위 쿼리와 임시 표 비교하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
로직을 구성하는 세 가지 방법
쿼리에 중간 결과가 필요할 때 사용할 수 있는 일반적인 도구는 하위 쿼리, CTE, 임시 테이블의 세 가지입니다. 면접관이 이들을 비교하게 하는 이유는 선택한 도구를 통해 물리화와 최적화기 동작을 이해하고 있는지 확인할 수 있기 때문입니다.
이 레슨에서는 긴장되는 상황에서도 말로 설명할 수 있는 의사 결정 체계를 만들어 드립니다.
하위 쿼리
하위 쿼리는 다른 쿼리 안에 중첩된 인라인 쿼리이며, FROM, WHERE 또는 SELECT 안에 작성되는 경우가 많습니다. 같은 문에 포함되며 최적화기는 이를 하나의 단위로 인식합니다.
- 이름이 필요하지 않습니다. 단, 파생 테이블에는 별칭이 필요합니다.
- 최적화기는 이를 바깥쪽 쿼리에 자유롭게 병합할 수 있습니다.
- 깊게 중첩되면 길어지고 읽기 어려워집니다.
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) t
WHERE t.total > 1000;CTE
CTE는 WITH 블록 안에 작성하는 이름이 지정된 하위 쿼리이며, 범위는 하나의 문으로 제한됩니다. 깊게 중첩된 하위 쿼리보다 읽기 쉽고 여러 번 참조할 수 있습니다.
- 이름이 지정되므로 의도가 문서화됩니다.
- 같은 문에서 한 번 이상 참조할 수 있습니다.
- 여전히 하나의 문에만 범위가 제한되며, 문이 끝나면 사라집니다.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;임시 테이블
임시 테이블은 세션 또는 트랜잭션 동안 존재하는 실제 물리적 테이블입니다. 하나의 문으로 데이터를 채운 다음, 이후의 서로 다른 문에서 조회할 수 있습니다.
- 세션 내 여러 문에 걸쳐 유지됩니다.
- 인덱스를 만들고 통계를 수집할 수 있습니다.
- 디스크 입출력과 명시적인 정리 작업에 비용이 듭니다.
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;
SELECT * FROM spend WHERE total > 1000;물리화: 핵심적인 차이
면접관이 확인하려는 핵심 개념은 물리화입니다. 즉, 중간 결과가 어딘가에 물리적으로 기록되는지를 말합니다.
- 하위 쿼리와 CTE는 대개 물리화되지 않으며, 최적화기가 인라인화하는 경우가 많습니다.
- 임시 테이블은 항상 저장소에 물리화됩니다.
- 일부 데이터베이스에서는 힌트를 사용해 CTE 물리화를 강제하거나 막을 수 있습니다.
최적화 장벽과 오래된 Postgres의 함정
과거에는 PostgreSQL이 모든 CTE를 최적화 장벽으로 취급하여 물리화하고 조건식 푸시다운을 막았습니다. Postgres 12부터는 한 번 참조되는 단순한 비재귀 CTE가 기본적으로 인라인화되며, MATERIALIZED와 NOT MATERIALIZED 힌트로 이를 재정의할 수 있습니다.
이런 미묘한 차이를 언급하면 숙련된 개발자라는 강한 신호가 됩니다.
WITH spend AS NOT MATERIALIZED (
SELECT customer_id, SUM(amount) AS total
FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;하나의 문 안에서 재사용하기
하나의 문에서 같은 중간 결과를 여러 번 참조한다면, 하위 쿼리를 반복하는 것보다 CTE가 더 깔끔할 수 있습니다. 하지만 주의해야 합니다. 인라인화된 CTE는 참조할 때마다 다시 계산될 수 있습니다.
다시 계산하는 비용이 크다면 물리화를 강제하거나 임시 테이블을 사용하여 같은 작업을 두 번 수행하지 않도록 할 수 있습니다.
여러 문에 걸쳐 재사용하기
CTE와 하위 쿼리는 하나의 문에서만 유효합니다. 동일한 결과를 여러 개의 서로 다른 쿼리에서 사용해야 한다면 임시 테이블이 적절한 도구입니다.
일반적인 사례로는 여러 단계로 이루어진 ETL 또는 보고서가 있습니다. 먼저 스테이징 집합을 한 번 만든 다음, 이를 대상으로 여러 분석을 실행하는 방식입니다. 임시 테이블에 인덱스를 만들면 이후에 실행되는 모든 쿼리를 빠르게 처리할 수 있습니다.
인덱스와 통계
인덱스와 최신 통계를 가질 수 있는 것은 임시 테이블뿐입니다. 여러 번 조인하는 거대한 중간 집합에서는 이것이 결정적인 차이를 만들 수 있습니다.
- CTE/하위 쿼리: 기반 테이블에서 최적화기 추정치를 사용합니다.
- 임시 테이블:
ANALYZE를 실행하고 이후 조인에 맞춘 인덱스를 추가할 수 있습니다.
따라서 규모가 크고 많이 재사용되는 결과에서는 추가 단계가 있더라도 임시 테이블이 성능 면에서 더 나을 수 있습니다.
의사 결정 체계
면접에서 간결하게 답하는 방법은 다음과 같습니다.
- 하위 쿼리: 한 번만 사용하고 얕게 중첩되며 가독성에 문제가 없을 때 사용합니다.
- CTE: 가독성을 높이거나 하나의 문에서 몇 번 참조할 때 사용합니다.
- 임시 테이블: 여러 문에서 재사용하거나, 데이터가 매우 크거나, 인덱스 또는 통계가 필요할 때 사용합니다.
명확성을 위해 기본적으로 CTE를 사용하고, 물리화나 여러 문에 걸친 재사용이 실제로 도움이 될 때 임시 테이블을 선택하세요.
장단점을 설명하는 방법
'CTE는 항상 더 느립니다'와 같은 단정적인 표현은 피하세요. 대신 다음과 같이 말하세요. CTE와 하위 쿼리는 대개 인라인화되므로 가독성을 위한 도구입니다. 임시 테이블은 물리화되므로 여러 문에서 큰 결과를 재사용하거나 인덱스가 필요할 때 사용할 가치가 있습니다.
이러한 동작이 데이터베이스 엔진에 따라 다르고 Postgres에서는 버전에 따라서도 다르다는 점을 인정하면 진정한 깊이를 보여 줄 수 있습니다.
빠른 확인
임시 테이블을 사용하는 것이 확실히 더 나은 상황을 선택해 보세요.
복습: CTE와 하위 쿼리 및 임시 테이블
선택의 핵심은 물리화와 범위입니다.
- 하위 쿼리와 CTE: 대개 인라인화되고, 하나의 문에만 범위가 제한되며, 가독성을 위해 선택합니다.
- CTE는 이름 지정과 문 내부 재사용을 가능하게 합니다.
- 임시 테이블: 항상 물리화되고, 여러 문에 걸쳐 유지되며, 인덱스를 만들 수 있습니다.
- Postgres 12 이상에서는 단순한 CTE가 인라인화되며, MATERIALIZED 힌트로 이를 제어할 수 있습니다.
다음: 복잡하게 얽힌 중첩 쿼리를 깔끔한 CTE로 리팩터링하기
자주 묻는 질문
“CTE, 하위 쿼리와 임시 표 비교하기” 강의는 무료인가요?
네 — “CTE, 하위 쿼리와 임시 표 비교하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“CTE, 하위 쿼리와 임시 표 비교하기”에서 뭘 배우나요?
구체화, 재사용, 최적화 도구 동작의 장단점을 비교합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“CTE, 하위 쿼리와 임시 표 비교하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 첫 번째 CTE 작성하기
- 여러 CTE 연결하기
- CTE, 하위 쿼리와 임시 표 비교하기
- 중첩 쿼리를 CTE로 리팩터링하기