Database.

TimescaleDB는 무엇인가?

PI.314 2023. 12. 29. 23:14

이 글에서는 PostgreSQL 기반의 오픈 소스 시계열 데이터베이스인 TimescaleDB와 그 핵심 기능인 하이퍼테이블에 대해 알아보겠습니다.


TimescaleDB

TimescaleDB는 관계형 데이터베이스의 강력한 기능과 시계열 데이터를 효율적으로 처리하는 능력을 결합한 데이터베이스입니다. PostgreSQL의 확장으로, 기존 SQL 지식을 활용하여 시계열 데이터를 쉽게 처리할 수 있습니다. 높은 쓰기 성능, 효율적인 데이터 압축, 강력한 쿼리 기능이 특징입니다.

하이퍼테이블

하이퍼테이블은 TimescaleDB의 핵심 개념으로, 일반적인 PostgreSQL 테이블처럼 보이지만 내부적으로 여러 개의 데이터 파티션(청크라고 함)으로 나뉩니다. 이 구조는 시계열 데이터의 대량 삽입과 복잡한 쿼리를 효율적으로 처리할 수 있도록 해줍니다.

하이퍼테이블 생성 및 관리

하이퍼테이블은 대규모 시계열 데이터를 효율적으로 관리하기 위해 파티셔닝과 인덱싱을 사용합니다. 이 글에서는 하이퍼테이블의 파티셔닝 방법, 설정 및 관련 쿼리에 대해 설명하겠습니다.

하이퍼테이블 파티셔닝의 이해

하이퍼테이블은 시계열 데이터를 '청크(chunk)'라는 파티션으로 분할하여 관리합니다. 이 청크는 시간 또는 다른 치수(예: 장치 ID)에 따라 생성될 수 있으며, 데이터의 삽입과 쿼리 성능을 향상시킵니다.

  • 청크는 자동으로 생성되며, 특정 시간 범위 또는 다른 치수에 따라 데이터를 포함합니다.
  • 청크의 크기와 수명 주기는 사용자가 설정할 수 있으며, 이는 데이터의 볼륨과 쿼리 패턴에 따라 다릅니다

TimescaleDB에서 하이퍼테이블 설정과 관련된 다양한 쿼리들과 그들의 용도에 대해 설명해드리겠습니다.

1. 하이퍼테이블 생성

하이퍼테이블을 생성하는 기본 쿼리입니다. 일반 PostgreSQL 테이블을 생성한 후, 이를 하이퍼테이블로 변환합니다.

CREATE TABLE temperature_data (
    time TIMESTAMPTZ NOT NULL,
    sensor_id INT,
    temperature DOUBLE PRECISION
);

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

2. 청크 시간 간격 설정

하이퍼테이블의 청크 크기를 시간 간격으로 설정합니다. 예를 들어, 아래 쿼리는 각 청크가 1주일의 데이터를 보유하도록 설정합니다.

SELECT set_chunk_time_interval('temperature_data', INTERVAL '1 week');

3. 청크 사이즈 제한 설정

청크의 최대 크기를 설정할 수 있습니다. 이는 디스크 공간을 관리하고 쿼리 성능을 최적화하는 데 유용합니다.

SELECT set_chunk_size_constraint('temperature_data', 524288000); -- 예: 500MB

4. 데이터 보존 정책 설정

데이터 보존 정책을 설정하여 오래된 데이터를 자동으로 삭제할 수 있습니다. 예를 들어, 아래 쿼리는 12개월 이상 된 데이터를 삭제합니다.

SELECT add_retention_policy('temperature_data', INTERVAL '12 months');

5. 데이터 압축 정책 설정

데이터 압축 정책을 설정하여 공간을 절약하고 쿼리 성능을 향상시킬 수 있습니다. 아래 쿼리는 7일보다 오래된 데이터를 압축합니다.

SELECT add_compression_policy('temperature_data', INTERVAL '7 days');

6. 연속 집계(Continuous Aggregation) 생성

연속 집계를 설정하여 자주 실행되는 집계 쿼리의 성능을 향상시킬 수 있습니다. 아래는 시간별 평균 온도를 계산하는 연속 집계의 예시입니다.

CREATE VIEW hourly_temperature_stats
WITH (timescaledb.continuous)
AS
SELECT time_bucket('1 hour', time) as bucket,
       sensor_id,
       AVG(temperature) as avg_temp
FROM temperature_data
GROUP BY bucket, sensor_id;

7. 청크 조회

현재 생성된 청크를 조회하는 쿼리입니다. 데이터 관리 및 트러블슈팅에 유용합니다.

SELECT show_chunks('temperature_data');

 

이러한 쿼리들은 하이퍼테이블의 성능 최적화, 공간 관리, 데이터 보존 등 다양한 측면에서 중요한 역할을 합니다. 하이퍼테이블 설정을 적절히 관리함으로써, 대규모 시계열 데이터를 효과적으로 처리하고 분석할 수 있습니다.