오라클/튜닝

점이력, 선분이력

dbavayne 2023. 4. 16. 12:50

이력 관리란 ?

모든 업무는 언제 시작해서 언제 끝났는지에 관한 정보가 기록되어 있다. 예를 들면 배송 상태에 따른 이력이 있는데, 배송 시작, 배송 중, 배송 완료 등 각각의 상태에 따라 이력이 관리된다. 이러한 이력을 기록하고 관리하는 것이 이력 관리이다.

이력 관리 대상

이러한 이력 관리는 관리하지 않을 때와 비교했을 때 많은 비용이 들어간다. 따라서 이력 관리가 필요한 데이터는 어떤 것인지 잘 판단하는 것이 중요하다.

관리해야할 데이터가 다음 5가지의 조건에 맞는지 확인하자.

  • 변경 내역을 감시할 필요가 있는가?
  • 시간의 경과에 따라 데이터가 변할 수 있는가?
  • 시간의 경과에 따라 관계가 변하는가?
  • 과거의 데이터를 조회할 필요가 있는가?
  • 과거 버전을 보관할 필요가 있는가?

 

점 이력(시점 이력)과 선분 이력

  • 시점 이력 : 데이터의 변경이 발생한 시각만을 관리
  • 선분 이력 : 데이터 변경의 시작 시점부터 그 상태의 종료 시점까지 관리

점이력 장단점

  1. 점 이력은 변경 시점의 데이터를 넣는 과정에서 종료시점을 계산해서 넣을 필요가 없기에 훨씬 편합니다.(날짜 컬럼 1개로 관리)
  2. 시점 이력으로 이력을 관리했을 때, 특정한 시점의 데이터를 추출하고자 할 경우 불필요한 쿼리를 작성하게 된다. 때문에 이러한 경우 선분 이력을 채택하는 경우가 많다.

선분이력 장단점

  1. 선분 이력 모델에서 종료시점을 NULL 허용 하면 BETWEEN 조건으로 조회시 나오지 않음
  2. 종료 시점이 미정일 경우 NULL로 두는게 맞지만 인덱스 사용이 불가능하기 때문에 인덱스 스캔을 고려한다면 '9999-12-31' 같이 값을 정해두는 것이 좋음.
    1. 종료시점 미정 (NULL 허용) : 현재시점 데이터 조회 시
--  시작시점 <= '2020-01-25' <= 종료시점
    '2020-01-13' BETWEEN ST_DT AND ED_DT (종료시점이 NULL인 데이터는 조회 안됨)
​
    1. 종료시점 미정 '9999-12-31' (NOT NULL) : 현재시점 데이터 조회 시
--  시작시점 <= '2020-01-25' <= 종료시점
  '2020-01-13' BETWEEN ST_DT AND ED_DT (현재시점 데이터 조회 가능)
  • 최종 변경건 데이터 조회 시 ED_DT = '9999-12-31' 로 빠르게 사용 가능
  또한, 인덱스(종료일자 + 시작일자)를 사용하면 인덱스(시작일자 + 종료일자) 보다 효율적으로 데이터 조회 가능

선분 이력에서 종료점 처리 시 주의사항

  1. 종료점이 미정이므로 NULL
    • 논리적으로 타당하지만 비교가 불가능
    • 인덱스를 사용하지 못하므로 수행 속도 저하
  2. 수렴하므로 최대치 부여
    • 아직 종료되지 않았으므로 무한히 계속되는 것으로 간주
    • 최대치 부여(예: 날짜라면 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