SELECT 계약번호, 관리부서명, 계약일, 고객형태, 계약구분, 고객주소
FROM 계약 X, 부서 Y
WHERE Y.부서코드 = X.관리부서
AND 계약번호 LIKE :계약번호 || '%'
AND 관리부서 LIKE :관리부서 || '%'
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMM')||'%'
AND NVL(계약구분,'X') = NVL(:계약구분,'X')
SELECT 계약번호, 관리부서명, 계약일, 고객형태, 계약구분, 고객주소
FROM (SELECT *
FROM 계약
WHERE :계약번호 > ' ' // NOT NULL
AND 계약번호 = :계약번호 // 분포도 좋은 계약번호 결합인덱스선행컬럼으로 사용
AND 관리부서 LIKE :관리부서 || '%'
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMM')||'%'
AND NVL(계약구분,'X') = NVL(:계약구분,'X')
UNION ALL
SELECT *
FROM 계약
WHERE :계약번호 IS NULL // NULL 전체범위 처리
AND 관리부서 LIKE :관리부서 || '%'
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMM')||'%'
AND NVL(계약구분,'X') = NVL(:계약구분,'X')
AND ROWNUM <= 300 //처리범위가 너무 넓을때 방호벽으로 사용한다는데 이해가..
) X, 부서 Y WHERE Y.부서코드 = X.부서코드;
CREATE INDEX 현행테이블_IND ON 현행테이블(처리일자);
CREATE INDEX 집계테이블_IND ON 집계테이블(집계일자);
SELECT 제품코드, SUM(처리수량)
FROM (SELECT 제품코드, 집계수량 처리수량
FROM 집계테이블
WHERE 집계일자 BETWEEN '20071103' AND '20071203'
UNION ALL
SELECT 제품코드 AS 제품코드, 처리수량 AS 처리수량
FROM 현행테이블
WHERE 처리일자 BETWEEN '20071203' AND '20071204'
)
GROUP BY 제품코드
SELECT STATEMENT
SORT GROUP BY
VIEW
UNION-ALL
TABLE ACCESS BY INDEX ROWID 집계테이블
INDEX RANGE SCAN 집계테이블_IND
TABLE ACCESS BY INDEX ROWID 현행테이블
INDEX RANGE SCAN 현행테이블_IND
--마지막집계일자 구하기
SELECT /*+ INDEX_DESC(A 집계테이블_IND ) */
집계일자
FROM 집계테이블 A
WHERE 집계일자 <= '99991231'
AND ROWNUM = 1
--효율적인 SQL을 위해 뷰를 생성
CREATE VIEW 집계_뷰(발생일자, 제품코드, 수량) AS
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
--뷰를 이용한 쿼리
SELECT *
FROM 집계_뷰
WHERE 발생일자 BETWEEN '20071103' AND '20071203'
SELECT STATEMENT
VIEW 집계_뷰
UNION-ALL
TABLE ACCESS BY INDEX ROWID 집계테이블
INDEX RANGE SCAN 집계테이블_IND
TABLE ACCESS BY INDEX ROWID 현행테이블
INDEX RANGE SCAN 현행테이블_IND
--위 SQL는 아래 SQL과 같은 실행계획을 수립한다.>>
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
WHERE 집계일자 BETWEEN '20071103' AND '20071203'
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
WHERE 처리일자 BETWEEN '20071103' AND '20071203'
--다른 처리범위를 가질 수 있도록 처리
CREATE OR REPLACE VIEW 집계_뷰(발생일자1, 발생일자2, 제품코드, 수량) AS
SELECT 집계일자, '99999999', 제품코드, 집계수량
FROM 집계테이블
UNION ALL
SELECT 처리일자, 처리일자, 제품코드, 처리수량
FROM 현행테이블
SELECT *
FROM 집계_뷰
WHERE 발생일자1 BETWEEN '20071103' AND '20071203'
AND 발생일자2 >= '20071203'
>>
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
WHERE 집계일자 BETWEEN '20071103' AND '20071203'
AND '99999999' >= '20071203'
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
WHERE 처리일자 BETWEEN '20071103' AND '20071203'
AND 처리일자 >= '20071203'
--규칙기준 옵티마이져인 경우 동일한 컬럼이 하나이 상의 조건을 가질때 순위의 차이가 있다면 보다 양호한 순위를 가진 조건이 선택되고
--같은 순위를 가진 다면 먼저 사용된 조건을 사용한다
SELECT *
FROM 집계_뷰
WHERE 발생일자2 >= '20071203'
AND 발생일자1 BETWEEN '20071103' AND '20071203'
- 강좌 URL : http://www.gurubee.net/lecture/2496
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.