无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

用對場景,事半功倍!TDengine 的窗口查詢功能及使用場景全介紹

Jiangyi Hou

2022-06-30 / ,

作為一款時序數據庫(Time-Series Database),TDengine 提供了按時間自動劃分窗口并執行查詢的能力。這個功能的用途和使用場景你是不是清楚呢?本文將為你介紹這一功能及其典型使用場景。

什么是窗口查詢?

時序數據常常需要根據采集時間對數據進行查詢,本質上是在時間軸上劃分出時間窗口,并對窗口內的數據進行聚合和查詢計算。比如一個最簡單的場景:查詢”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″原始數據的最大值、最小值、平均值,則”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″就形成了一個查詢的時間窗口。

在實際生產應用中,業務場景要求的查詢條件往往比這個更復雜,需要時序數據庫能夠按照不同規則、沿時間軸進行窗口劃分,并對各個窗口內的時序數據分別進行聚合、選擇計算等操作。

TDengine 提供的三種窗口查詢能力詳解

TDengine 從 2.2.x.x 版本起,支持了三類時序窗口查詢,分別是等間隔窗口(interval)狀態窗口(state_window)會話窗口(session),大大簡化了應用開發時對時間序列邏輯的處理。

窗口查詢,從子表的查詢語法為:

SELECT function_list FROM tb_name [WHERE where_condition] [SESSION(ts_col, tol_val)][STATE_WINDOW(col)] [INTERVAL(interval [, offset]) [SLIDING sliding]] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]

窗口查詢,從超級表的查詢語法為:

SELECT function_list FROM stb_name [WHERE where_condition] [INTERVAL(interval [, offset]) [SLIDING sliding]] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})] [GROUP BY tags]

下面分別看一下這三類時序窗口查詢功能。

1. 等間隔窗口(interval)

按照固定的時間窗口長度,周期性地對時間軸進行窗口劃分,并允許對每個窗口內的數據進行聚合查詢。

TDengine Database

我們再通過幾個例子看看等間隔窗口的具體應用場景。

在工業生產中,有很多監控指標需要實時展示趨勢線。但有些指標如振動等,實際采集的頻率非常高,如果展示原始數據會難以看清趨勢,同時由于數據量過于密集,會給前端頁面的展示造成巨大壓力。

但通過 interval 等間隔窗口,可以按照指定窗口長度對原始數據做聚合(相當于對原始數據進行了降采樣),之后再展示趨勢線時,前端展示需要從數據庫拉取的數據量會大大減少,從而顯著提高效率。

下圖中,綠色曲線為基于每 60 秒采集一次的原始數據直接展示繪制的曲線,橙色曲線為對原始數據按照 5 分鐘長度進行窗口劃分后求取平均值的曲線,可以看到橙色曲線這種情況下,很好地反映了整體的數據變化趨勢,而前端繪圖所需的數據量卻減少了 80%。

TDengine Database

在實際生產中高頻采集數據的趨勢線,均可以考慮通過 TDengine 的 interval 語法提供的降采樣能力,在不丟失整體趨勢信息的情況下,快速展示數據。

TDengine Database
用對場景,事半功倍!TDengine 的窗口查詢功能及使用場景全介紹 - TDengine Database 時序數據庫

2. 狀態窗口(state_window)

狀態窗口讓用戶可以按照某個整型/字符串型的采集量(一般是表征狀態的值,如設備工作模式等)的值來劃分窗口,將該狀態值連續不變的記錄劃入同一個窗口。然后對每個窗口內的采集值進行avg/max/min等統計聚合、或計算狀態持續時間等。

比如加工廠的機床運維人員,需要統計每個機床的工作和待機的時間,這本質上是以工作狀態 “status” 這個狀態量的值來劃分窗口,并統計窗口時長。

TDengine Database

上圖中 “status” 列,表征設備的當前工作狀態,狀態窗口對 “status” 值的連續變化情況進行判斷,劃分出三個窗口,并可以分別對每個窗口進行聚合,比如計算每個窗口內的開始時間、結束時間、總記錄條數、平均值、窗口持續時間等。這些均可在 TDengine 中通過一條 SQL 查詢語句直接實現,具體 SQL 語句和查詢結果見下圖。

TDengine Database

3. 會話窗口(session)

在詳細討論會話窗口之前,我們先看車聯網平臺的一個典型應用場景:通過車輛行駛數據對車輛行程進行劃分。一部車從發動起步,到停車熄火的中間行駛過程視為一個完整的“行程”。車輛在行駛時,車載 T-Box 一般會按照 30 秒的間隔,向車聯網平臺發送自身的狀態數據;而停車熄火時,則不再發送。因此,通過分析車輛上報消息的連續性,可以推算出該車輛的行程。

會話窗口讓用戶可以按照上報記錄的時間連續性來劃分窗口,即相鄰兩條記錄時間間隔不超過某一閾值,則劃歸同一窗口;超過該閾值,則老窗口結束,新窗口開始;然后對每個窗口進行諸如持續時間等統計,或對窗口內的原始采集數據進行各種聚合計算,可以是 avg/max/min/count 或其他用戶自定義函數。

TDengine Database

會話窗口針對的場景是:讓用戶通過一條 SQL 語句實現按時序數據的“連續程度”來自動劃分窗口。

如下圖中的 SQL 所示,用戶設置 session ( ts, 10s ),就是將相鄰記錄時間間隔小于 10 秒的記錄劃分到同一個 session window 內;而對間隔超過 10 秒的兩條相鄰記錄則劃分到不同窗口。這樣就在下圖中劃分出了藍色、紅色、灰色標示出的 3 個窗口,每個窗口可獨立計算窗口開始/結束時間、窗口長度、窗口內記錄數等用戶感興趣的統計量。

TDengine Database

總結

時序數據除了數據量大、結構相對簡單的特點外,還在查詢場景中大量涉及時間戳的處理。我們往往要根據業務場景,按時間戳對采集數據進行分組并計算。對于這類計算,如果開發者將原始數據讀入內存,再由應用層程序去處理時間窗口劃分的邏輯,就不得不面對讀取海量原始時序記錄的磁盤 IO、CPU 及內存開銷,同時業務層代碼復雜度也變得更高。

如果開發者可以靈活運用 TDengine 這樣的 Database 提供的時序數據窗口劃分能力,結合業務場景,選擇合適的窗口劃分函數來將相關計算負荷下沉到數據庫層,則能大大提升系統響應性能、減少負載開銷,起到事半功倍的效果。