옵티마이저가 서브쿼리에 대해 다양한 형태로 쿼리 변환을 시도하므로 서브쿼리 조인을 이해하는 출발점은 쿼리 변환에서 찾아야 한다.
쿼리 변환(Query Transformation) : 비용을 평가하고 실행계획을 생성하기에 앞서 사용자로부터 전달받은 SQL을 최적화에 유리한 형태로 변환하는 작업.
옵티마이저가 SQL을 분석해 의미적으로 동일하면서도 더 나은 성능이 기대되는 형태로 재작성 하는 것.
서브쿼리 변환이 필요한 이유
하나의 결과집합을 얻기 위해 SQL을 여러 가지 다른 형태로 표현할 수 있고, 어떤 것을 선택하느냐에 따라 성능도 다를 수 있기 때문이다.
서브쿼리는(Subquery)는 하나의 SQL문 안에 괄호로 묶은 별도의 쿼리 블록을 말한다.
DBMS마다 조금씩 다르게 분류하는데 오라클은 세 가지로 분류한다.
인라인 뷰(Inline View) : FROM 절에 사용한 서브쿼리를 말한다.
중첩된 서브쿼리(Nasted Subquery) : 결과집합을 한정하기 위해 WHERE절에 사용한 서브쿼리를 말한다. 특히, 서브쿼리가 메인쿼리 컬럼을 참조하는 형태를 '상관관계 있는(Correlated) 서브쿼리'라고 부른다.
스칼라 서브쿼리(Scalar Subquery) : 한 레코드당 정확히 하나의 값을 반환하는 서브쿼리다. 주로 SELECT-LIST에서 사용하지만 몇 가지 예외사항을 제외하면 컬럼이 올 수 있는 대부분 위치에 사용할 수 있다.
서브쿼리와 조인
메인쿼리와 서브쿼리 간에는 부모와 자식이라는 종속적이고 계층적인 관계가 존재.
서브쿼리는 메인쿼리에 종속되므로 단독으로 실행 불가.
메인쿼리 건수만큼 값을 받아 반복적으로 필터링하는 방식으로 실행해야 한다
필터 오퍼레이션
no_unnest : 서브쿼리를 풀어내지 말고 그대로 수행하라고 옵티마이저에 지시하는 힌트.
unnest : 서브쿼리를 풀어서 수행하라고 옵티마이저에 지시하는 힌트
스칼라 서브쿼리 캐싱 효과
조인할 때마다 일단 캐시에서 '입력 값을' 찾아보고, 찾으면 저장된 '출력 값'을 반환. 캐시에서 찾지 못할 때만 조인을 수행하며, 결과는 버리지 않고 캐시에 저장한다.
=
실행할 때마다 결과를 Map에 저장한다.
스칼라 서브쿼리 캐싱 부작용
스칼라 서브쿼리 캐싱 효과는 입력 값의 종류가 소수여서 해시 충돌 가능성이 작을 때 효과가 있다.
반대의 경우라면 캐시를 매번 확인하는 비용 때문에 오히려 성능이 나빠지고 CPU 사용률만 높게 만듬. 메모리도 더 사용.
=
캐싱도 메모리를 사용하기 때문에 값의 종류가 작을 때만 사용하는게 좋다.
'SQL > 심화' 카테고리의 다른 글
SQL튜닝 - Chapter06.DML 튜닝 (0) | 2023.08.23 |
---|---|
SQL튜닝 - Chapter05. 소트 튜닝 (0) | 2023.08.22 |
SQL튜닝 -Chapter04.조인튜닝 -3- 해시 조인 (1) | 2023.08.21 |
SQL튜닝 - Chapter04.조인튜닝 -2- 소트 머지 조인 (0) | 2023.08.21 |
SQL튜닝 - Chapter04.조인튜닝 -1- NL조인 (0) | 2023.08.19 |