본문 바로가기

Data

[DB]윈도우 함수 이용하여 직전 데이터 값 참조하기

장비의 이벤트 데이터에는 변경된 속성 정보만 포함되어 있는데 DB 에는 몇가지 이유로 해당 시점의 모든 속성들을 다 채워넣어 저장해줘야 한다.
즉, 해당 장비의 최종 정보를 DB 에서 가져온 후 이벤트가 발생한 속성값만 변경해서 추가 저장(insert)하는 방식.

DB 조회를 줄이기 위해 발생 빈도, 장비 종류/건수 등에 따라 간단하게 직접 구현하거나 Redis 를 이용해서 처리했었는데 데이터를 이원화하면서 기존 방식을 재검토해봤다.

  1. 시계열 DB 에 가공하지 않고 이벤트 데이터 그대로 저장.
  2. 일정 주기로 시계열 DB에서 신규 데이터셋 구한 뒤 애플리케이션에서 속성 채워넣는 처리 후 조회용 DB 에 벌크 인서트.

기존 소스 재활용 염두에 두고 위 방식으로 생각 풀어 가고 있었는데 같이 논의하던 한 분이 raw 데이터 그대로 저장한 뒤 일괄 업데이트하는게 구조도 단순해지고 성능도 오히려 나을 수 있겠다는 의견을 내셔서 검토해보기로 했다.

검토 작업 일환으로 직전 정보로 null 속성 일괄 채워넣어서 업데이트하는 SQL 문 테스트.

Oracle 에서는 'LAST_VALUE(컬럼 IGRNORE NULLS)' 같은 방식으로 좀 더 간단하게 이 문제 해결할 수 있는 듯 한데 postgresql 이나 mariadb 는 윈도우 함수에서 IGRNORE NULLS 옵션 지원하지 않아서 sum(case when 컬럼 is null then 0 else 1 end) 과 같은 트릭을 이용해야 하는 듯.

장단점이 있지만 애플리케이션 단에서 구현할 때 추가로 해결해야할 문제들 한 방에 해결해주니 확실히 구조는 깔끔해질 듯 하다.

이러니 RDB 에서 벗어나기가 참 쉽지 않다 ㅎ