Search

개요

PostgreSQL 기반 DB 중 가장 널리 쓰이는 솔루션 중 하나

TimescaleDB란?

PostgreSQL 위에 확장 형태로 구현된 시계열(time-series) 데이터베이스 즉, PostgreSQL의 안정성과 SQL 호환성을 그대로 유지하면서 시간 기반 데이터(센서, 로그, 모니터링 데이터 등) 처리를 효율적으로 해줌

아키텍처 핵심 개념

 Hypertable (하이퍼테이블)

TimescaleDB의 심장 시계열 데이터를 자동으로 분할(partition)해서 관리하는 가상 테이블
사용자는 그냥 일반 테이블처럼 INSERT / SELECT 하지만, 내부적으로는 시간 단위 chunk로 데이터를 쪼개서 저장
CREATE TABLE metrics ( time TIMESTAMPTZ NOT NULL, host TEXT, cpu_usage DOUBLE PRECISION ); SELECT create_hypertable('metrics', 'time');
SQL
복사
내부적으로 metrics_2025_10_29, metrics_2025_10_30 … 이런 식으로 청크가 자동 관리됨
다음 장점들 존재 :
시간 기반 쿼리 속도 향상
오래된 청크만 따로 압축 & 삭제 가능
데이터 삽입 성능(insert throughput) 향상

 Chunk(청크)

하이퍼테이블을 시간 또는 공간 기준으로 자동 분할한 실제 물리 테이블
예를 들어 하루 단위로 청크를 만들면, 2025-10-01~2025-10-02 데이터는 metrics_1에 저장되고, 2025-10-02~2025-10-03 데이터는 metrics_2에 저장됨
쿼리 시에는 자동으로 필요한 청크만 탐색하므로 I/O 효율이 좋음

 Continuous Aggregate(연속 집계)

시계열 데이터를 미리 집계해두는 뷰(Materialized View)
시계열은 데이터가 많아서 매번 GROUP BY time를 하면 느림. 따라서 이를 자동화 + 증분 업데이트 해줌
CREATE MATERIALIZED VIEW cpu_hourly WITH (timescaledb.continuous) AS SELECT time_bucket('1 hour', time) AS hour, host, avg(cpu_usage) AS avg_cpu FROM metrics GROUP BY hour, host;
SQL
복사

 Compression(압축)

오래된 데이터 자동 압축 기능(보존 주기 관리와 함께 사용)
ALTER TABLE metrics SET ( timescaledb.compress, timescaledb.compress_orderby = 'time DESC' ); SELECT add_compression_policy('metrics', INTERVAL '30 days');
SQL
복사
다음 장점들 존재 :
압축률: 약 90% (공식 평균 10배 절감)
자동 정책: 30일 지난 chunk는 자동 압축
쿼리 시 압축 상태에서도 바로 조회 가능 (자동 decompression)

 Retention Policy(보존 정책)

일정 기간이 지난 데이터 자동 삭제 (TTL 기능)
SELECT add_retention_policy('metrics', INTERVAL '180 days');
SQL
복사
다음 장점들 존재 :
오래된 데이터 정리 자동화
운영 중 디스크 용량 관리 간편

 PostgreSQL 호환성

PostgreSQL 100% 호환 SQL 엔진
기존 psql, pgAdmin, Grafana, Superset, Python psycopg2 등 그대로 사용 가능
JOIN, JSON, GIS(PostGIS), Full-text search 다 지원
외래키, 트랜잭션, 인덱스, 함수 등 RDB 기능 그대로 사용 가능

특징

각 시계열 측정값이 자신만의 행에 기록된다

시계열 데이터의 기본 저장 방식
CPU 사용률을 10초마다 측정한다고 하면, 각 측정값(measurement)은 하나의 row로 저장됨
time
server_id
cpu_usage
10:00:00
A
40.2
10:00:10
A
43.1
10:00:20
A
38.9
즉, 한 줄(row)은 하나의 시점(time)에 대한 데이터

필드들은 다양한 타입을 가질 수 있다

PostgreSQL을 기반으로 하므로, PostgreSQL이 지원하는 거의 모든 데이터 타입 사용 가능 즉, 시계열 테이블은 단순히 time + number만 저장하는게 아니라, 다양한 센서 값, 상태, 메타데이터까지 한 행에 함께 저장 가능
데이터 타입
예시
용도
float, int
45.6, 120
수치형 지표
boolean
true, false
상태 값 (ex: 서버 up/down)
text, varchar
"prod-server-1"
문자열
jsonb
{"temp":22, "unit":"C"}
반정형 데이터 (IoT, 로그 등)
timestamp, date
2025-10-30 15:00
시간 정보
bytea
\xdeadbeef
바이너리 (이미지, 센서 데이터 등)
geography / geometry
POINT(127.02 37.51)
위치 정보 (PostGIS 확장)
money
₩12,300
금액 데이터

인덱스를 생성할 수 있다

인덱스 : 검색 속도를 빠르게 하는 데이터 구조
TimescaleDB는 PostgreSQL의 인덱싱 기능을 그대로 활용하므로, 다음과 같은 인덱스 생성 가능 즉, 다양한 인덱스를 생성 가능하므로 대규모 시계열 데이터에서도 빠른 조회 가능
인덱스 유형
설명
예시
단일 필드 인덱스
하나의 컬럼
CREATE INDEX ON metrics (device_id);
복합 인덱스
여러 컬럼 조합
CREATE INDEX ON metrics (region, time);
표현식 인덱스
컬럼에 연산 적용
CREATE INDEX ON metrics ((cpu_usage * 100));
부분 인덱스
조건에 맞는 행만
CREATE INDEX ON metrics (device_id) WHERE region='ap-northeast';

외래키(Foreign key)로 연결 가능

관계형 데이터베이스(RDBMS)이므로 다른 테이블과의 관계 정의 가능
CREATE TABLE devices ( device_id TEXT PRIMARY KEY, owner TEXT, location TEXT ); CREATE TABLE metrics ( time TIMESTAMPTZ NOT NULL, device_id TEXT REFERENCES devices(device_id), -- 외래키! cpu_usage DOUBLE PRECISION );
SQL
복사
metrics 테이블의 device_id는, devices 테이블의 device_id를 참조(연결)
“이 데이터는 어떤 장비에서 나온 값인가?”와 같은 관계형 질의를 쉽게 가능

추가 메타데이터 저장 가능

시계열 데이터 외에도 설명용 정보(메타데이터)를 함께 저장 가능
CREATE TABLE metrics_meta ( metric_name TEXT PRIMARY KEY, unit TEXT, description TEXT, created_at TIMESTAMPTZ );
SQL
복사
metrics 테이블에는 실제 측정 데이터 존재 & metrics_meta 테이블에는 각 측정값에 대한 설명, 단위, 생성일 등 메타데이터 저장 가능

결론

TimescaleDB는 단순한 시계열 숫자 저장소가 아니라, PostgreSQL의 모든 데이터 타입, 인덱싱, 관계 기능을 그대로 쓸 수 있는 시계열 데이터 플랫폼