Skip to content

TimescaleDB

An open-source time-series SQL database optimized for fast ingest and complex queries. Packaged as a PostgreSQL extension.

Categories

About

  • Time-series 데이터를 위한 멀티노드, 페타바이트 지원 RDB (PostgreSQL 기반)
  • Timescale License로 완전히 Free
    • as-a-service 는 불가
  • Docker 또는 Ubuntu/Debian/Centos 용 설치 바이너리 제공
  • TimescaleDB 는 PostgreSQL 기반에서 시계열 워크로드를 위해 특별히 설계됨
  • 94+% 이상의 기본압축을 지원하고, PostgreSQL/InfluxDB/Cassandra/MongoDB 보다 10~100배 빠른 쿼리 가능
  • 멀티노드 구현을 위해서 분산 Hypertable 이라는 가상 테이블 기법을 도입(여러노드에 자동으로 파티셔닝)

시계열 데이터 (Time-series Data) 란?

A가 B에게 돈을 보낸다면 양쪽에서 숫자가 빠지고 늘어난 것만 기록하면 되지만, 시계열 데이터는 데이터의 변경을 UPDATE가 아닌 INSERT로 추적하는 데이터 셋. 이 변경 정보를 통해서 이 둘이 어떤 관계가 있거나 둘사이에 어떤 일이 벌어지고 있다는 것을 알수 있게 됨.

시계열 데이터는 금융,제조,전력,유틸리티등 산업에 주로 적용되었지만 지난 몇년간 모니터링, IoT, 암호화폐, 게임, 머신러닝 등의 성장으로 폭발적으로 쓰임새가 증가 데이터 기반 의사결정을 위해서 변화를 추적할 수 있는 가장 정확한 데이터.

Quick start

Docker를 사용한다면:

docker run --rm --name timescaledb -p 5432:5432 -e POSTGRES_USER=userid -e POSTGRES_PASSWORD=password timescale/timescaledb:2.1.0-pg13

Hypertable

PostgreSQL 테이블 (후자를 대체)에서 TimescaleDB 하이퍼 테이블을 생성하고 시간에 따라 분할되고 하나 이상의 다른 열 (즉, 공간)에서 분할하는 옵션을 사용합니다. ALTER TABLE, SELECT 등과 같은 모든 작업은 결과 하이퍼 테이블에서 계속 작동합니다.

Required Arguments

relation
Identifier of table to convert to hypertable.
time_column_name
Name of the column containing time values as well as the primary column to partition by.

Example

CREATE TABLE conditions (
  time        TIMESTAMPTZ       NOT NULL,
  location    TEXT              NOT NULL,
  temperature DOUBLE PRECISION  NULL,
  humidity    DOUBLE PRECISION  NULL
);

conditions 테이블의 time 컬럼을 인자로 넘기면 된다.

SELECT create_hypertable('conditions', 'time');

APIs

add_retention_policy

Create a policy to drop chunks older than a given interval of a particular hypertable or continuous aggregate on a schedule in the background. (See drop_chunks). This implements a data retention policy and will remove data on a schedule. Only one retention policy may exist per hypertable.

관리 방법 및 TIP

Chunk

  • table 생성후 hypertable 적용하면 chunk table이 생성된다.
  • chunk table을 따로 설정하지 않았다면 기본주기는 7일이며 7일뒤에 새로운 chunk table을 생성한다.
  • chunk table은 table에 저장된 data들을 가지고 있다.
  • chunk table 삭제시 data들도 삭제된다.

TimeScaleDB 오래된 데이터 제거

시계열 데이터는 데이터가 많이 쌓이므로 주기적으로 제거할 필요가 있지만, DELETE로 삭제시 많은 부하가 걸리므로 아래와 같은 방식을 공식홈페이지에선 추천한다.

-- 24시간이 지난 chunk table 삭제
SELECT add_retention_policy('a4y_state', INTERVAL '24 hours');

지정된 정책을 제거하고 싶다면:

SELECT remove_retention_policy('a4y_state');

JOB 상태는 다음 쿼리로 확인할 수 있다.

SELECT * FROM timescaledb_information.job_stats;

chunk table이 삭제가 안되는 경우

chunk table이 한개밖에 없는 경우
chunk table의 주기를 확인해보자.

Chunk Table의 주기 설정

SELECT set_chunk_time_interval('conditions', INTERVAL '24 hours');
  • 24시간 주기 설정
  • 이 설정은 테이블 생성시 설정한 주기가 끝난 이후에 적용된다.
  • 만약 테이블 생성시 설정하지 않았다면 기본설정인 7일 이후에 적용된다.

시계열 데이터를 위한 고급 SQL 함수

Timescale에는 더 적은 코드 줄로 시계열 분석을 수행하는 데 도움이 되는 많은 사용자 지정 SQL 함수가 있습니다.

이러한 기능의 예는 다음과 같습니다.

  • time_bucket() - 임의의 시간 간격에 대한 데이터 분석에 사용
  • first() - 집계 그룹 내 시간을 기준으로 가장 빠른 값을 찾는 데 사용
  • last() - 집계 그룹 내에서 시간을 기준으로 최신 값을 찾는 데 사용
  • time_bucket_gapfill() - 임의의 시간 간격으로 데이터를 분석하고 데이터의 공백을 채우는 데 사용
  • locf() - 마지막으로 관찰된 값을 앞으로 전달하여 데이터의 공백을 채우는 데 사용
  • interpolate() - 알려진 데이터 포인트 사이의 결측값을 선형으로 보간하여 공백 채우기 사용

time_bucket

다음 time_bucket()은 지난 6개월 동안 각 도시의 15일 평균 기온을 찾는 데 사용하는 방법의 예입니다:

-----------------------------------
-- time_bucket
-- Average temp per 15 day period
-- for past 6 months, per city
-----------------------------------
SELECT time_bucket('15 days', time) as "bucket"
   ,city_name, avg(temp_c)
   FROM weather_metrics
   WHERE time > now() - (6* INTERVAL '1 month')
   GROUP BY bucket, city_name
   ORDER BY bucket DESC;

A4y 테스트에 사용된 쿼리:

SELECT time_bucket('1 days', time) as bucket,
   max(pm10) as max_pm10,
   min(pm10) as min_pm10
   FROM a4y_state
   WHERE time > now() - (6* INTERVAL '1 month') and uid=1079
   group by bucket;

See also

Favorite site

Documentation

Guide