連續查詢是一種簡化的Realtime Compute能力,能夠定期執行SQL查詢,將查詢結果儲存在指定的資料表中,可用於預降採樣和預計算,實現資料降精度長期儲存以及查詢效能提升。本文介紹Lindorm時序引擎連續查詢的概念、使用方法和常見情境。
背景資訊
在時序應用的情境下,對於依照時間順序寫入的即時資料,使用者有時會希望每隔一段固定時間,就能夠按照一定的查詢條件對該時間範圍內的時序資料進行一次計算(例如:對該時間範圍內的資料進行一次彙總計算),並將計算結果另行儲存下來。連續查詢所針對的便是此類應用情境。
情境樣本如下:
連續查詢的概念
連續查詢(Continuous Queries,簡稱CQ)提供了一種簡化的Realtime Compute能力,自動定期執行時序SQL查詢, 將查詢結果儲存在指定的資料表中。
連續查詢會每隔一段時間(Interval)對一個時間視窗(Window)的資料進行計算。
例如,一個連續查詢指定的計算間隔(Interval)和時間視窗(Window)均為1小時,該連續查詢會在每個小時開始的時候對前一小時的資料進行計算。如果晚上20:00觸發計算,計算的資料所屬時間範圍是[19:00:00,20:00:00)。
連續查詢會指定的計算間隔後立刻開始計算,但由於查詢計算量的不同,計算的結果可能也需要花一些時間才能儲存到目標表中。延時取決於查詢計算量以及執行個體的即時負載。
連續查詢的結果精度取決於未經處理資料的有序性。如果資料未按照時間順序寫入未經處理資料表,即下一個時間視窗開始後仍然有上一時間視窗的資料零星寫入,連續查詢不會重新計算目前時間視窗之前的歷史資料。
連續查詢可不指定時間視窗(Window)。不指定時間視窗(Window)時,會採用計算間隔(Interval)作為時間視窗(Window)。
使用連續查詢
連續查詢的管理
Lindorm時序引擎提供SQL能力用於管理資料庫中的連續查詢。
連續查詢的建立
在指定的Database下建立一個連續查詢。SQL文法可參見CREATE CONTINUOUS QUERY。
說明連續查詢歸屬於指定的資料庫, 當資料庫刪除時,該資料庫下的所有連續查詢也將被自動刪除。
如果不指定資料庫, 則在當前資料庫(對應USE DATABASE語句指定的資料庫)下建立連續查詢。
連續查詢的刪除
從指定的Database下刪除一個已存在的連續查詢。SQL文法可參見DROP CONTINUOUS QUERY。
連續查詢資訊的展示
查詢已有的連續查詢中繼資料。SQL文法可參見SHOW CONTINUOUS QUERIES。
查看連續查詢日誌
時序引擎3.4.41版本及之後,支援通過審計日誌查看連續查詢執行情況,具體操作步驟如下:
在Lindorm管理主控台開通時序審計日誌,如何開通,請參見開通審計日誌。
在審計日誌的頁面搜尋關鍵詞
CQ,即可查看連續查詢執行情況。
連續查詢的常見情境與樣本
資料降精度與長期儲存
對於資料量較大的情境,儲存成本會成為使用者關心的問題。Lindorm時序引擎支援設定每個資料庫的保資料有效期間(TTL),您可以結合連續查詢,將資料降精度後寫入到有效期間更長的資料庫中。以下樣本介紹了如何通過連續查詢與資料庫TTL設定來實現資料降精度與長期儲存。
樣本
假設,未經處理資料採樣周期為1秒,資料量較大,只能儲存最近一個月的資料。降採樣到分鐘精度後,資料可以儲存一年。
建立資料庫db_sensor_month,將未經處理資料儲存在db_sensor_month中,資料有效期間為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,儲存降精度後的資料,資料有效期間為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 | +-----------+--------+---------------------------+-------------+----------+
通過預計算提升查詢效能
對於某些較長時間範圍的降採樣查詢或者跨時間軸的彙總查詢,如果直接對未經處理資料進行查詢,耗時可能會很長。此時可以通過連續查詢對結果進行預計算,在需要的時候直接查詢計算後的結果表,其效能可能會更好,也可以有效提升查詢吞吐。