influxdb - 优化查询(最小值、最大值、第一个和最后一个)
问题描述
第一篇在这里发布,是 InfluxDB 的新手。
我收到了以下查询,但我不知道如何优化它。
目前,24 小时和 1m 个窗口大约需要 2.4 秒(这是预期的时间量)。
我怀疑其中一个原因是有 4 个表(查询同一组数据)和 3 个连接。
我已经查看了 map 函数以尝试将其减少到一张表,但我似乎无法让它与窗口一起使用。
bucketName = "${bucket}"
startTime = -${period}
interval = ${interval}
token = "${token}"
minPrice = from (bucket: bucketName)
|> range(start: startTime, stop: now())
|> filter(fn: (r) => r["_field"] == token)
|> window(every: interval)
|> min()
|> duplicate(column: "_value", as: "low")
|> keep(columns: ["low", "_start", "_stop"] )
maxPrice = from (bucket: bucketName)
|> range(start: startTime, stop: now())
|> filter(fn: (r) => r["_field"] == token)
|> window(every: interval)
|> max()
|> duplicate(column: "_value", as: "high")
|> keep(columns: ["high", "_start", "_stop"] )
openPrice = from (bucket: bucketName)
|> range(start: startTime, stop: now())
|> filter(fn: (r) => r["_field"] == token)
|> window(every: interval)
|> first()
|> duplicate(column: "_value", as: "open")
|> keep(columns: ["open", "_stop", "_start"] )
closePrice = from (bucket: bucketName)
|> range(start: startTime, stop: now())
|> filter(fn: (r) => r["_field"] == token)
|> window(every: interval)
|> last()
|> duplicate(column: "_value", as: "close")
|> keep(columns: ["close", "_stop", "_start"] )
highLowData = join(tables: {min: minPrice, max: maxPrice}, on: ["_start", "_stop"])
openCloseData = join(tables: {open: openPrice, close: closePrice}, on: ["_start", "_stop"])
join(tables: {highLow: highLowData, openClose: openCloseData}, on: ["_start", "_stop"])
我已经设法通过使用联合而不是连接将其优化到 0.7 秒。但是现在我面临着具有空字段的数据。
像这样:
下方查询
startTime = -24h
breakDown = 1m
token = "tokenName"
all = from (bucket: "prices")
|> range(start: startTime, stop: now())
|> filter(fn: (r) => r["_field"] == token)
|> window(every: breakDown)
lowPrice = all
|> min()
|> duplicate(column: "_value", as: "low")
|> keep(columns: ["low", "_stop", "_start"] )
highPrice = all
|> max()
|> duplicate(column: "_value", as: "high")
|> keep(columns: ["high", "_stop", "_start"] )
openPrice = all
|> first()
|> duplicate(column: "_value", as: "open")
|> keep(columns: ["open", "_stop", "_start"] )
closePrice = all
|> last()
|> duplicate(column: "_value", as: "close")
|> keep(columns: ["close", "_stop", "_start"] )
highLowData = union(tables: [lowPrice, highPrice])
openCloseData = union(tables: [openPrice, closePrice])
result = union(tables: [highLowData, openCloseData])
|> yield (name: "Result")
解决方案
推荐阅读
- xamarin.forms - 如何停止在 SQLite 数据库中重复的项目?
- java - 需要 6 秒的数据库视图的输出缓慢和提高的原因是什么,突然需要 1.5 秒?
- java - 将 JDBC 接收器连接器连接到 CrateDB
- python - 使用 Jquery AJAX 从服务器获取数据,然后尝试使用 Jinja 2 格式创建一个 url
- ruby-on-rails - 在特定位置向数组哈希 ruby 添加值
- java - Spring Validation 在服务层级别不起作用
- pagination - Jasper-Reports - Pagefitting 子报告在包含在主报告中时被拆分
- php - 如何在 WooCommerce 子主题中更改 FlexSlider 选项
- python - 在 Mongo 嵌入文档中进行选择性查找
- architecture - 现代 REST 应用程序是 3 层架构还是 4 层架构?