참고서적 : 친절한SQL튜닝 (조시형 저)
4.4.1 서브쿼리 변환이 필요한 이유
- 최근 옵티마이저는 비용을 평가하고 실행계획은 생성하기에 앞서 사용자로부터 전달받은 SQL을 최적화에 유리한 형태로 변환하는 작업, 즉 쿼리 변환부터 진행
- 쿼리 변환 : 옵티마이저가 같은 결과집합을 생성하면서도 더 나은 성능이 기대되는 형태로 쿼리를 재작성하는 것.
4.4.4 스칼라 서브쿼리 조인
(1) 스칼라 서브쿼리 특징
- 스칼라 서브쿼리는 메인쿼리의 건수만큼 테이블을 반복해서 읽는다는 측면에서, 함수와 비슷해보이지만 함수는 재귀적으로 반복실행된다는 점에서 차이가 있다.
- Outer Join문처럼 이해하면 된다 -> NL 조인방식으로 실행, 다른점은 처리하는캐싱으 과정에서 캐싱작용이 일어남.
(2) 스칼라 서브쿼리의 캐싱
- 오라클 내부적으로 입력값과 출력값을 내부캐시에 저장해 둠. (수행횟수 최소화)
- 캐싱은 쿼리 단위로 이뤄지고 쿼리 시작할때 PGA메모리 공간을 할당하고, 쿼리를 수항하며 공간을 채워나가다가 쿼리 마치면 공간 반환
- 튜닝예제 : 재귀적으로 반복되는 함수를 SELECT에서 호출할 때 , 스칼라 서브쿼리를 덧씌운다면 캐시 효과 볼 수 있음.
(3) 스칼라 서브쿼리 캐싱 부작용
- 캐시 공간은 늘 부족함.
- 스칼라 서브쿼리 캐싱 효과는 입력값의 종류가 소수여서, 해시충돌 가능성이 작을 때 효과적
<스칼라 서브쿼리 캐싱이 성능에 도움을 주지 못하는 경우 >
1) 입력값의 종류가 다수여서 캐시를 매번 확인하는 비용이 더 클 때 오히려 성능저하
2) 메인쿼리 집합이 매우 작은 경우
- 스칼라 서브쿼리 캐싱은 쿼리 단위로 이루어지므로 메인 쿠리 집합이 클수록 재사용성이 높아 효과가 크다
(4) 두 개 이상의 값 변환
- 스칼라 서브쿼리는 두 개 이상의 값을 반환할 수 없음 -> 두번의 서브쿼리를 작성한다면 서브쿼리내 같은 데이터를 반복해서 읽는 비효율이 발생함
1) 스칼라 버브쿼리를 이용할 경우, 전통적으로 원하는 값을 문자열로 합쳐서 가져온 후 분리해서 사용함
2) 인라인뷰를 사용
(5) 스칼라 서브쿼리 Unnesting (12c부터 Unnesting가능)
- NL방식으로 조인하므로 캐싱효과가 크지 않으면 랜덤 I/O부하 발생
- Unnesting을 이용하여 다른 조인방식 사용가능
12c 관련 파라미터값 : 옵티마이저가 사용자를 대신하여 쿼리 변환
_optimizer_unnest_scalar_sq = false (사용자가 unnest힌트로 변경가능)참고서적 : 친절한SQL튜닝 (조시형 저)
4.4.1 서브쿼리 변환이 필요한 이유
- 최근 옵티마이저는 비용을 평가하고 실행계획은 생성하기에 앞서 사용자로부터 전달받은 SQL을 최적화에 유리한 형태로 변환하는 작업, 즉 쿼리 변환부터 진행
- 쿼리 변환 : 옵티마이저가 같은 결과집합을 생성하면서도 더 나은 성능이 기대되는 형태로 쿼리를 재작성하는 것.
4.4.4 스칼라 서브쿼리 조인
(1) 스칼라 서브쿼리 특징
- 스칼라 서브쿼리는 메인쿼리의 건수만큼 테이블을 반복해서 읽는다는 측면에서, 함수와 비슷해보이지만 함수는 재귀적으로 반복실행된다는 점에서 차이가 있다.
- Outer Join문처럼 이해하면 된다 -> NL 조인방식으로 실행, 다른점은 처리하는캐싱으 과정에서 캐싱작용이 일어남.
(2) 스칼라 서브쿼리의 캐싱
- 오라클 내부적으로 입력값과 출력값을 내부캐시에 저장해 둠. (수행횟수 최소화)
- 캐싱은 쿼리 단위로 이뤄지고 쿼리 시작할때 PGA메모리 공간을 할당하고, 쿼리를 수항하며 공간을 채워나가다가 쿼리 마치면 공간 반환
- 튜닝예제 : 재귀적으로 반복되는 함수를 SELECT에서 호출할 때 , 스칼라 서브쿼리를 덧씌운다면 캐시 효과 볼 수 있음.
(3) 스칼라 서브쿼리 캐싱 부작용
- 캐시 공간은 늘 부족함.
- 스칼라 서브쿼리 캐싱 효과는 입력값의 종류가 소수여서, 해시충돌 가능성이 작을 때 효과적
<스칼라 서브쿼리 캐싱이 성능에 도움을 주지 못하는 경우 >
1) 입력값의 종류가 다수여서 캐시를 매번 확인하는 비용이 더 클 때 오히려 성능저하
2) 메인쿼리 집합이 매우 작은 경우
- 스칼라 서브쿼리 캐싱은 쿼리 단위로 이루어지므로 메인 쿠리 집합이 클수록 재사용성이 높아 효과가 크다
(4) 두 개 이상의 값 변환
- 스칼라 서브쿼리는 두 개 이상의 값을 반환할 수 없음 -> 두번의 서브쿼리를 작성한다면 서브쿼리내 같은 데이터를 반복해서 읽는 비효율이 발생함
1) 스칼라 버브쿼리를 이용할 경우, 전통적으로 원하는 값을 문자열로 합쳐서 가져온 후 분리해서 사용함
2) 인라인뷰를 사용
(5) 스칼라 서브쿼리 Unnesting (12c부터 Unnesting가능)
- NL방식으로 조인하므로 캐싱효과가 크지 않으면 랜덤 I/O부하 발생
- Unnesting을 이용하여 다른 조인방식 사용가능
12c 관련 파라미터값 : 옵티마이저가 사용자를 대신하여 쿼리 변환
_optimizer_unnest_scalar_sq = false (사용자가 unnest힌트로 변경가능)