預降採樣可以在資料寫入時就按指定時間粒紋對資料進行預計算並單獨儲存,降採樣查詢時可以自動查詢匹配到的預降採樣資料,以降低訪問延遲。本文介紹預降採樣的概念,建立和管理預降採樣規則的方法,查詢預降採樣資料的方法,以及預降採樣的最佳實務。
前提條件
時序引擎版本為3.4.19以上。
功能介紹
預降採樣
預降採樣是一種預計算的方法。在資料寫入時根據配置的預降採樣規則將資料降低精度後單獨儲存,查詢時按查詢條件中指定的降採樣精度自動查詢最接近預降採樣精度的資料,然後交由執行引擎進行後續處理,以減少即時查詢需要計算的資料量,降低訪問延遲。
與連續查詢相比,預降採樣主要有以下優勢:
寫入即可見,無需連續查詢的執行等待時間。
效能高,對於寫入效能無影響,寫入時即時轉存資料。
預降採樣資料和未經處理資料儲存在同一張表中,預降採樣查詢時自動匹配最佳規則的資料,規則不匹配時,自動切換到未經處理資料查詢。
預降採樣規則
預降採樣規則定義了預降採樣的時間粒紋和資料的彙總方式。例如,假設1分鐘產生一條未經處理資料,預降採樣規則可以定義按1小時資料的平均值進行預降採樣。預降採樣規則分為資料庫層級的預降採樣規則和表層級預降採樣規則,它們都可以實現預降採樣,但有部分區別,具體請參見下圖。
建立預降採樣規則
預降採樣規則對於之前已經寫入的資料不生效。
建立表層級的預降採樣規則(SQL方式)
樣本
設定預降採樣精度為1小時,並對預降採樣周期執行sum和max預計算。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;設定預降採樣的資料有效期間(TTL)為90天。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) TTL `90d` ON sensor;
文法參考
建立資料庫層級的預降採樣規則(API方式)
請求路徑和方法
請求路徑 | 要求方法 | 描述 |
/api/database |
| 為指定資料庫建立預降採樣規則。 如果資料庫已經存在(例如預設資料庫default),請使用PUT方法來更新預降採樣規則。 如果想在建立資料庫時,同時建立預降採樣規則,請使用POST方法。 |
請求參數
名稱 | 是否必需 | 描述 |
name | 是 | 資料庫名稱。 例如:default。 |
downsampleRules | 是 | 預降採樣規則列表,格式為JSON。每次更新規則時為全量更新。 |
預降採樣規則參數
名稱 | 是否必需 | 描述 | 舉例 |
aggregator | 是 | 彙總函式。 取值:sum、count、max、min、first、last、median。 關於彙總函式的詳情,請參見CREATE PREDOWNSAMPLE。 重要
| "aggregator": "sum" |
intervals | 是 | 預降採樣的時間粒紋列表,彙總時間視窗列表。支援的單位:s代表秒,m代表分鐘,h代表小時,d代表天。 | "intervals": [ "10m","1h" ],表示按10分鐘和1小時分別進行預降採樣。 |
請求樣本
PUT /api/database
{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}響應說明
響應狀態代碼為200。
查詢預降採樣規則
資料庫層級的預降採樣規則和表層級的預降採樣規則的查詢方法不同。資料庫層級的預降採樣規則需要通過API查詢,表層級的預降採樣規則需要通過SQL查詢。
查詢表層級的預降採樣規則(SQL方式)
樣本
查詢資料庫所有的預降採樣規則。
SHOW PREDOWNSAMPLES;查詢指定資料表sensor的預降採樣規則。
SHOW PREDOWNSAMPLES ON sensor;
文法參考
查詢資料庫層級的預降採樣規則(API方式)
請求路徑和方法
請求路徑 | 要求方法 | 描述 |
/api/database | GET | 查詢已經建立的預降採樣規則。 |
返回樣本
[{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}]響應說明
響應狀態代碼為204。
刪除預降採樣規則
資料庫層級的預降採樣規則和表層級的預降採樣規則的刪除方法不同。資料庫層級的預降採樣規則需要通過API刪除,表層級的預降採樣規則需要通過SQL刪除。
刪除預降採樣規則後,已經生效的預降採樣資料不會立即被刪除,但在查詢時不會命中已經刪除的預降採樣資料。預降採樣的資料會在資料到期後(即超過TTL後)自動刪除。
刪除表層級的預降採樣規則(SQL方式)
樣本
DROP PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;文法參考
刪除資料庫層級的預降採樣規則(API方式)
刪除資料庫層級的預降採樣規則,請求路徑、要求方法、請求參數和響應說明,與建立資料庫層級的預降採樣規則相同,區別為需要將downsampleRules的值置為空白。請求路徑等詳細資料,請參見建立資料庫層級的預降採樣規則(API方式)。
請求樣本
PUT /api/database
{
"name": "default",
"downsampleRules": {
}
}查詢預降採樣資料
預降採樣資料查詢的匹配原則
當同時存在資料庫層級規則和表層級規則時,預降採樣查詢資料時優先匹配表層級規則。
當查詢請求指定的降採樣粒度與預降採樣資料的時間粒紋不能精確匹配時,時序引擎會自動查詢最優的預降採樣粒度。推薦設定預降採樣時間粒紋為1m、10m、1h、1d,可以滿足絕大多數的降採樣查詢情境。
說明最優的預降採樣粒度是指能夠整除查詢請求的降採樣粒度的最大值。例如,預降採樣資料的時間粒紋有1m、5m、8m和15m,查詢請求的降採樣粒度為10m,則最優預降採樣粒度為5m。
當沒有滿足條件的預降採樣時間粒紋時,從未經處理資料中進行降採樣查詢。
查詢方法
通過SQL或者相容時間序列資料庫TSDB的介面都可以查詢預降採樣資料。推薦使用SQL查詢。如果是已有的openTSDB應用或時間序列資料庫TSDB應用,可以選擇TSDB相容查詢。
SQL查詢預降採樣資料
預設情況下,降採樣查詢資料是從未經處理資料中進行查詢。如果要從預降採樣資料中查詢資料需要在查詢語句中使用Hint(/*+ PREDOWNSAMPLE */)。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature) from sensor
WHERE time >= 1619074800000 AND time <= 1619085600000
SAMPLE BY 1h;TSDB相容查詢預降採樣資料
相容時間序列資料庫TSDB的介面支援通過API多值查詢、API單值查詢、SDK查詢三種方式查詢預降採樣資料。
SDK多值查詢預降採樣資料
查詢降採樣資料時,需要在MultiFieldSubQuery Builder設定downsampleDataSource參數。
樣本
long startTime = 1619074800000L;
long endTime = 1619085600000L;
final String metric = "wind";
final String field = "speed";
MultiFieldSubQueryDetails fieldSubQueryDetails = MultiFieldSubQueryDetails
.field(field)
.aggregator(Aggregator.SUM)
.downsample("1h-sum")
.build();
MultiFieldSubQuery subQuery = MultiFieldSubQuery
.metric(metric)
.fieldsInfo(fieldSubQueryDetails)
// 從預降採樣查詢
.downsampleDataSource(DownsampleDataSource.DOWNSAMPLE)
.build();
MultiFieldQuery query = MultiFieldQuery.
start(startTime).
end(endTime).
sub(subQuery).
build();
List<MultiFieldQueryResult> result = tsdb.multiFieldQuery(query); 參數說明
DownsampleDataSource 參數的取值說明:
DOWNSAMPLE:預降採樣資料查詢。
RAW:未經處理資料查詢。如果參數沒有被指定,預設為RAW。
SDK多值的更多內容,請參見SDK多值讀取。
API多值查詢預降採樣資料
使用API進行多值查詢時,添加downsampleSource參數並定義參數為downsample,即可查詢預降採樣資料。具體操作,請參見多值資料查詢。
請求路徑和方法
請求路徑 | 要求方法 | 描述 |
/api/mquery | GET | 查詢預降採樣資料。 |
請求參數
名稱 | 是否必須 | 描述 | 樣本 |
downsampleSource | 否 | 指定查詢資料來源。取值:
| downsample |
請求樣本
POST /api/mquery
{
"start": 1346846400000,
"end": 1346846402000,
"queries": [
{
"downsampleDataSource" : "downsample",
"metric": "wind",
"fields" : [
{
"field" : "speed",
"aggregator" : "none",
"downsample" : "1h-sum"
}
],
"tags":{
"sensor":"IOTE_8859_0002"
}
}
]
}預降採樣的最佳配置
秒級採樣頻率情境
對於秒級採樣頻率的情境,推薦配置1m、1h、1d粒度的預降採樣規則來滿足任意分鐘、任意小時、任意天層級的降採樣查詢需求。
預降採樣規則的樣本
配置sum、count、min、max4種常用彙總函式在1m、1h、1d粒度的預降採樣規則。
CREATE PREDOWNSAMPLE `1m` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;預降採樣查詢的樣本
基於分鐘粒度的預降採樣規則,滿足任意分鐘層級的降採樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>m;基於小時粒度的預降採樣規則,滿足任意小時層級的降採樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;基於天粒度的預降採樣規則,滿足任意天層級的降採樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;
分鐘級採樣頻率情境
對於分鐘級採樣頻率的情境,推薦配置1h、1d粒度的預降採樣規則來滿足任意小時、任意天層級的降採樣查詢需求。
預降採樣規則的樣本
配置sum、count、min、max4種常用彙總函式在1h、1d粒度的預降採樣規則。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;預降採樣查詢的樣本
基於小時粒度的預降採樣規則,滿足任意小時層級的降採樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;基於天粒度的預降採樣規則,滿足任意天層級的降採樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;