データベース

TimescaleDB

概要

TimescaleDBは、高性能なリアルタイム分析を可能にするPostgreSQL拡張として構築された時系列データベースです。PostgreSQLの全機能を保持しながら、時系列データ用の最適化と専用機能を追加し、従来のPostgreSQLと比較して最大1,000倍高速なクエリと90%のデータ圧縮を実現します。2024年にはAI統合機能とベクトル検索機能が大幅に強化されました。

詳細

TimescaleDBは、PostgreSQLエコシステムの力を借りて時系列データの課題を解決する革新的なアプローチを採用しています。コアとなるHypertablesは、時間ベースで自動的にデータをパーティション化し、単一の仮想テーブルとして操作できるようにします。各Hypertableは「チャンク」と呼ばれる子テーブルに分割され、クエリ実行時に関連するチャンクのみがスキャンされるため、大幅な性能向上を実現します。

継続集計(Continuous Aggregates)機能により、バックグラウンドで自動的に集計処理が行われ、分析クエリの応答時間を分単位から数ミリ秒に短縮できます。2024年のアップデートでは、リアルタイム継続集計により、新しく挿入されたデータに対する計算を即座に実行できるようになりました。

2024年の主要な機能強化には、チャンクスキッピング、SIMD(Single Instruction, Multiple Data)ベクトル化によるパフォーマンス向上、AIアプリケーション向けのpgaiとpgvectorscale拡張機能の統合があります。これらにより、PostgreSQLベースでありながら専用時系列データベースに匹敵する性能を提供します。

メリット・デメリット

メリット

  1. PostgreSQL完全互換性: 既存のPostgreSQLツール、コネクタ、エコシステムをそのまま利用可能
  2. 劇的な性能向上: 時系列データで最大1,000倍高速なクエリと90%のデータ圧縮
  3. 自動最適化: Hypertablesによる自動パーティション化とチャンク管理
  4. 継続集計: バックグラウンドでの自動集計によりリアルタイム分析を高速化
  5. 水平スケーラビリティ: マルチノード構成で毎秒100万行以上の挿入が可能
  6. 豊富な機能セット: データ保持ポリシー、圧縮、バックアップ・リストア機能
  7. AI統合: 2024年にpgaiとpgvectorscale拡張により機械学習とベクトル検索を統合
  8. リレーショナル機能: JOINクエリ、外部キー、トランザクション等の標準SQL機能を完全サポート

デメリット

  1. 複雑性の増加: Hypertableの多数のチャンク管理により、クエリプランニングが複雑化
  2. 学習コストの上昇: PostgreSQLに加えてTimescaleDB固有の機能習得が必要
  3. メモリ使用量の増加: インデックス付きテーブルがメモリに収まらない場合の性能低下
  4. 特化型DBとの比較: 超高スループットが要求される場合、InfluxDB等の専用DBが有利な場合もある
  5. PostgreSQL制約の継承: スキーマの厳格性など、PostgreSQL由来の制約が残存
  6. コスト考慮: エンタープライズ機能は有償版のTimescale Cloudが必要

参考ページ

書き方の例

インストールとセットアップ

# Dockerを使用したTimescaleDBの起動
docker run -d --name timescaledb -p 5432:5432 \
  -e POSTGRES_PASSWORD=password \
  timescale/timescaledb:latest-pg17

# コンテナに接続
docker exec -it timescaledb psql \
  -d "postgres://postgres:password@localhost/postgres"

基本的なHypertableの作成

-- TimescaleDB拡張機能を有効化
CREATE EXTENSION IF NOT EXISTS timescaledb;

-- 通常のテーブルを作成
CREATE TABLE conditions (
  time        TIMESTAMPTZ       NOT NULL,
  location    TEXT              NOT NULL,
  temperature DOUBLE PRECISION  NULL,
  humidity    DOUBLE PRECISION  NULL
);

-- Hypertableに変換(時間ベースでパーティション化)
SELECT create_hypertable('conditions', by_range('time'));

データ挿入と基本クエリ

-- データの挿入
INSERT INTO conditions VALUES
  (NOW(), 'office',   70.0, 50.0),
  (NOW(), 'basement', 66.5, 60.0),
  (NOW(), 'garage',   77.0, 65.2);

-- 時間範囲での検索
SELECT COUNT(*) FROM conditions 
WHERE time > NOW() - INTERVAL '12 hours';

-- time_bucket関数を使用した時系列集計
SELECT
  time_bucket('1 day', time) AS bucket,
  AVG(temperature) AS avg_temp
FROM conditions
GROUP BY bucket
ORDER BY bucket ASC;

圧縮設定とポリシー

-- カラムストア圧縮を有効化
ALTER TABLE conditions SET (
  timescaledb.compress,
  timescaledb.compress_segmentby = 'location'
);

-- 7日経過後に自動圧縮するポリシーを追加
SELECT add_compression_policy('conditions', INTERVAL '7 days');

継続集計(Continuous Aggregates)

-- 日次サマリーの継続集計を作成
CREATE MATERIALIZED VIEW conditions_summary_daily
WITH (timescaledb.continuous) AS
SELECT
  location,
  time_bucket(INTERVAL '1 day', time) AS bucket,
  AVG(temperature),
  MAX(temperature),
  MIN(temperature)
FROM conditions
GROUP BY location, bucket;

-- 継続集計の自動更新ポリシーを設定
SELECT add_continuous_aggregate_policy(
  'conditions_summary_daily',
  start_offset => INTERVAL '1 month',
  end_offset => INTERVAL '1 day',
  schedule_interval => INTERVAL '1 hour'
);

高度な時系列分析機能

-- ギャップフィリング(欠損データの補完)
SELECT
  time_bucket_gapfill('1 hour', time) AS bucket,
  location,
  locf(avg(temperature)) AS temperature
FROM conditions
WHERE time >= NOW() - INTERVAL '24 hours'
GROUP BY bucket, location
ORDER BY bucket, location;

-- 移動平均の計算
SELECT
  time,
  location,
  temperature,
  AVG(temperature) OVER (
    PARTITION BY location 
    ORDER BY time 
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS moving_avg
FROM conditions
ORDER BY location, time;

データ保持とバックアップ

-- 古いデータの自動削除ポリシー(1年後に削除)
SELECT add_retention_policy('conditions', INTERVAL '1 year');

-- バックアップとリストア
-- PostgreSQLの標準ツールが使用可能
pg_dump -h localhost -U postgres -d timescaledb > backup.sql
psql -h localhost -U postgres -d new_db < backup.sql