서브쿼리
서브쿼리의 위치에 따른 명칭
명칭 | 사용 위치 |
---|---|
스칼라 서브쿼리 | SELECT 절 에 있는 서브쿼리
select col1 , (select user from dual) user -- 스칼라 쿼리 , .... |
인라인 뷰 | FROM절에 있는 서브쿼리
select .... from (select * from tb_xxx) -- 인라인 뷰 |
서브쿼리 | WHERE절에 있는 서브쿼리
select .... from tb_a where col1 in (select col1 from tb_xxx) -- 서브쿼리 |
서브쿼리의 반환 값에 따른 서브쿼리 종류
- - 단일 행 서브쿼리(Single-Row Subquery) : 서브쿼리의 결과가 1행
- - 다중 행 서브쿼리(Multiple-Row Subquery) : 서브쿼리의 결과가 여러 행
- - 다중 컬럼 서브쿼리(Multi-Column Subquery) : 서브쿼리의 결과가 여러 컬럼
스칼라 서브쿼리(Scala Subquery)
- - SELECT문에서 사용하는 서브쿼리로 1행만 반환
- - 입력값(메인쿼리와 조인하는 컬럼)의 Distinct한 종류가 적을수록 캐싱 효과가 좋음
- - 메인쿼리의 값을 서브쿼리가 사용하고, 서브쿼리의 값을 받아서 메인쿼리가 계산하는 구조의 쿼리
스칼라 서브쿼리 조인 장단점
장점
- 함수를 사용하는 쿼리를 실행하면, 함수 안에 있는 SELECT 쿼리를 메인쿼리 건수만큼 재귀적으로 반복 실행된다.
- 스칼라뷰로 실행하는 경우는 함수와 비슷해 보이지만 함수처럼 재귀적으로 실행하는 구조는 아니다.
- 컨텍스트 스위칭 없이 메인쿼리와 서브쿼리를 한몸 처럼 실행한다.
- Outer 조인문처럼 NL 조인 방식으로 실행된다.
- 스칼라 서브쿼리 캐싱효과
- 스칼라 서브쿼리로 조인하면 오라클은 조인 횟수를 최소화하려고 입력 값과 출력 값을 내부캐시에 저장해 둔다.
- 조인할 때 마다 일단 캐시에서 입력 값을 찾아보고, 찾으면 저장된 출력 값을 반환한다.
- 캐시에서 찾지 못할 때만 조인을 수행하며, 결과는 버리지 않고 캐시에 저장해 둔다.
- (사용자)함수의 경우도 스칼라 서브쿼리로(select 함수 from dual) 캐싱 효과 를 낼 수 있다. 중복 처리건이 많을수록 캐싱효과가 뛰어남.
단점
- 스칼라 서브쿼리 캐싱 부작용
- 스칼라 서브쿼리 캐싱 효과는 입력 값의 종류가 소수여서 해시 충돌 가능성이 적을 때 효과가 있다.
- 캐싱된 데이터가 매번 없다면 불필요한 캐싱 탐색 때문에 일반 조인문보다 느리고 불필요하게 자원만 낭비하는 셈이다.
- 메인 쿼리 집합이 매우 작은 경우도 캐싱 성능에 도움을 주지 못한다. 메인쿼리 집합이 적으면 캐시 재사용성도 낮다.
- 두 개 이상의 값 반환
- 문자열로 결합하고 바깥쪽 액세스 쿼리에서 SUBSTR 함수로 분리
- 오브젝트 TYPE을 사용, TYPE을 미리 선언해 두어야 하는 불편함 때문에 잘 쓰이지 않는다.