influxdb 連續查詢使用總結

2023-11-07 06:00:20

轉載請註明出處:

1.定義:

  InfluxDB 連續查詢(Continuous Query)是一種自動化查詢型別,該查詢會根據定義的時間間隔定期執行,並將結果儲存在新的目標測量中。這樣的查詢通常用於處理大量時間序列資料。

2.基本語法

  使用語法格式:

CREATE CONTINUOUS QUERY <cq_name> ON <db_name>
BEGIN
  SELECT <function>(<column>) INTO <target_measurement> FROM <source_measurement>
  WHERE <time_clause> GROUP BY <tag_key>
END

其中:

  • <cq_name>:為連續查詢指定一個名稱
  • <db_name>:為資料庫指定一個名稱
  • <function>:函數必須是 mean、sum、min、max 或 count 的其中之一
  • <column>:要執行聚合操作的列名
  • <target_measurement>:新建立的目標測量名稱
  • <source_measurement>:源測量名稱
  • <time_clause>:指定時間範圍的語句,可以包含 WHERE time > now() - <duration> 等
  • <tag_key>:可選引數,按照此 tag 進行分組操作

3.使用

  在 InfluxDB 中建立連續查詢可以通過以下兩個步驟完成:

  1. 建立目標測量的查詢。
  2. 將第一步得到的查詢作為連續查詢的輸入。

4.使用場景

  取樣和資料保留

  使用CQ與InfluxDB的保留策略(RP)來減輕儲存問題。結合CQ和RP自動將高精度資料降低到較低的精度,並從資料庫中移除可分配的高精度資料。常見用例的詳細演示指南,請參閱下取樣和資料保留

  預先計算昂貴的查詢

  通過使用CQ預先計算昂貴的查詢來縮短查詢執行時間。使用CQ自動將普通查詢的高精度資料下取樣到較低的精度。較低精度資料的查詢需要更少的資源並且返回更快。

  替換HAVING子句

   InfluxQL不支援HAVING子句。通過建立CQ來聚合資料並查詢CQ結果以達到應用HAVING子句相同的功能。

5.檢視和刪除sql

  檢視連續查詢

SHOW CONTINUOUS QUERIES

  刪除連續查詢:

  從一個指定的database刪除CQ:

DROP CONTINUOUS QUERY <cq_name> ON <database_name>

  DROP CONTINUOUS QUERY返回一個空的結果。

  修改連續查詢:

    根據官網的介紹,建立CQ之後,無法進行更改,如果需要更改需要drop掉之後重新create。

6.執行時間點以及覆蓋的時間範圍

  CQ對實時資料進行操作。他們使用本地伺服器的時間戳,GROUP BY time()間隔和InfluxDB的預設時間邊界來確定何時執行以及查詢中涵蓋的時間範圍。

  CQs以與cq_queryGROUP BY time()間隔相同的間隔執行,並且它們在InfluxDB的預設時間邊界開始時執行。如果GROUP BY time()間隔為1小時,則CQ每小時開始執行一次。

  當CQ執行時,它對於now()now()減去GROUP BY time()間隔的時間範圍執行單個查詢。 如果GROUP BY time()間隔為1小時,當前時間為17:00,查詢的時間範圍為16:00至16:59999999999。

  自動取樣資料

  使用簡單的CQ自動從單個欄位中下取樣資料,並將結果寫入同一資料庫中的另一個measurement。

CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END

  以上範例使用資料庫transportation中的範例資料。measurementbus_data資料儲存有關公共汽車乘客數量和投訴數量的15分鐘資料:

  cq_basicbus_data中計算乘客的平均小時數,並將結果儲存在資料庫transportation中的average_passengers中。

  cq_basic以一小時的間隔執行,與GROUP BY time()間隔相同的間隔。 每個小時,cq_basic執行一個單一的查詢,覆蓋了now()now()減去GROUP BY time()間隔之間的時間範圍,即now()now()之前的一個小時之間的時間範圍。

7.使用範例:

  假設我們有一個名為 cpu_usage 的測量,其中包含了多個 tag 和 field,我們需要將其聚合並寫入一個新的測量 cpu_usage_per_hour 中。  

CREATE CONTINUOUS QUERY "cq_cpu_usage" ON "mydb"
BEGIN
  SELECT MEAN("value") INTO "cpu_usage_per_hour" FROM "cpu_usage"
  WHERE time > now() - 1h GROUP BY time(1h), "host"
END

  該連續查詢會計算最近一小時內 cpu_usage 測量的平均值,並按照每小時以及 host 進行分組,結果儲存在 cpu_usage_per_hour 測量中。

  可以使用以下命令檢視已建立的連續查詢列表:

SHOW CONTINUOUS QUERIES

 8.官網連結

  https://docs.influxdata.com/influxdb/v1/query_language/continuous_queries/