스칼라 서브쿼리
- 함수처럼 한 레코드당 정확히 하나의 값만을 리턴하는 서브쿼리를 '스칼라 서브쿼리' 라고 한다.
- 스칼라 서브쿼리는 주로 select-list 에서 사용되지만 몇 가지 예외사황을 뺀다면 컬럼이
올 수 있는 대부분 위치에서 사용 가능하다.
- 스칼라 서브쿼리를 이용해서 outer 조인문과 같은 결과를 낼 수도 있다.
- 스칼라 서브쿼리는 내부적으로 NL 조인과 수행하는 처리 경로도 동일하다.
( 내부적으로 캐싱 기법이 작용한다는 점이 달라, 이를 이용한 튜닝이 자주 행해진다. )
스칼라 서브쿼리의 캐싱 효과
- 오라클은 스칼라 서브쿼리 수행횟수를 최소화하려고 그 입력 값과 출력 값을 내부 캐시에
저장해 둔다.
- 스칼라 서브쿼리가 수행될 때만 일단 '입력 값'을 캐시에서 찾아보고 거기 있으면
'저장된 출력 값' 을 리턴한다.
- 캐시에서 찾지 못할 때만 쿼리르 수행하며, 결과를 버리지 않고 캐시에 저장해 둔다.
* 여기서 나의 해석을 더 하자면
- M:1 일 경우 1은 스칼라 서브쿼리의 테이블일 시 입력 값의 중복이 많기 때문에
동일한 결과 값을 사용할 수 있는 경우가 커서 활용도가 높다.
- 반복 수행되는 함수 때문에 쿼리 성능이 크게 저하될 때, 스칼라 서브쿼리를 덧씌움으로써
호출 횟수를 줄일 수 있다.
( 그냥 사용자 정의 함수를 사용하게 되면 row 마다 함수가 호출 된다.
그러나 스칼라 서브 쿼리르 사용하게 되면 캐싱 기능을 사용할 수 있다. )
- 입력 값과 출력 값을 빠르게 저장하고 찾기 위해 오라클은 해싱 알고리즘을 사용한다.
- 해시 충돌이 발생했을 때 기존 엔트리를 밀어내고 새로 수행한 입력 값과 출력값을
대체하는 것이 아닌 오라클은 기존 캐시 엔트리를 그대로 둔 채 스칼라 서브쿼리만
한 번 더 수행하고 만다. 따라서 해시 충동리 발생한 입력 값이 반복적으로 입력되면
스칼라 서브쿼리도 반복 수행된다.
- 결론적으로, 스칼라 서브쿼리의 캐싱 효과는 입력 값의 종류가 소수여서 해시 충돌 가능성이
적을 때랑야 효과가 있으며, 반대의 경우라면 캐시를 확인하는 비용 때문에 오히려 성능은
저하되고 CPU 사용률만 높게 만든다.
- 스칼라 서브쿼리를 사용하면 NL 조인에서 Inner 쪽 인덱스와 테이블에 나타나는 버퍼 Pinning
효과도 사라진다는 사실을 기억할 필요가 있다.
두 개 이상의 값을 리턴하고 싶을 때
- 구하고자 하는 값들을 모두 결합하고 바깥쪽 엑세스 쿼리에서 substr 함수로 분리하는 방법
( || 을 사용해 in-line view 안에서 스칼라 서브쿼리르 한 번 사용하고 ,
다시 바깥쪽에서 substr 를 이용해 잘라서 사용 )
- 오브젝트 TYPE을 사용 , TYPE을 미리 선언해 두어야 하는 불편함이 있지만
SQL은 훨씬 깔끔해진다.
'ORACLE > SQLP' 카테고리의 다른 글
성능도고화 2-8. 고급 조인 테크닉 (0) | 2016.12.26 |
---|---|
성능고도화 2-7. 조인을 내포한 DML 튜닝 (0) | 2016.12.26 |
성능고도화 2-5. outer 조인 (0) | 2016.12.26 |
성능고도화 2-4. 조인 순서의 중요성 (0) | 2016.12.26 |
성능고도화 2-3. 해시 조인 (0) | 2016.12.26 |