4.4.1 서브쿼리 변환이 필요한 이유
서브쿼리 (Subquery)
- 하나의 SQL문 안에 괄호로 묶은 별도의 쿼리 블록(Query Block)을 말한다
- 인라인 뷰 (Inline View)
- FROM 절에 사용한 서브쿼리를 말한다
- 중첩된 서브쿼리 (Nested Subquery)
- 결과 집합을 한정하기 위해 WHERE 절에 사용한 서브쿼리
- 특히, 서브쿼리가 메인쿼리 컬럼을 참조하는 형태를 '상관관계 있는 (Correlated) 서브쿼리' 라고 부른다
- 스칼라 서브쿼리 (Scalar Subquery)
- 한 레코드 당 정확히 하나의 값을 반환하는 서브 쿼리
- 주로 SELECT-LIST 에서 사용하지만 몇 가지 예외사항을 제외하면 컬럼이 올 수 있는 대부분 위치에 사용할 수 있다
4.4.2 서브쿼리와 조인
서브쿼리 Unnesting
- 'unnest' 는 '중첨된 상태를 풀어내라' 라는 뜻
- 메인과 서브쿼리 간의 계층구조를 풀어 서로 같은 레벨(flat한 구조)로 만들어 준다는 의미에서 '서브쿼리 flattering' 이라고 부르기도 한다
- 서브쿼리를 별도로 빼서 조인한다는 뜻 → 빠르다
- NL 세미 조인
- 기본적으로 NL 조인과 같은 프로세스
- 조인에 성공하는 순간 진행을 멈추고 메인 쿼리의 다음 로우를 계속 처리한다
4.4.4 스칼라 서브쿼리 조인
빌트인함수 = 빠르다
사용자정의함수 = 느리다, 사용 X
스칼라 서브쿼리 캐싱 효과
- 조인할 때 마다 일단 캐시에서 '입력 값'을 찾아보고, 찾으면 저장된 '출력 값'을 반환한다
- 캐시에서 찾지 못할 때만 조인을 수행하며, 결과는 버리지 않고 캐시에 저장해 둔다
스칼라 서브쿼리 캐싱 부작용
- 모든 캐시가 다 그렇듯, 캐시 공간은 늘 부족하다
- 입력 값의 종류가 소수여서 해시 충돌 가능성이 작을 때 효과가 있다
- 반대의 경우라면 캐시를 매번 확인하는 비용 때문에 오히려 성능이 나빠지고 CPU 사용률을 높이고, 메모리도 더 사용한다
'SQL 튜닝 > Ch04 조인 튜닝' 카테고리의 다른 글
4.3 해시 조인 (0) | 2024.11.12 |
---|---|
4.2 소트 머지 조인 (0) | 2024.11.12 |
4.1 NL 조인 (0) | 2024.11.12 |