一文读懂TDengine的窗口查询功能
作為一款時(shí)序數(shù)據(jù)庫(kù)(Time-Series Database),TDengine?提供了按時(shí)間自動(dòng)劃分窗口并執(zhí)行查詢的能力。這個(gè)功能的用途和使用場(chǎng)景你是不是清楚呢?本文將為你介紹這一功能及其典型使用場(chǎng)景。
什么是窗口查詢?
時(shí)序數(shù)據(jù)常常需要根據(jù)采集時(shí)間對(duì)數(shù)據(jù)進(jìn)行查詢,本質(zhì)上是在時(shí)間軸上劃分出時(shí)間窗口,并對(duì)窗口內(nèi)的數(shù)據(jù)進(jìn)行聚合和查詢計(jì)算。比如一個(gè)最簡(jiǎn)單的場(chǎng)景:查詢”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″原始數(shù)據(jù)的最大值、最小值、平均值,則”2018-01-01 00:00:00.000″到”2018-01-31 00:00:00.000″就形成了一個(gè)查詢的時(shí)間窗口。
在實(shí)際生產(chǎn)應(yīng)用中,業(yè)務(wù)場(chǎng)景要求的查詢條件往往比這個(gè)更復(fù)雜,需要時(shí)序數(shù)據(jù)庫(kù)能夠按照不同規(guī)則、沿時(shí)間軸進(jìn)行窗口劃分,并對(duì)各個(gè)窗口內(nèi)的時(shí)序數(shù)據(jù)分別進(jìn)行聚合、選擇計(jì)算等操作。
TDengine 提供的三種窗口查詢能力詳解
TDengine 從 2.2.x.x 版本起,支持了三類時(shí)序窗口查詢,分別是等間隔窗口(interval)、狀態(tài)窗口(state_window)和會(huì)話窗口(session),大大簡(jiǎn)化了應(yīng)用開發(fā)時(shí)對(duì)時(shí)間序列邏輯的處理。
窗口查詢,從子表的查詢語(yǔ)法為:
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})]窗口查詢,從超級(jí)表的查詢語(yǔ)法為:
SELECT function_list FROM stb_name [WHERE where_condition] [INTERVAL(interval [, offset]) [SLIDING sliding]] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})] [GROUP BY tags]下面分別看一下這三類時(shí)序窗口查詢功能。
1. 等間隔窗口(interval)
按照固定的時(shí)間窗口長(zhǎng)度,周期性地對(duì)時(shí)間軸進(jìn)行窗口劃分,并允許對(duì)每個(gè)窗口內(nèi)的數(shù)據(jù)進(jìn)行聚合查詢。
?我們?cè)偻ㄟ^幾個(gè)例子看看等間隔窗口的具體應(yīng)用場(chǎng)景。
在工業(yè)生產(chǎn)中,有很多監(jiān)控指標(biāo)需要實(shí)時(shí)展示趨勢(shì)線。但有些指標(biāo)如振動(dòng)等,實(shí)際采集的頻率非常高,如果展示原始數(shù)據(jù)會(huì)難以看清趨勢(shì),同時(shí)由于數(shù)據(jù)量過于密集,會(huì)給前端頁(yè)面的展示造成巨大壓力。
但通過 interval 等間隔窗口,可以按照指定窗口長(zhǎng)度對(duì)原始數(shù)據(jù)做聚合(相當(dāng)于對(duì)原始數(shù)據(jù)進(jìn)行了降采樣),之后再展示趨勢(shì)線時(shí),前端展示需要從數(shù)據(jù)庫(kù)拉取的數(shù)據(jù)量會(huì)大大減少,從而顯著提高效率。
下圖中,綠色曲線為基于每 60 秒采集一次的原始數(shù)據(jù)直接展示繪制的曲線,橙色曲線為對(duì)原始數(shù)據(jù)按照 5 分鐘長(zhǎng)度進(jìn)行窗口劃分后求取平均值的曲線,可以看到橙色曲線這種情況下,很好地反映了整體的數(shù)據(jù)變化趨勢(shì),而前端繪圖所需的數(shù)據(jù)量卻減少了 80%。
在實(shí)際生產(chǎn)中高頻采集數(shù)據(jù)的趨勢(shì)線,均可以考慮通過 TDengine 的 interval 語(yǔ)法提供的降采樣能力,在不丟失整體趨勢(shì)信息的情況下,快速展示數(shù)據(jù)。
2. 狀態(tài)窗口(state_window)
狀態(tài)窗口讓用戶可以按照某個(gè)整型/字符串型的采集量(一般是表征狀態(tài)的值,如設(shè)備工作模式等)的值來劃分窗口,將該狀態(tài)值連續(xù)不變的記錄劃入同一個(gè)窗口。然后對(duì)每個(gè)窗口內(nèi)的采集值進(jìn)行avg/max/min等統(tǒng)計(jì)聚合、或計(jì)算狀態(tài)持續(xù)時(shí)間等。
比如加工廠的機(jī)床運(yùn)維人員,需要統(tǒng)計(jì)每個(gè)機(jī)床的工作和待機(jī)的時(shí)間,這本質(zhì)上是以工作狀態(tài) “status” 這個(gè)狀態(tài)量的值來劃分窗口,并統(tǒng)計(jì)窗口時(shí)長(zhǎng)。
?上圖中 “status” 列,表征設(shè)備的當(dāng)前工作狀態(tài),狀態(tài)窗口對(duì) “status” 值的連續(xù)變化情況進(jìn)行判斷,劃分出三個(gè)窗口,并可以分別對(duì)每個(gè)窗口進(jìn)行聚合,比如計(jì)算每個(gè)窗口內(nèi)的開始時(shí)間、結(jié)束時(shí)間、總記錄條數(shù)、平均值、窗口持續(xù)時(shí)間等。這些均可在 TDengine 中通過一條 SQL 查詢語(yǔ)句直接實(shí)現(xiàn),具體 SQL 語(yǔ)句和查詢結(jié)果見下圖。
?3. 會(huì)話窗口(session)
在詳細(xì)討論會(huì)話窗口之前,我們先看車聯(lián)網(wǎng)平臺(tái)的一個(gè)典型應(yīng)用場(chǎng)景:通過車輛行駛數(shù)據(jù)對(duì)車輛行程進(jìn)行劃分。一部車從發(fā)動(dòng)起步,到停車熄火的中間行駛過程視為一個(gè)完整的“行程”。車輛在行駛時(shí),車載 T-Box 一般會(huì)按照 30 秒的間隔,向車聯(lián)網(wǎng)平臺(tái)發(fā)送自身的狀態(tài)數(shù)據(jù);而停車熄火時(shí),則不再發(fā)送。因此,通過分析車輛上報(bào)消息的連續(xù)性,可以推算出該車輛的行程。
會(huì)話窗口讓用戶可以按照上報(bào)記錄的時(shí)間連續(xù)性來劃分窗口,即相鄰兩條記錄時(shí)間間隔不超過某一閾值,則劃歸同一窗口;超過該閾值,則老窗口結(jié)束,新窗口開始;然后對(duì)每個(gè)窗口進(jìn)行諸如持續(xù)時(shí)間等統(tǒng)計(jì),或?qū)Υ翱趦?nèi)的原始采集數(shù)據(jù)進(jìn)行各種聚合計(jì)算,可以是 avg/max/min/count 或其他用戶自定義函數(shù)。
?會(huì)話窗口針對(duì)的場(chǎng)景是:讓用戶通過一條 SQL 語(yǔ)句實(shí)現(xiàn)按時(shí)序數(shù)據(jù)的“連續(xù)程度”來自動(dòng)劃分窗口。
如下圖中的 SQL 所示,用戶設(shè)置 session ( ts, 10s ),就是將相鄰記錄時(shí)間間隔小于 10 秒的記錄劃分到同一個(gè) session window 內(nèi);而對(duì)間隔超過 10 秒的兩條相鄰記錄則劃分到不同窗口。這樣就在下圖中劃分出了藍(lán)色、紅色、灰色標(biāo)示出的 3 個(gè)窗口,每個(gè)窗口可獨(dú)立計(jì)算窗口開始/結(jié)束時(shí)間、窗口長(zhǎng)度、窗口內(nèi)記錄數(shù)等用戶感興趣的統(tǒng)計(jì)量。
總結(jié)
時(shí)序數(shù)據(jù)除了數(shù)據(jù)量大、結(jié)構(gòu)相對(duì)簡(jiǎn)單的特點(diǎn)外,還在查詢場(chǎng)景中大量涉及時(shí)間戳的處理。我們往往要根據(jù)業(yè)務(wù)場(chǎng)景,按時(shí)間戳對(duì)采集數(shù)據(jù)進(jìn)行分組并計(jì)算。對(duì)于這類計(jì)算,如果開發(fā)者將原始數(shù)據(jù)讀入內(nèi)存,再由應(yīng)用層程序去處理時(shí)間窗口劃分的邏輯,就不得不面對(duì)讀取海量原始時(shí)序記錄的磁盤 IO、CPU 及內(nèi)存開銷,同時(shí)業(yè)務(wù)層代碼復(fù)雜度也變得更高。
如果開發(fā)者可以靈活運(yùn)用 TDengine 這樣的 Database 提供的時(shí)序數(shù)據(jù)窗口劃分能力,結(jié)合業(yè)務(wù)場(chǎng)景,選擇合適的窗口劃分函數(shù)來將相關(guān)計(jì)算負(fù)荷下沉到數(shù)據(jù)庫(kù)層,則能大大提升系統(tǒng)響應(yīng)性能、減少負(fù)載開銷,起到事半功倍的效果。
想了解更多 TDengine Database的具體細(xì)節(jié),歡迎大家在GitHub上查看相關(guān)源代碼。
總結(jié)
以上是生活随笔為你收集整理的一文读懂TDengine的窗口查询功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC地址存在的意义
- 下一篇: 基带信号的眼图实验