TimescaleDB 拡張機能は、自動パーティショニング、効率的な書き込みとクエリ、およびほぼリアルタイムの集計など、時系列データ向けの機能を ApsaraDB RDS for PostgreSQL インスタンスに追加します。
ApsaraDB RDS for PostgreSQL は、Apache ライセンスに基づくオープンソース版の TimescaleDB を提供しています。ライセンスの制限により、一部の高度な機能は利用できない場合があります。詳細については、「TimescaleDB」をご参照ください。
前提条件
-
インスタンスのメジャーバージョンは PostgreSQL 10 以降である必要があります。
-
インスタンスのマイナーエンジンバージョンは 20230330 以降である必要があります。PostgreSQL 17 のインスタンスでは、マイナーエンジンバージョンは 20241030 以降である必要があります。マイナーエンジンバージョンの確認とアップグレードについては、「マイナーエンジンバージョンの更新」をご参照ください。
重要ApsaraDB RDS for PostgreSQL の拡張機能サポートポリシーは、2023 年 4 月 17 日に更新されました。これにより、この拡張機能はマイナーエンジンバージョン 20230330 以降でのみ作成できます。詳細については、「[通知] 2023 年 4 月 17 日以降、ApsaraDB RDS for PostgreSQL の以前のマイナーエンジンバージョンでは一部の拡張機能の作成が制限されます」をご参照ください。
-
インスタンスが PostgreSQL 14 を実行しており、20230330 より前のマイナーエンジンバージョンで TimescaleDB 拡張機能 (バージョン 2.5.0 以前) を使用していた場合、引き続き拡張機能を使用できます。ただし、マイナーエンジンバージョンを 20230330 以降にアップグレードした後は、引き続き使用するために
ALTER EXTENSION timescaledb UPDATE;コマンドを実行する必要があります。 -
インスタンスが PostgreSQL 15、13、12、11、または 10 を実行しており、20230330 より前のマイナーエンジンバージョンで TimescaleDB 拡張機能を使用していた場合、使用には影響ありません。
-
この拡張機能を初めてインストールする場合、または再インストールする場合は、マイナーエンジンバージョンを 20230330 以降にアップグレードする必要があります。
-
マイナーエンジンバージョンを更新する前に TimescaleDB 拡張機能を作成していた場合、更新後に次のエラーが発生する可能性があります。
ERROR: could not access file "$libdir/timescaledb-1.3.0": No such file or directory
これを解決するには、該当するデータベースに接続し、次のコマンドを実行して拡張機能を更新します。
alter extension timescaledb update;
ステップ 1: TimescaleDB 拡張機能のインストール
コンソール
-
[インスタンス] ページに移動し、上部メニューでリージョンを選択してから、対象のインスタンスの ID をクリックします。
-
左側のナビゲーションペインで、プラグイン をクリックします。
-
プラグインの概要 ページで、timescaledb 拡張機能を探し、インストール をクリックします。
-
ダイアログボックスで、対象のデータベースと特権アカウントを選択して、インストール をクリックします。
インスタンスのステータスがメンテナンス中から実行中に変更されると、拡張機能がインストールされます。
SQL
-
インスタンスパラメータを変更して、
shared_preload_librariesパラメータの 適用中のパラメーター値 にtimescaledbを追加します。 たとえば、適用中のパラメーター値 を'pg_stat_statements,auto_explain,timescaledb'に変更します。 -
対象のデータベースに接続 し、次のコマンドを実行して拡張機能をインストールします。
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;説明インストールを確認するには、
SELECT * FROM pg_extension;を実行し、結果にtimescaledbが表示されることを確認してください。
ステップ 2: ハイパーテーブルの作成
-
対象のデータベースに接続 し、標準の PostgreSQL テーブルを作成します。次の例では、
conditionsという名前のテーブルを作成します。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');
コマンドの詳細な構文については、「ハイパーテーブルの作成」をご参照ください。
ステップ 3: データの効率的な挿入
-
標準 SQL の
INSERTステートメントを使用して、ハイパーテーブルにデータを挿入します。次の例では、1 行を挿入します。INSERT INTO conditions(time, location, temperature, humidity) VALUES (NOW(), 'office', 70.0, 50.0); -
書き込みパフォーマンスを向上させるには、1 つのステートメントで複数の行を挿入します。次の例では、3 行を挿入します。
INSERT INTO conditions VALUES (NOW(), 'office', 70.0, 50.0), (NOW(), 'basement', 66.5, 60.0), (NOW(), 'garage', 77.0, 65.2);
ステップ 4: データのクエリ
-
標準 SQL クエリと TimescaleDB 専用の機能を使用して、データをクエリします。次の例では、過去 3 時間のデータを 15 分のバケットに集計します。
-- 過去 3 時間のデータを 15 分のバケットに集計し、 -- 時刻と温度で結果を並べ替えます。 SELECT time_bucket('15 minutes', time) AS fifteen_min, location, COUNT(*), MAX(temperature) AS max_temp, MAX(humidity) AS max_hum FROM conditions WHERE time > NOW() - interval '3 hours' GROUP BY fifteen_min, location ORDER BY fifteen_min DESC, max_temp DESC;サンプル結果:
fifteen_min | location | count | max_temp | max_hum ------------------------+----------+-------+----------+--------- 2024-12-20 16:00:00+08 | garage | 1 | 77 | 65.2 2024-12-20 16:00:00+08 | office | 2 | 70 | 50 2024-12-20 16:00:00+08 | basement | 1 | 66.5 | 60 -
-
中央値クエリ
-- 温度の中央値を計算します。 SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY temperature) FROM conditions;サンプル結果:
percentile_cont ----------------- 70 -
移動平均
-- 温度の移動平均を計算します。 SELECT time, AVG(temperature) OVER(ORDER BY time ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS smooth_temp FROM conditions WHERE location = 'garage' and time > NOW() - interval '1 day' ORDER BY time DESC;サンプル結果:
time | smooth_temp -------------------------------+------------- 2024-12-20 16:11:14.691822+08 | 77
-
よくある質問
-
Q: 次のライセンスエラーを解決するにはどうすればよいですか。
ERROR: functionality not supported under the current license "ApacheOnly", license HINT: Upgrade to a Timescale-licensed binary to access this free community featureA: ApsaraDB RDS for PostgreSQL は、Apache ライセンスに準拠した TimescaleDB のオープンソースビルドを使用しています。一部の TimescaleDB 機能は、Timescale ライセンス契約 (TSL) の下でのみ利用可能です。この契約では、データベースアズアサービスや ソフトウェアアズアサービスなどのサービスでの使用が禁止されています。詳細については、「TimescaleDB ライセンス契約のセクション 2.2」をご参照ください。
-
Q:
hypertables do not support concurrent index creation.というエラーが表示された場合はどうすればよいですか。A: TimescaleDB は、ハイパーテーブルでの
CREATE INDEX CONCURRENTLYの使用をサポートしていません。代わりに、CREATE INDEX ... WITH (timescaledb.transaction_per_chunk, ...)を使用してください。この方法では、一度に 1 つのチャンクずつインデックスを作成することで、ロック保持時間を短縮します。詳細については、「Timescale ドキュメント」をご参照ください。