이력 관리란 ?
모든 업무는 언제 시작해서 언제 끝났는지에 관한 정보가 기록되어 있다. 예를 들면 배송 상태에 따른 이력이 있는데, 배송 시작, 배송 중, 배송 완료 등 각각의 상태에 따라 이력이 관리된다. 이러한 이력을 기록하고 관리하는 것이 이력 관리이다.
이력 관리 대상
이러한 이력 관리는 관리하지 않을 때와 비교했을 때 많은 비용이 들어간다. 따라서 이력 관리가 필요한 데이터는 어떤 것인지 잘 판단하는 것이 중요하다.
관리해야할 데이터가 다음 5가지의 조건에 맞는지 확인하자.
- 변경 내역을 감시할 필요가 있는가?
- 시간의 경과에 따라 데이터가 변할 수 있는가?
- 시간의 경과에 따라 관계가 변하는가?
- 과거의 데이터를 조회할 필요가 있는가?
- 과거 버전을 보관할 필요가 있는가?
점 이력(시점 이력)과 선분 이력
- 시점 이력 : 데이터의 변경이 발생한 시각만을 관리
- 선분 이력 : 데이터 변경의 시작 시점부터 그 상태의 종료 시점까지 관리
![]() |
![]() |
점이력 장단점
- 점 이력은 변경 시점의 데이터를 넣는 과정에서 종료시점을 계산해서 넣을 필요가 없기에 훨씬 편합니다.(날짜 컬럼 1개로 관리)
- 시점 이력으로 이력을 관리했을 때, 특정한 시점의 데이터를 추출하고자 할 경우 불필요한 쿼리를 작성하게 된다. 때문에 이러한 경우 선분 이력을 채택하는 경우가 많다.
선분이력 장단점
- 선분 이력 모델에서 종료시점을 NULL 허용 하면 BETWEEN 조건으로 조회시 나오지 않음
- 종료 시점이 미정일 경우 NULL로 두는게 맞지만 인덱스 사용이 불가능하기 때문에 인덱스 스캔을 고려한다면 '9999-12-31' 같이 값을 정해두는 것이 좋음.
- 종료시점 미정 (NULL 허용) : 현재시점 데이터 조회 시
-- 시작시점 <= '2020-01-25' <= 종료시점
'2020-01-13' BETWEEN ST_DT AND ED_DT (종료시점이 NULL인 데이터는 조회 안됨)
-
- 종료시점 미정 '9999-12-31' (NOT NULL) : 현재시점 데이터 조회 시
-- 시작시점 <= '2020-01-25' <= 종료시점
'2020-01-13' BETWEEN ST_DT AND ED_DT (현재시점 데이터 조회 가능)
- 최종 변경건 데이터 조회 시 ED_DT = '9999-12-31' 로 빠르게 사용 가능
또한, 인덱스(종료일자 + 시작일자)를 사용하면 인덱스(시작일자 + 종료일자) 보다 효율적으로 데이터 조회 가능
선분 이력에서 종료점 처리 시 주의사항
- 종료점이 미정이므로 NULL
- 논리적으로 타당하지만 비교가 불가능
- 인덱스를 사용하지 못하므로 수행 속도 저하
- 수렴하므로 최대치 부여
- 아직 종료되지 않았으므로 무한히 계속되는 것으로 간주
- 최대치 부여(예: 날짜라면 9999/12/31)
- 수행 속도에 유리
'오라클 > 튜닝' 카테고리의 다른 글
SQLP 전문가가이드 정리 (17) | 2024.02.06 |
---|---|
NL 조인 튜닝 예시 (0) | 2023.02.21 |
테이블 random 액세스 쿼리 튜닝 예시 (0) | 2023.02.13 |
7장. SQL 옵티마이저 (0) | 2022.06.26 |
6장. DML 튜닝 (0) | 2022.06.26 |