Ruby Rails 将时间尺度 SQL 费率代码转换为 Ruby
Ruby on Rails converting Timescale SQL rate code to Ruby
我正在尝试使用时间刻度中的 Rate 函数来生成图形数据。现在我有一个数据库视图,它使用下面来自 TimescaleDocs 的 SQL 代码中的概念来执行此操作:
SELECT
time,
(
CASE
WHEN bytes_sent >= lag(bytes_sent) OVER w
THEN bytes_sent - lag(bytes_sent) OVER w
WHEN lag(bytes_sent) OVER w IS NULL THEN NULL
ELSE bytes_sent
END
) / extract(epoch from time - lag(time) OVER w) AS "bytes_per_second"
FROM net
WHERE interface = 'eth0' AND time > NOW() - INTERVAL '1 day'
WINDOW w AS (ORDER BY time)
ORDER BY time
有没有办法将其直接转换为时间序列模型中的 ruby 代码以改进运行时间?
这是可能的,但我打赌在 Ruby (MRI) 中构建相同的模型会比在 SQL 运行时慢得多。
您介意分享更多有关您遇到的性能问题的详细信息吗?
如果你想用 Ruby 构建它,我会说你应该考虑有一些“window 概念”,它将负责理解某些特定数组的滞后。
示例:
a = [1,2,3,4,5]
lag = -> (i) {a[i-2] if i > 1} # => #<Proc:0x00007fcca6cf6aa0@(pry):12 a.each_with_index.map{|e,i|[e,lag[i]]}
# => [[1, nil], [2, nil], [3, 1], [4, 2], [5, 3]]
在本例中,我使用的是原始数字,但您可以使用包含时间属性的对象构建更复杂的规则。
您可以使用一些简单的时间模块将时间舍入为 time_bucket。检查一些 ideas here.
我正在尝试使用时间刻度中的 Rate 函数来生成图形数据。现在我有一个数据库视图,它使用下面来自 TimescaleDocs 的 SQL 代码中的概念来执行此操作:
SELECT
time,
(
CASE
WHEN bytes_sent >= lag(bytes_sent) OVER w
THEN bytes_sent - lag(bytes_sent) OVER w
WHEN lag(bytes_sent) OVER w IS NULL THEN NULL
ELSE bytes_sent
END
) / extract(epoch from time - lag(time) OVER w) AS "bytes_per_second"
FROM net
WHERE interface = 'eth0' AND time > NOW() - INTERVAL '1 day'
WINDOW w AS (ORDER BY time)
ORDER BY time
有没有办法将其直接转换为时间序列模型中的 ruby 代码以改进运行时间?
这是可能的,但我打赌在 Ruby (MRI) 中构建相同的模型会比在 SQL 运行时慢得多。
您介意分享更多有关您遇到的性能问题的详细信息吗?
如果你想用 Ruby 构建它,我会说你应该考虑有一些“window 概念”,它将负责理解某些特定数组的滞后。
示例:
a = [1,2,3,4,5]
lag = -> (i) {a[i-2] if i > 1} # => #<Proc:0x00007fcca6cf6aa0@(pry):12 a.each_with_index.map{|e,i|[e,lag[i]]}
# => [[1, nil], [2, nil], [3, 1], [4, 2], [5, 3]]
在本例中,我使用的是原始数字,但您可以使用包含时间属性的对象构建更复杂的规则。
您可以使用一些简单的时间模块将时间舍入为 time_bucket。检查一些 ideas here.