선분이력의 인덱스 스캔 효율
- 최근 데이터를 주로 조회 : Index [종료일 + 시작일]
- 과거 데이터를 주로 조회 : Index [시작일 + 종료일]
- Index [시작일 + 종료일] 구성일 때 최근 시점 조회
SELECT /*+ index_desc(A idx_x01) */ *
FROM 고객별연체금액 A
WHERE 고객번호 = '123'
AND '20170131' BETWEEN 시작일 AND 종료일
AND ROWNUM <= 1;
선분이력 JOIN
- 변경일자만으로 관리되는 점이력에 반해 선분이력은 시작일자, 종료일자로 관리
과거/현재/미래의 임의 시점 조회
-- 위 세 테이블을 JOIN하여 2004년 9월 1일 시점의 데이터를 조회
SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호
FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2
WHERE C.고객번호 = 123
AND C1.고객번호 = C.고객번호
AND C2.고객번호 = C.고객번호
AND '20040901' BETWEEN C1.시작일자 AND C1.종료일자
AND '20040901' BETWEEN C2.시작일자 AND C2.종료일자;
현재 시점 조회
-- 미래 시점 데이터를 미리 입력하는 예약 기능이 없다면 현재 시점 조회는 '=' 조건으로 만들어 주는 것이 효과적
SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호
FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2
WHERE C.고객번호 = 123
AND C1.고객번호 = C.고객번호
AND C2.고객번호 = C.고객번호
AND C1.종료일자 = '99991231'
AND C2.종료일자 = '99991231';
-- 만약에 미래 시점 데이터를 미리 입력해두는 기능이 있다면?
SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호
FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2
WHERE C.고객번호 = 123
AND C1.고객번호 = C.고객번호
AND C2.고객번호 = C.고객번호
AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN C1.시작일자 AND C1.종료일자
AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN C2.시작일자 AND C2.종료일자;
BETWEEN JOIN
-- 주식시장에서 과거 20년 동안 당일 최고가로 장을 마친(종가=최고가) 종목을 조회
SELECT A.거래일자, A.종목코드, B.종목한글명, B.종목영문명, B.상장주식수, A.시가, A.종가, A.체결건수, A.체결수량, A.거래대금
FROM 일별종목거래및시세 A, 종목이력 B
WHERE A.거래일자 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -20*12), 'YYYYMMDD')
AND TO_CHAR(SYSDATE-1, 'YYYYMMDD')
AND A.종가 = A.최고가
AND B.종목코드 = A.종목코드
AND A.거래일자 BETWEEN B.시작일자 AND B.종료일자;
-- 1998년 5월 29일 거래한 종목이 당일 최고가로 장을 마쳤다면 그 시점의 종목명(LG건설)과 상장주식수가 읽혀지게 됨
-- 거래 시점이 아니라 현재 시점의 종목명과 상장주식수를 출력하려면..
SELECT A.거래일자, A.종목코드, B.종목한글명, B.종목영문명, B.상장주식수, A.시가, A.종가, A.체결건수, A.체결수량, A.거래대금
FROM 일별종목거래및시세 A, 종목이력 B
WHERE A.거래일자 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -20*12), 'YYYYMMDD')
AND TO_CHAR(SYSDATE-1, 'YYYYMMDD')
AND A.종가 = A.최고가
AND B.종목코드 = A.종목코드
AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN B.시작일자 AND B.종료일자;
-- 참조
'DBMS > ORACLE' 카테고리의 다른 글
RMAN RAC(ASM) to SINGLE(file system) DB_NAME 변경하여 RESTORE (0) | 2022.05.27 |
---|---|
RMAN 불완전 복구 (0) | 2022.05.27 |
RAC relink 작업 (0) | 2022.05.17 |
시퀀스(sequence) last_number 의미와 alter sequence 시 변화 (0) | 2022.05.11 |
ASM DISK 사이즈 다른 경우 DATAFILE 추가 테스트 (0) | 2022.05.10 |
댓글