콘텐츠로 이동

TimescaleDB 연속 집계 (Continuous Aggregates)

개요

시계열 데이터를 자주 "시간대별 평균·최대·합"으로 집계한다고 해볼게요. 그때마다 원본 하이퍼테이블 전체를 다시 집계하면 데이터가 쌓일수록 질의가 점점 무거워져요. TimescaleDB의 연속 집계(continuous aggregate) 는 이 문제를 위해 "자동으로 새로고침되는 집계 뷰"를 제공해요. 공식 문서는 연속 집계를 "자동으로 새로고침되는 일종의 하이퍼테이블"이라고 설명해요. 원본 데이터가 바뀌면 집계 결과도 자동으로 갱신되어, 미리 계산해 둔 결과를 빠르게 조회할 수 있어요.

핵심 개념

왜 연속 집계인가

시간 순서로 쌓이는 이벤트가 수억 건이 되면, "시간대별 평균"을 매번 원본에서 새로 계산하는 건 느려요. 연속 집계는 그 집계 결과를 물리적으로 저장해 두고, 새 데이터가 들어오면 증분적으로 갱신해요. 그래서 "자주 보는 집계를 재료 테이블로 만들어 두면 긴 범위 질의가 가벼워진다"는 운영 원칙을 자동화해 주는 셈이에요.

연속 집계 만들기

연속 집계는 CREATE MATERIALIZED VIEWtimescaledb.continuous 옵션을 달아 만드는 이단계 구조예요. 핵심 함수는 time_bucket() 인데, 이걸로 시간을 일정 간격(예: 1시간)으로 쪼갠 "버킷"으로 그룹 집계해요.

CREATE MATERIALIZED VIEW conditions_summary_hourly
WITH (timescaledb.continuous) AS
SELECT device,
       time_bucket(INTERVAL '1 hour', time) AS bucket,
       AVG(temperature),
       MAX(temperature),
       MIN(temperature)
FROM conditions
GROUP BY device, bucket;

이렇게 만들면 conditions_summary_hourly를 그냥 SELECT로 조회하면 돼요. 원본에 새 데이터가 들어오면 정책에 따라 이 집계가 자동으로 갱신돼요.

자동 새로고침 정책

연속 집계의 장점은 사람이 매번 갱신을 호출하지 않는다는 거예요. 새로고침 정책(refresh policy)을 걸어 두면, 새로 들어온 데이터 구간에 대해 집계가 자동으로 갱신돼요. "방금 들어온 1시간을 합쳐서 버킷에 반영하라"처럼 원본 변경분만 증분 처리하므로, 처음 계산보다 비용이 작아요.

조회는 보통 테이블처럼

연속 집계 결과는 일반 테이블처럼 WHERE bucket BETWEEN ...으로 시간 범위를 끊어 조회할 수 있어요. 미리 집계되어 있으니 원본을 훑지 않고도 빠른 시간 범위 집계가 가능해요. 지표 대시보드처럼 "일정 간격으로 특정 값을 집계"하는 흐름에 딱 맞아요.

실제 적용 (데이터스케쳐스)

Events의 시계열 지표(트래픽 집계 등)는 연속 집계로 미리 계산해 두는 게 자연스러운 적용이에요. 예를 들어 이벤트를 하이퍼테이블에 쌓고, "1시간 버킷별 트래픽 평균·최대"를 연속 집계로 만들어 두면, 대시보드가 원본 대신 집계 테이블을 조회해 빠르게 응답할 수 있어요.

여기서 기억할 점은 연속 집계는 원본 하이퍼테이블 위에서 만들어진다는 것과, 그 집계가 정책으로 자동 갱신된다는 거예요. 하이퍼테이블이 없는 상태에서 연속 집계를 만들 순 없으니, 먼저 시간 파티셔닝된 원본을 만들고(하이퍼테이블) 그 위에 집계를 얹는 순서예요. 집계가 자주 보는 질의를 담당하도록 설계하면 될 거예요.

더 알아보기