継続クエリは、SQLクエリを定期的に実行し、クエリ結果を指定されたデータテーブルに格納できる、簡略化されたストリームコンピューティング機能です。継続クエリは、プリダウンサンプリングおよびプリコンピューティングのシナリオで使用して、長期保存とクエリパフォーマンスの向上のためのデータのダウンサンプリングを行うことができます。このトピックでは、LindormTSDBにおける継続クエリの概念、使用方法、および適用シナリオについて説明します。
背景情報
時系列のリアルタイムデータがデータベースに時系列順に書き込まれるシナリオでは、指定されたクエリ条件に基づいて、スケジュールされた間隔で時系列データを処理し、結果を保存することができます。たとえば、特定のウィンドウ内でデータベースに書き込まれたデータをスケジュールされた間隔で集計できます。継続クエリは、このようなシナリオに適しています。
次の図は、時系列データがスケジュールされた間隔で集計されるサンプルシナリオを示しています。
概要
継続クエリは、時系列データに対してSQLクエリを定期的に実行し、クエリ結果を指定されたデータテーブルに格納するために使用できる、簡略化されたストリームコンピューティング機能を提供します。
継続クエリは、時間ウィンドウ内の時系列をスケジュールされた間隔で計算します。
たとえば、継続クエリの時間間隔と時間ウィンドウが1時間に設定されている場合、継続クエリは毎時の開始時に前の1時間のデータを計算します。計算が20:00にトリガーされた場合、次の時間範囲内でデータベースに書き込まれた時系列データが計算されます。[19:00:00, 20:00:00)。
継続クエリは、スケジュールされた間隔で計算をトリガーします。ただし、計算結果は、計算対象のデータサイズとインスタンスのリアルタイムワークロードに基づいて、一定時間後に指定された場所に保存される場合があります。
継続クエリの結果の精度は、データが時系列順に書き込まれているかどうかによって異なります。データが元の時系列テーブルに時系列順に書き込まれていない場合、前の時間ウィンドウ内のデータが次の時間ウィンドウの開始後に散発的にテーブルに書き込まれる可能性があり、継続クエリは現在の時間ウィンドウより前の履歴データを再計算しません。
時間ウィンドウを指定せずに継続クエリを実行できます。この場合、時間ウィンドウは継続クエリに指定された間隔と同じになります。
継続クエリの使用
継続クエリの管理
LindormTSDBでは、SQLを使用してデータベース内の継続クエリを管理できます。
継続クエリの作成
指定されたデータベースに継続クエリを作成できます。 SQL構文の詳細については、「CREATE CONTINUOUS QUERY」をご参照ください。
説明継続クエリは特定のデータベースに関連付けられています。データベースを削除すると、データベースに作成された継続クエリは自動的に削除されます。
継続クエリの作成時にデータベースを指定しない場合、クエリはUSE DATABASE構文で指定された現在のデータベースに作成されます。
継続クエリの削除
指定されたデータベースから既存の継続クエリを削除できます。 SQL構文の詳細については、「DROP CONTINUOUS QUERY」をご参照ください。
継続クエリの情報の表示
継続クエリのメタデータをクエリできます。 SQL構文の詳細については、「SHOW CONTINUOUS QUERIES」をご参照ください。
継続クエリログの表示
LindormTSDB 3.4.41以降では、監査ログ機能を使用して継続クエリログを表示できます。これを行うには、次の手順を実行します。
LindormコンソールでLindormTSDBの監査ログ機能を有効にします。監査ログ機能を有効にする方法の詳細については、「監査ログ機能の有効化」をご参照ください。
[監査ログ] タブでキーワード
CQを検索して、継続的なクエリログを表示します。
一般的なシナリオと例
データのダウンサンプリングと長期保存
大量のデータを含むシナリオでは、データのストレージコストが重要な問題になります。 LindormTSDBでは、データベースごとにデータの有効期限(TTL)を設定できます。継続クエリを使用してデータをダウンサンプリングし、結果をTTLの長いデータベースに書き込むことができます。次の例は、継続クエリとデータベースのTTLを使用してデータのダウンサンプリングと長期保存を実装する方法を示しています。
例
次の例では、元のデータは1秒間隔でサンプリングされます。この場合、大量のデータがサンプリングされて保存されます。最新月のデータのみが保存されます。間隔を分に設定すると、最新年のサンプリングデータが保存されます。
元の時系列データを保存するためにdb_sensor_monthという名前のデータベースを作成し、データベースのTTLを30日に設定します。
CREATE DATABASE db_sensor_month WITH (ttl=30);db_sensor_monthデータベースにsensorという名前のテーブルを作成します。
USE db_sensor_month; CREATE TABLE sensor ( device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity BIGINT);ダウンサンプリングされたデータを保存するためにdb_sensor_yearという名前の別のデータベースを作成し、データベースのTTLを365日に設定します。
CREATE DATABASE db_sensor_year WITH (ttl=365);ダウンサンプリングされたデータを保存するためにdb_sensor_year.sensorという名前のテーブルを作成します。
USE db_sensor_year; CREATE TABLE sensor ( device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity BIGINT);ダウンサンプリングクエリを実行し、ダウンサンプリングされたデータをdb_sensor_year.sensorテーブルに書き込む継続クエリを作成します。
CREATE CONTINUOUS QUERY db_sensor_year.my_cq WITH(`interval`='1m') AS INSERT into db_sensor_year.sensor(time, temperature, humidity, device_id,region) SELECT time, avg(temperature) as temperature, avg(humidity) humidity, device_id, region FROM db_sensor_month.sensor sample by 60s;元の時系列データテーブルdb_sensor_month.sensorにデータを書き込みます。
insert into db_sensor_month.sensor(region,device_id,time,temperature,humidity) values ('hz', 'id123', current_timestamp, 37, 70); insert into db_sensor_month.sensor(region,device_id,time,temperature,humidity) values ('hz', 'id123', current_timestamp, 38, 67);db_sensor_year.sensorテーブルでダウンサンプリングされたデータをクエリします。
select * from db_sensor_year.sensor;次の結果が返されます。
+-----------+--------+---------------------------+-------------+----------+ | device_id | region | time | temperature | humidity | +-----------+--------+---------------------------+-------------+----------+ | id123 | hz | 2023-10-08T19:54:00+08:00 | 37.500000 | 68.5 | +-----------+--------+---------------------------+-------------+----------+
事前計算を実装してクエリのパフォーマンスを向上させる
長い時間ウィンドウ内のデータに対してダウンサンプリングクエリまたは集計クエリを実行する場合、クエリ結果が返されるまでに長い時間がかかる場合があります。この場合、継続クエリを使用して元のデータに対して事前計算を実装し、結果テーブルで計算されたデータを直接クエリできます。これにより、クエリのパフォーマンスとスループットが向上します。