메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 5월 18일 (일) 01:14 판 (→‎서브쿼리의 위치에 따른 명칭)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

서브쿼리

서브쿼리의 위치에 따른 명칭

서브쿼리 사용 위치에 따른 명칭
명칭 사용 위치
스칼라 서브쿼리 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한 종류가 적을수록 캐싱 효과가 좋음


상호연관 서브쿼리(Correlated Subquery)

- 메인쿼리의 값을 서브쿼리가 사용하고, 서브쿼리의 값을 받아서 메인쿼리가 계산하는 구조의 쿼리


스칼라 서브쿼리 조인 장단점

장점

  1. 함수를 사용하는 쿼리를 실행하면, 함수 안에 있는 SELECT 쿼리를 메인쿼리 건수만큼 재귀적으로 반복 실행된다.
  2. 스칼라뷰로 실행하는 경우는 함수와 비슷해 보이지만 함수처럼 재귀적으로 실행하는 구조는 아니다.
  3. 컨텍스트 스위칭 없이 메인쿼리와 서브쿼리를 한몸 처럼 실행한다.
  4. Outer 조인문처럼 NL 조인 방식으로 실행된다.
  5. 스칼라 서브쿼리 캐싱효과
    1. 스칼라 서브쿼리로 조인하면 오라클은 조인 횟수를 최소화하려고 입력 값과 출력 값을 내부캐시에 저장해 둔다.
    2. 조인할 때 마다 일단 캐시에서 입력 값을 찾아보고, 찾으면 저장된 출력 값을 반환한다.
    3. 캐시에서 찾지 못할 때만 조인을 수행하며, 결과는 버리지 않고 캐시에 저장해 둔다.
    4. (사용자)함수의 경우도 스칼라 서브쿼리로(select 함수 from dual) 캐싱 효과 를 낼 수 있다. 중복 처리건이 많을수록 캐싱효과가 뛰어남.

단점

  1. 스칼라 서브쿼리 캐싱 부작용
    1. 스칼라 서브쿼리 캐싱 효과는 입력 값의 종류가 소수여서 해시 충돌 가능성이 적을 때 효과가 있다.
    2. 캐싱된 데이터가 매번 없다면 불필요한 캐싱 탐색 때문에 일반 조인문보다 느리고 불필요하게 자원만 낭비하는 셈이다.
    3. 메인 쿼리 집합이 매우 작은 경우도 캐싱 성능에 도움을 주지 못한다. 메인쿼리 집합이 적으면 캐시 재사용성도 낮다.
  2. 두 개 이상의 값 반환
    1. 문자열로 결합하고 바깥쪽 액세스 쿼리에서 SUBSTR 함수로 분리
    2. 오브젝트 TYPE을 사용, TYPE을 미리 선언해 두어야 하는 불편함 때문에 잘 쓰이지 않는다.