TimescaleDBによるPostgreSQLでの時系列データ高速化
Emily Parker
Product Engineer · Leapcell

今日のデータ中心の世界では、時系列データはどこにでも存在します。IoTデバイスのメトリクスや金融市場の変動から、アプリケーションパフォーマンスの監視、センサーの読み取りまで、ビジネスは連続的なタイムスタンプ付き情報のストリームで溢れています。この増え続けるデータ量を効果的に保存し、クエリすることは重要な課題です。伝統的なリレーショナルデータベースは、強力ではありますが、時系列データのAPPEND-ONLYの性質、高い挿入レート、時間ベースの集計や範囲に焦点を当てたクエリパターンといったユニークな特徴にはしばしば苦労します。これにより、パフォーマンスのボトルネックや運用上の問題が生じることがよくあります。幸いなことに、PostgreSQL用のTimescaleDB拡張機能のような専門的なソリューションが登場し、これらの課題に対処し、堅牢な汎用データベースを高性能な時系列の強力なツールへと変貌させています。
時系列データの現状を理解する
TimescaleDBの詳細に入る前に、時系列データとその管理に関連する主要な概念について共通の理解を確立しましょう。
- 時系列データ: 時間順にインデックス付け(またはリスト化)されたデータポイントのシーケンスです。各データポイントは通常、タイムスタンプと1つ以上の測定値で構成されます。
- 高い取り込みレート: 時系列アプリケーションはしばしば非常に高い頻度でデータを生成するため、データベースに堅牢な書き込みパフォーマンスが求められます。
- 時間ベースのクエリ: 一般的なクエリパターンには、時間範囲によるフィルタリング、特定の期間にわたるデータの集計(例:平均、合計、カウント)、および異なる期間にわたるデータの比較が含まれます。
- データ保持ポリシー: データの膨大な量のため、時系列データはしばしば異なる保持要件を持ち、古いデータはアーカイブまたはダウンサンプリングされる可能性があります。
- ハイパーテーブル: TimescaleDBでは、これが中心的な抽象化となります。これは、時間およびオプションで他の列に基づいて、データを複数の通常のPostgreSQLテーブル(「チャンク」と呼ばれる)に自動的にパーティション分割する仮想テーブルです。このパーティショニングは、パフォーマンス上の利点の鍵となります。
- チャンク: 特定の時間範囲のハイパーテーブルデータの一部を格納する通常のPostgreSQLテーブルです。TimescaleDBはこれらのチャンクを透過的に管理します。
TimescaleDBの利点
TimescaleDBはPostgreSQLを拡張し、PostgreSQLの信頼性、柔軟性、および広範なエコシステムを犠牲にすることなく、ネイティブな時系列機能をもたらします。その中心的な原則は、ユーザーにはほとんど隠されたインテリジェントなパーティショニングであり、時系列ワークロードのパフォーマンスを劇的に向上させます。
TimescaleDBはどのように魔法をかけるのか
TimescaleDBの効率の核心は、ハイパーテーブルとチャンキングにあります。ハイパーテーブルを作成すると、時間列(およびオプションで、他のパーティショニングキー)を指定します。TimescaleDBは、この論理テーブルを、より小さく、より管理しやすい物理テーブル、つまりチャンクに自動的に分割します。
効率的な取り込み: 新しいデータは常に最新の、アクティブなチャンクに書き込まれます。これは、挿入が主に小さいテーブルを対象とするため、書き込みが速くなり、単一の増え続けるテーブルでの競合を回避できることを意味します。
高速なクエリ: 時間ベースのフィルターでハイパーテーブルをクエリすると、TimescaleDBのクエリオプティマイザー(「チャンクアグリゲーター」と呼ばれる)が、関連するチャンクのみをインテリジェントに特定してスキャンします。これにより、データベースが処理する必要のあるデータ量が大幅に削減され、クエリの実行がはるかに高速になります。たとえば、過去1時間分のデータをクエリする場合、TimescaleDBはデータセット全体ではなく、その特定の時間をカバーするチャンクのみを確認すれば済みます。
自動データ管理: TimescaleDBは、チャンクの作成と管理を自動的に行います。データが到着し、時間が進むにつれて、手動介入なしに新しいチャンクが作成されます。また、データ保持ポリシー(古いチャンクを自動的に削除するため)やダウンサンプリング(長期間保存のためにデータをより粗い粒度に集計するため)のような機能も提供します。
実践的な実装
センサーデータを保存するためにTimescaleDBを使用する簡単な例を見てみましょう。
1. TimescaleDB拡張機能のインストール:
まず、PostgreSQLインスタンスにTimescaleDBがインストールされている必要があります。これには通常、postgresql.conf
に拡張機能を追加し、データベース内で作成することが含まれます。
-- データベースに接続 \c your_database_name -- TimescaleDB拡張機能を作成 CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
2. 通常のテーブルの作成: まず、PostgreSQLで通常行うようにスキーマを定義します。さまざまなセンサーからの温度を追跡しているとしましょう。
CREATE TABLE sensor_readings ( time TIMESTAMPTZ NOT NULL, sensor_id INTEGER NOT NULL, temperature DOUBLE PRECISION );
3. ハイパーテーブルへの変換:
次に、この通常のテーブルをハイパーテーブルに変換します。これがTimescaleDBの最適化を可能にする重要なステップです。time
を時間パーティショニング列として指定します。
SELECT create_hypertable('sensor_readings', 'time');
チャンクのサイズを制御するために、chunk_time_interval
(例:interval '1 day'
またはinterval '1 hour'
)を指定することもできます。チャンクが大きいほどファイル数は少なくなりますが、チャンクあたりのスキャンデータ量は多くなる可能性があります。チャンクが小さいほどファイル数は多くなりますが、ターゲットを絞ったスキャンはより多くなる可能性があります。TimescaleDBのデフォルトは多くの場合うまく機能しますが、特定のワークロードではチューニングが必要になる場合があります。
4. データの挿入: ハイパーテーブルへの挿入は、通常のテーブルへの挿入とまったく同じです。
INSERT INTO sensor_readings (time, sensor_id, temperature) VALUES ('2023-01-01 10:00:00+00', 1, 22.5), ('2023-01-01 10:01:00+00', 1, 22.7), ('2023-01-01 10:00:00+00', 2, 21.9), ('2023-01-01 10:02:00+00', 1, 23.0), ('2023-01-02 11:00:00+00', 1, 24.1), ('2023-01-02 11:01:00+00', 2, 23.8);
5. クエリ: 標準的なSQLクエリはシームレスに機能します。TimescaleDBは、正しいチャンクをターゲットにするようにインテリジェントに書き換えます。
-
時間範囲によるクエリ:
SELECT * FROM sensor_readings WHERE time >= '2023-01-01 10:00:00+00' AND time < '2023-01-01 11:00:00+00';
-
時間ベースの集計: TimescaleDBは、時系列分析のための強力な関数、特に
time_bucket()
を提供します。この関数を使用すると、データを任意の時間間隔にグループ化できます。SELECT time_bucket('5 minutes', time) AS five_min_bucket, sensor_id, AVG(temperature) AS avg_temp FROM sensor_readings WHERE time >= '2023-01-01 10:00:00+00' AND time < '2023-01-01 11:00:00+00' GROUP BY five_min_bucket, sensor_id ORDER BY five_min_bucket, sensor_id;
このクエリは、各センサーの平均温度を5分間隔でエレガントに計算します。time_bucket()
がない場合、通常はより複雑な日付操作が必要になります。
高度な機能とユースケース
TimescaleDBは、基本的なチャンキング以上のものを提供します。
- 圧縮: アクセス頻度の低い古いチャンクについては、TimescaleDBは列指向圧縮を可能にし、ストレージフットプリントを大幅に削減します。
- 継続的集計: これらは、時間とともにデータを自動的に事前集計するマテリアライズドビューであり、バックグラウンドで計算を実行することにより、一般的な分析クエリを劇的に高速化します。
- データ保持ポリシー: 指定した期間よりも古いチャンクを自動的に削除するポリシーを定義し、ストレージコストを管理します。
- 実行可能な分析: 単純な集計を超えて、TimescaleDBは複雑なウィンドウ関数と高度な分析クエリをサポートし、時系列インテリジェンスのための汎用的なツールとなります。
TimescaleDBは、以下のようなシナリオで優れています。
- IoT監視: 数千または数百万のセンサーからのデータの収集と分析。
- インフラストラクチャ監視: サーバーとサービスのCPU、メモリ、ネットワーク、ディスク使用率の追跡。
- 金融データ分析: ティック単位の市場データを保存し、リアルタイム分析を実行。
- アプリケーションパフォーマンス監視(APM): アプリケーションの応答時間、エラー、リソース使用率に関するメトリクスの収集。
結論
時系列データを効率的に保存およびクエリすることは、単純ではないタスクであり、伝統的なリレーショナルデータベースはしばしば苦労します。TimescaleDBはPostgreSQLを専用の時系列データベースに変貌させ、インテリジェントなパーティショニングと時間認識型最適化を活用して、大量の取り込みと複雑な分析クエリの両方で優れたパフォーマンスを提供します。馴染みがあり堅牢なPostgreSQLエコシステムを拡張することにより、TimescaleDBは、増え続けるタイムスタンプ付き情報の奔流を管理するための、強力でスケーラブルで開発者に優しいソリューションを提供します。アプリケーションが時系列データを扱っている場合、PostgreSQLでTimescaleDBを採用することは、効率と機能性の大きな飛躍をもたらします。