ruby 在SQLite数据库中进行除法计算的最快方法是什么

2ledvvac  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(152)

我有一个这样的SQLite数据库表

我需要为每个TimeIndex计算ObjectIndex == 1的值除以ObjectIndex == 2的值,例如,对于TimeIndex == 1,100 / 5 = 20
我的代码使用Ruby Sequel,以下是我到目前为止的代码:

array_1 = db[:my_table].where(ObjectIndex: 1).order(:TimeIndex).select_map(:Value)
array_2 = db[:my_table].where(ObjectIndex: 2).order(:TimeIndex).select_map(:Value)
division = array_1.zip(array_2).map { |x, y| y == 0 ? 0 : (x / y).round(2)}

。。。然后在我的ruby代码的其他地方使用除法
目前处理一个ObjectIndex大约需要10秒(如果我先打印出array_1.first,则需要10秒)。表中大约有5813 k行,每个ObjectIndex大约有9000行。这个速度正常吗?或者有什么方法可以减少处理时间?

1aaf6o9v

1aaf6o9v1#

目前,您正在运行两个单独的数据库查询,并将结果转换为Ruby对象,然后压缩并Map纯Ruby中的这些对象(不涉及DB)。一般来说,加速DB使用的最简单方法是最小化查询,最小化DB和非DB类型之间的转换,并在DB中进行计算作为查询的一部分。
我不知道使用Sequel gem的漂亮方法,但它可以运行任意查询,所以这可能有效:

db.run(<<-SQL
  SELECT T1.Value / T2.Value
  FROM my_table T1 JOIN my_table T2
  ON T1.TimeIndex = T2.TimeIndex
  WHERE T1.ObjectIndex = 1 AND T2.ObjectIndex = 2
SQL
)

如果需要的话,你可以添加更多的列到选择中。

相关问题