부분범위처리(Partial Range Scan)란? SQL에서 주어진 조건의 전체 범위를 모두 처리한 후에 결과를 추출하는 것이 아니라, 차례대로 처리해 가다가 결과의 로우 수가 운반단위(Array Size)를 채우게 되면 일단 결과를 추출되고, 사용자의 다음 요구가 있을 때까지 더 이상의 처리를 멈추게되는 처리방법
1) 일반적인 SQL구문
SELECT a.부서명, b.사원번호, b.성명, c.년월, c.급여총액
FROM 부서 a, 사원 b, 급여 c
WHERE b.부서코드 = a.부서코드
and c.사원번호 = b.사원번호
and a.위치 = '서울'
and b.직책 = '과장'
and c.년월 between '199001' and '199712'
ORDER BY a.부서명, b.입사일, c.년월 ;
2) 가장 이상적인 실행방안 SQL구문
SELECT /*+ ORDERED USE_NL(x y) */
x.부서명, x.입사일, x.사원번호, x.성명, y.년월, y.급여총액
FROM (SELECT a.부서명, b.입사일, b.사원번호, b.성명)
FROM 부서 a, 사원 b
WHERE b.부서코드 = a.부서코드
and a.위치 = '서울'
and b.직책 = '과장'
ORDER BY a.부서명, b.입사일, b.사원번호) x, 급여 y
WHERE y.사원번호 = x.사원번호
and y.년월 BETWEEN '199001' AND '199712' ;
3) GROUP BY사용 실행방안 SQL구문
SELECT /*+ ORDERED USE_NL(x y) */
x.부서명, x.입사일, x.사원번호, x.성명, y.년월, y.급여총액
FROM (SELECT a.부서명, b.입사일, b.사원번호, MAX(b.성명)
FROM 부서 a, 사원 b
WHERE b.부서코드 = a.부서코드
and a.위치 = '서울'
and b.직책 = '과장'
GROUP BY a.부서명, b.입사일, b.사원번호) x, 급여 y
WHERE y.사원번호 = x.사원번호
and y.년월 BETWEEN '199001' AND '199712' ;
SELECT a.사원번호, AVG_AMT * DECODE(a.직무, 'A1', 0.12, 0.11)
FROM 사원 a,
(SELECT 사원번호, AVG(급여총액) AVG_AMT
FROM 급여
WHERE 년월 between '199801' and '199803'
GROUP BY 사원번호) b
WHERE b.사원번호 = a.사원번호
and a.부서코드 = '1110';
1) 사용자지정 저장형 함수를 사용하는하는 방법
CREATE or REPLACE FUNCTION AVG_AMT_FUNC
(v_empno varchar2)
RETURN number IS
V_avg_amt number;
BEGIN
SELECT avg(급여총액) into v_avg_amt
FROM 급여
WHERE 사원번호 = V_EMPNO
and 년월 between '199801' and '199803';
RETURN v_avg_amt;
END AVG_AMT_FUNC;
SELECT 사원번호, AVG_AMT_FUNC(사원번호) * DECODE(직무, 'A1', 0.12, 0.11)
FROM 사원
WHERE 부서코드 = '1110';
2) SELECT-LIST에 인라인뷰를 사용하는 방법
SELECT 사원번호,
CURSOR( SELECT AVG(급여총액) * DECODE(a.직무. 'A1', 0.12, 0.11), MIN(급여총액), MAX(급여총액)
FROM 급여 b
WHERE b.사원번호 = a.사원번호
and b.년월 BETWEEN ;199801' AND '199803')
FROM 사원 a
WHERE 부서코드 = '1110';