스칼라 서브쿼리 

 - 함수처럼 한 레코드당 정확히 하나의 값만을 리턴하는 서브쿼리를 '스칼라 서브쿼리' 라고 한다. 

 - 스칼라 서브쿼리는 주로 select-list 에서 사용되지만 몇 가지 예외사황을 뺀다면 컬럼이 

    올 수 있는 대부분 위치에서 사용 가능하다. 

 - 스칼라 서브쿼리를 이용해서 outer 조인문과 같은 결과를 낼 수도 있다. 

 - 스칼라 서브쿼리는 내부적으로 NL 조인과 수행하는 처리 경로도 동일하다. 

    ( 내부적으로 캐싱 기법이 작용한다는 점이 달라, 이를 이용한 튜닝이 자주 행해진다. ) 


스칼라 서브쿼리의 캐싱 효과 

 - 오라클은 스칼라 서브쿼리 수행횟수를 최소화하려고 그 입력 값과 출력 값을 내부 캐시에 

    저장해 둔다. 

 - 스칼라 서브쿼리가 수행될 때만 일단 '입력 값'을 캐시에서 찾아보고 거기 있으면 

    '저장된 출력 값' 을 리턴한다. 

 - 캐시에서 찾지 못할 때만 쿼리르 수행하며, 결과를 버리지 않고 캐시에 저장해 둔다.

    * 여기서 나의 해석을 더 하자면 

       - M:1 일 경우 1은 스칼라 서브쿼리의 테이블일 시 입력 값의 중복이 많기 때문에 

         동일한 결과 값을 사용할 수 있는 경우가 커서 활용도가 높다. 

 - 반복 수행되는 함수 때문에 쿼리 성능이 크게 저하될 때, 스칼라 서브쿼리를 덧씌움으로써 

   호출 횟수를 줄일 수 있다. 

    ( 그냥 사용자 정의 함수를 사용하게 되면 row 마다 함수가 호출 된다. 

       그러나 스칼라 서브 쿼리르 사용하게 되면 캐싱 기능을 사용할 수 있다. ) 

 - 입력 값과 출력 값을 빠르게 저장하고 찾기 위해 오라클은 해싱 알고리즘을 사용한다. 

 - 해시 충돌이 발생했을 때 기존 엔트리를 밀어내고 새로 수행한 입력 값과 출력값을 

    대체하는 것이 아닌 오라클은 기존 캐시 엔트리를 그대로 둔 채 스칼라 서브쿼리만 

    한 번 더 수행하고 만다. 따라서 해시 충동리 발생한 입력 값이 반복적으로 입력되면 

    스칼라 서브쿼리도 반복 수행된다. 

 - 결론적으로, 스칼라 서브쿼리의 캐싱 효과는 입력 값의 종류가 소수여서 해시 충돌 가능성이 

    적을 때랑야 효과가 있으며, 반대의 경우라면 캐시를 확인하는 비용 때문에 오히려 성능은 

    저하되고 CPU 사용률만 높게 만든다. 

 - 스칼라 서브쿼리를 사용하면 NL 조인에서 Inner 쪽 인덱스와 테이블에 나타나는 버퍼 Pinning

    효과도 사라진다는 사실을 기억할 필요가 있다.  


두 개 이상의 값을 리턴하고 싶을 때 

 - 구하고자 하는 값들을 모두 결합하고 바깥쪽 엑세스 쿼리에서 substr 함수로 분리하는 방법 

     ( || 을 사용해 in-line view 안에서 스칼라 서브쿼리르 한 번 사용하고 , 

       다시 바깥쪽에서 substr 를 이용해 잘라서 사용 ) 

 - 오브젝트 TYPE을 사용 , TYPE을 미리 선언해 두어야 하는 불편함이 있지만 

    SQL은 훨씬 깔끔해진다. 

+ Recent posts