https://school.programmers.co.kr/learn/courses/30/lessons/299310
SQL 쿼리를 작성할 때 복잡한 로직을 깔끔하게 표현하고 관리하기 위해 FROM 절 서브쿼리와 WITH 절 공통테이블 표현식(CTE)를 자주 사용하는데, 어떤 경우에 어떤 쿼리를 쓰면 좋을지에 대해 이번 기회에 정리하고자 한다.
FROM 절 서브쿼리는 메인 쿼리 내에서 인라인 뷰(임시 테이블) 형태로 사용되는 서브쿼리를 말한다.
CTE(Common Table Expression)는 WITH 절을 사용하여 쿼리의 시작 부분에서 임시 테이블(논리적 뷰)을 정의하고, 이후 메인 쿼리에서 재사용할 수 있는 기능이다.
두 방법은 기본적으로 동일한 결과를 도출할 수 있지만, 사용 목적과 상황에 따라 차이가 있다.
| 구분 | FROM 절 서브쿼리 | WITH 절 CTE |
|---|---|---|
| 사용 방식 | FROM (SELECT ...) AS ALIAS | WITH CTE_NAME AS (...) 후 메인 쿼리에서 사용 |
| 재사용 가능성 | 한 번만 사용 가능 | 여러 번 재사용 가능 |
| 가독성 | 단순 쿼리에서는 문제 없음 | 복잡한 쿼리를 여러 단계로 나누기 용이 |
| SQL 엔진 최적화 | 인라인 뷰로 처리, 경우에 따라 다름 | 내부적으로 최적화 가능(다만 DBMS에 따라 차이 있음) |
| 재귀 쿼리 지원 | 지원하지 않음 | 재귀 쿼리 작성에 적합 |
FROM 절 서브쿼리
WITH 절 CTE
SQL 엔진은 쿼리를 실행하기 전에 실행 계획을 수립하는데, 이 과정에서 CTE와 서브쿼리의 처리 방식에 차이가 있을 수 있다.
예를 들어, 일부 DBMS에서는 CTE를 한 번 계산해 결과를 재사용하는 materialization 전략을 사용할 수 있지만, 다른 DBMS에서는 CTE를 인라인 뷰처럼 본문 쿼리에 병합하여 매번 계산할 수도 있음.
반면, FROM 절의 서브쿼리는 일반적으로 인라인 뷰로 처리되어 메인 쿼리와 통합된 실행 계획을 갖게 됨.
따라서 동일한 로직이라 하더라도 데이터 양, 인덱스 구성, DBMS의 버전 및 설정에 따라 성능 차이가 발생할 수 있으므로, 실제 운영 환경이나 테스트 데이터를 바탕으로 벤치마크 테스트를 진행하는 것이 매우 중요함.
즉, 해보고 결정해라!
FROM 절 서브쿼리와 WITH 절 CTE는 모두 잘 쓸줄 알아야 한다.
다만, 각 DBMS마다 내부 최적화 방식이 다르기에, 상황에 맞게 적절한 방법을 선택하고, 인덱스 및 쿼리 최적화 기법을 함께 적용할 수 있으면 더욱 효율적인 쿼리 작성이 가능할 것이다.