작성일자 : 2024-08-23
Ver 0.1.1
1. 배경
SQL에서 임시테이블을 만드는 방법은 일반적으로 두가지가 있다.
바로 WITH문과 INLINE VIEW를 활용하는 것이다. 두 방법은 복잡한 쿼리를 더 구조화하고 이해하기 쉽게 만드는데 유용하다.
쿼리를 작성하면서 언제 어떤 방법을 사용하는 것이 좋을지에 대해서 많은 고민을 하게 되었고,
두 방법의 장단점과 특징을 알고 있다면 성능이 좋고 효율적인 쿼리를 작성 할 수 있다는 생각에 정리를 해보고자 한다.
2. WITH 문 ( CTE, Common Table Expression)
특징
• 구조화: 복잡한 쿼리를 더 작고 이해하기 쉬운 블록으로 나눌 수 있다.
• 재사용 가능: 하나의 WITH 절에서 정의한 CTE는 동일한 쿼리 내에서 여러 번 참조할 수 있다.
• 가독성 향상: 복잡한 쿼리의 일부를 CTE로 분리함으로써 전체 쿼리의 가독성을 높일 수 있다.
• 재귀적 쿼리: WITH 절을 사용하여 재귀적 쿼리를 작성할 수 있습니다. 이는 계층적 데이터 처리에 유용하다.
장점
• 재사용: CTE를 여러 번 참조할 수 있어 쿼리 중복을 줄인다.
• 가독성: 복잡한 논리를 여러 단계로 나눠서 작성할 수 있어 쿼리를 이해하고 유지보수하기 쉬워진다.
• 재귀 기능: 재귀 CTE를 사용하여 계층 구조를 다룰 수 있다.
단점
• 일부 데이터베이스의 최적화 문제: CTE가 복잡하거나 여러 개의 CTE가 있을 때 성능이 저하될 수 있다. 일부 DBMS에서는 CTE를 항상 인라인 뷰처럼 취급하지 않기 때문에, 실행 계획이 최적화되지 않을 수 있다.
• 한정된 사용 범위: CTE는 쿼리 내에서만 사용되며, 뷰나 인라인 뷰처럼 다른 쿼리에서 재사용할 수 없다.
사용 시기
• 복잡한 쿼리의 구조화: 여러 단계로 나뉜 복잡한 로직을 명확히 표현하고자 할 때.
• 계층적 데이터 처리: 예를 들어 조직도와 같은 계층적 데이터를 처리할 때 재귀적 CTE를 사용할 수 있다.
• 재사용이 필요한 쿼리: 쿼리에서 동일한 데이터를 여러 번 참조해야 할 때 유용하다.
3. 인라인 뷰 (Inline View)
특징
• 임시 뷰: 인라인 뷰는 쿼리 내에서 사용되는 임시적인 하위 쿼리입니다. 주 쿼리에서 테이블처럼 취급된다.
• 하위 쿼리: 일반적으로 SELECT 문 내에서 사용되며, 복잡한 데이터를 서브쿼리로 처리한 후 그 결과를 주 쿼리에서 활용할 수 있다.
장점
• 단순성: 복잡한 쿼리를 단순화하여 하나의 쿼리로 처리할 수 있다.
• 최적화 가능성: 인라인 뷰는 쿼리 최적화 과정에서 메인 쿼리와 함께 최적화될 가능성이 높습니다. 이는 성능에 긍정적인 영향을 미칠 수 있다.
• 다양한 활용: 다양한 상황에서 쉽게 적용할 수 있으며, 데이터 필터링, 집계 등의 용도로 많이 사용된다.
단점
• 재사용 불가: 인라인 뷰는 쿼리 내에서 한 번만 사용 가능합니다. 같은 논리를 여러 번 사용해야 할 경우, 중복된 코드를 작성해야 할 수 있다.
• 가독성 저하: 복잡한 인라인 뷰를 남발하면 쿼리가 복잡해지고, 가독성이 떨어질 수 있다.
사용 시기
• 단순한 하위 쿼리: 단일 쿼리 내에서 한 번만 사용되는 단순한 하위 쿼리가 있을 때.
• 최적화가 중요한 경우: 데이터베이스 엔진의 최적화 기능을 최대한 활용하고자 할 때.
• 하나의 SELECT 문으로 데이터 처리: 복잡한 데이터를 처리하면서도 하나의 쿼리로 작성하고자 할 때.
4.비교 요약
항목 | WITH 절 | INLINE VIEW |
재사용 가능성 | 가능 | 불가능 |
가독성 | 높음 | 복잡해질 수 있음 |
재귀적 사용 | 가능 | 불가능 |
최적화 | 제한적일 수 있음 | 일반적으로 더 잘 최적화됨 |
사용 범위 | 한 쿼리 내에서만 사용 | 하위 쿼리로 사용 |
사용 시기 | 복잡한 논리, 재귀 쿼리, 가독성 필요할 때 | 단순한 하위 쿼리, 최적화가 중요할 때 |
5. 결론
• WITH 절(CTE)은 복잡한 쿼리의 논리를 구조화하고, 재귀 쿼리를 사용할 때 유리합니다. 여러 번 참조할 필요가 있는 복잡한 로직을 작성할 때 유용하다.
• 인라인 뷰는 단순한 데이터 필터링이나 집계를 수행할 때 적합하며, 최적화 측면에서 유리할 수 있습니다. 주 쿼리와 함께 최적화되므로 성능이 중요한 경우에 좋다.
각 상황에 맞게 두 방법을 적절히 사용하면, 쿼리의 가독성, 유지보수성, 성능을 모두 향상시킬 수 있다.