1.4.8. 쿼리의 분리를 이용한 부분범위처리

  1. SQL은 분리보다는 통합을 하는 것이 유리하지만 드물게 분리함으로써 유리해지는 경우가 있다.
  2. 일반적으로 1:M의 관계를 가지는 집합에서 1에 해당하는 집합에 대해 검색하고자 할 경우이다.
  3. 온라인 검색화면과 같은 곳은 한번에 모든 결과를 보여주지 않기 때문에 1집합의 일부를 추출한 후에 거기에 해당해는 M집합만 전체 범위로 처리하는 방식이다.
  4. 예제

(인덱스는 deptno+sale_date로 구성)
select deptno, y.empno, y.empno, y.job, sal_tot, comm_tot
  from (select empno,
               sum(sal_amt) sal_tot,
               sum(comm)  comm_tot
          from salary s
         where s.deptno like '12%'
           and s.sal_date between '20050101' and '20051231'
         group by empno ) x, employee y
 where y.empno = x.empno;

전체 범위로 처리되며 결합인덱스의 선행컬럼이 범위로 비교되어 액세스효율이 떨어진다.


select deptno into :v_deptno
  from dept
 where deptno like '12%';

select deptno, y.empno, y.empno, y.job, sal_tot, comm_tot
  from (select empno,
               sum(sal_amt) sal_tot,
               sum(comm)  comm_tot
          from salary s
         where s.deptno = :v_deptno
           and s.sal_date between '20050101' and '20051231'
         group by empno ) x, employee y
 where y.empno = x.empno;

    1. 앞의 SQL에서 조건을 만족하는 모든 DEPTNO를 페치한다.
    2. 각 DEPTNO에 대해 뒤의 SQL을 실행한다.
    3. 추출된 데이터를 사용자에게 제공한다.
      1. 어플리케이션 버퍼를 만든후 버퍼가 찰만큼 페치한다.
      2. 한 DEPTNO에 해당하는 데이터만을 보여주고 'NEXT'키를 치면 다음 DEPTNO를 검색하도록 한다.

=> 장점: 부분범위 처리가 가능해지며 인덱스 선행컬럼이 =으로 변경되면서 효율적인 인덱스 액세스가 가능해진다. 사용자의 조건범위에 무관하게 좋은 수행속도를 얻을 수 있다.
단점: 어플리케이션의 부가적인 처리가 필요하다.