Search

TimescaleDB 핵심 확장 문법

PostgreSQL + Timescale 전용 시계열 기능 정리 가이드

Hypertable 생성 및 관리

create_hypertable()

일반 테이블을 시계열 최적화 테이블(Hypertable)로 변환
SELECT create_hypertable('metrics', 'time');
SQL
복사
- metrics : 기존 테이블 이름 - time : 시간 컬럼(타임스태프 기반 파티셔닝 기준)
내부적으로 자동 chunking(시간 단위 분할) 수행
여러 노드(분산 환경) 사용 시에는 create_distributed_hypertable() 사용

옵션 예시

SELECT create_hypertable('metrics', 'time', chunk_time_interval => interval '1 day', if_not_exists => TRUE);
SQL
복사
- chunk_time_interval : 청크 크기 지정(1h, 1d, 7d 등) - if_not_exists : 이미 있으면 무시 - partitioning_column : 공간 파티셔닝 추가 가능(예 : device_id)

Continuous Aggregates(연속 집계)

CREATE MATERIALIZED VIEW … WITH (timescaledb.continuous)

시계열 데이터를 자동으로 시간 구간별로 미리 집계하는 뷰
CREATE MATERIALIZED VIEW cpu_hourly WITH (timescaledb.continuous) AS SELECT time_bucket('1 hour', time) AS bucket, host, AVG(usage) AS avg_usage FROM cpu_metrics GROUP BY bucket, host;
SQL
복사
time_bucket()으로 시간 구간을 나누고 Timescale이 자동으로 새 데이터를 집계에 반영

자동 갱신 정책 추가

SELECT add_continuous_aggregate_policy('cpu_hourly', start_offset => INTERVAL '7 days', end_offset => INTERVAL '1 hour', schedule_interval => INTERVAL '1 hour');
SQL
복사

시간 그룹화 & 보간 함수

time_bucket()

지정된 간격으로 시간을 그룹화(PostgreSQL의 date_trunc() 보다 유연)
SELECT time_bucket('5 minutes', time) AS bucket, avg(temp) FROM sensor GROUP BY bucket;
SQL
복사

time_bucket_gapfill()

누락된 시간 구간을 자동으로 채워줌
SELECT time_bucket_gapfill('1 minute', time) AS bucket, loc, AVG(temp) FROM sensor WHERE time > now() - interval '1 hour' GROUP BY bucket, loc ORDER BY bucket; -- interpolate()와 함께 사용 SELECT time_bucket_gapfill('1 minute', time) AS bucket, interpolate(avg(temp)) AS temp FROM sensor GROUP BY bucket;
SQL
복사

시계열 분석 함수

함수
설명
예시
approx_percentile()
근사 백분위수 계산
approx_percentile(0.9, value)
histogram()
값 분포 히스토그램 계산
histogram(temp, 10)
time_weight()
시간 가중 평균용 구조체
time_weight('linear', time, value)
average()
시간 가중 평균 계산
average(time_weight('linear', time, value))
counter_agg()
누적형 데이터(계속 증가하는 카운터) 처리
counter_agg(time, bytes)
delta()
구간별 증분 계산
delta(counter_agg(...))
rate()
초당 변화율 계산
rate(counter_agg(...))
irate()
순간 변화율 (instantaneous rate)
irate(counter_agg(...))