DBAtlas · 데이터베이스 운영 아틀라스

시계열 데이터

Oracle

-- Range partitioning by date:
CREATE TABLE measurements (
  ts TIMESTAMP, sensor_id NUMBER, value NUMBER)
PARTITION BY RANGE (ts)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p0 VALUES LESS THAN (TIMESTAMP '2026-01-01 00:00:00') );

Oracle에서 시계열 데이터는 보통 RANGE(INTERVAL) 파티셔닝으로 관리한다. 새 파티션이 자동으로 생성되고 오래된 파티션은 쉽게 삭제된다(파티션 프루닝으로 쿼리 가속). 압축(ILM/ADO)과 집계용 materialized view도 사용된다.

PostgreSQL

-- Hypertable with the TimescaleDB extension:
CREATE EXTENSION IF NOT EXISTS timescaledb;
CREATE TABLE measurements (ts TIMESTAMPTZ, sensor_id INT, value DOUBLE PRECISION);
SELECT create_hypertable('measurements', 'ts');
-- Summarize with a continuous aggregate.

PostgreSQL은 네이티브 파티셔닝(PARTITION BY RANGE)으로 시계열을 보관할 수 있다. TimescaleDB 확장은 자동 시간 기반 chunk 분할, 압축, 보존 정책, continuous aggregate를 갖춘 hypertable을 추가한다. 대규모 IoT/메트릭 워크로드에 널리 쓰이는 솔루션이다.

MySQL

-- RANGE partitioning by date:
CREATE TABLE measurements (
  ts DATETIME, sensor_id INT, value DOUBLE,
  PRIMARY KEY (ts, sensor_id))
PARTITION BY RANGE (TO_DAYS(ts)) (
  PARTITION p2026_01 VALUES LESS THAN (TO_DAYS('2026-02-01')),
  PARTITION pmax VALUES LESS THAN MAXVALUE);

MySQL은 전용 시계열 엔진을 제공하지 않는다. RANGE 파티셔닝(TO_DAYS/UNIX_TIMESTAMP 사용)으로 오래된 데이터를 빠르게 삭제하고 파티션 프루닝을 적용할 수 있다. 대용량 시계열에는 보통 외부 솔루션(TimescaleDB, InfluxDB)이나 요약 테이블이 권장된다.

SQL Server

-- Partitioned table (partition function + scheme) or
-- system-versioned temporal table (history kept automatically):
CREATE TABLE dbo.measurements (
  id INT PRIMARY KEY, value DECIMAL(10,2),
  valid_from DATETIME2 GENERATED ALWAYS AS ROW START,
  valid_to DATETIME2 GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to))
WITH (SYSTEM_VERSIONING = ON);

SQL Server는 partition function/scheme으로 파티셔닝하여 시계열을 관리하며, 넓은 날짜 범위에 걸친 데이터에 프루닝과 빠른 아카이빙을 제공한다. 또한 system-versioned temporal 테이블(SYSTEM_VERSIONING)은 행 변경 이력을 자동으로 보관하고 특정 시점 조회(FOR SYSTEM_TIME)를 지원한다.

MongoDB

// Time-series collection (MongoDB 5.0+):
db.createCollection("measurements", {
  timeseries: {
    timeField: "ts",
    metaField: "sensor_id",
    granularity: "seconds"
  }
})

MongoDB 5.0에서 도입된 time-series 컬렉션은 시간과 메타 필드 기준으로 데이터를 압축된 컬럼 유사(bucketed) 형식으로 자동 저장한다. 디스크와 인덱스 사용량을 줄이고 범위 쿼리 속도를 높인다. timeField는 필수이며, metaField(소스/태그)와 granularity가 성능을 좌우한다.

Redis

# Requires the RedisTimeSeries module (Redis Stack).
# Create a series with a retention period:
TS.CREATE sensor:1 RETENTION 86400000 LABELS type temperature
# Add a sample (with an automatic timestamp):
TS.ADD sensor:1 * 23.5

기본 Redis에는 시계열 타입이 없다. RedisTimeSeries 모듈(Redis Stack)이 TS.CREATE/TS.ADD를 통한 고속 샘플 수집, 자동 보존(RETENTION), 다운샘플링(TS.CREATERULE), TS.RANGE/TS.MRANGE를 통한 레이블 기반 범위 쿼리를 제공한다. 모듈이 없으면 Sorted Set으로 흉내 낸다.

Elasticsearch

# Data stream: automatically rolling indexes for time series
PUT _index_template/measurements-tpl
{ "index_patterns": ["measurements*"], "data_stream": {},
  "template": {
    "settings": { "index.mode": "time_series", "index.routing_path": ["sensor_id"] },
    "mappings": { "properties": {
      "@timestamp": { "type": "date" },
      "sensor_id": { "type": "keyword", "time_series_dimension": true },
      "temperature": { "type": "double", "time_series_metric": "gauge" } } } } }
PUT _data_stream/measurements

Elasticsearch는 data stream으로 시계열 데이터를 관리한다. 시간이 지나면 새 backing index가 자동으로 생성되고(rollover), ILM이 오래된 데이터를 hot/warm/cold 계층으로 옮기고 삭제한다. TSDS(index.mode: time_series)는 메트릭 데이터 전용 스토리지 최적화를 제공한다. 최소 하나의 time_series_dimension 필드, 이를 가리키는 index.routing_path, @timestamp 필드가 필수다(없으면 템플릿이 거부된다).

DBAtlas에서 열기 →