【发布时间】:2016-03-19 15:39:01
【问题描述】:
使用 Rails 4.2 和 PostgreSQL 9.4.5。我有一个事务日志表 (XLog),我需要反向读取它,从最后一条记录开始并继续处理,直到出现特定条件。我能够做到这一点,但它需要“全部”方法并且效率不高。在我的测试系统中,第一条记录出现在 0.06 秒之后,所有后续查询都是无穷小,小于 0.001 秒。我尝试了许多其他查询,但它们没有产生预期的结果。我正在使用 ActiveRecord,但当然可以为此使用本机 SQL 查询。
这是只关注从最后一条记录向后读取 XLog 的测试代码:
class EtlLastProcessed
def initialize(company: nil)
ActsAsTenant.with_tenant(company) do
count = 0
clock = Time.now
xlogs = XLog.all.order("created_at DESC")
xlogs.each do |xlog|
puts Time.now - clock
clock = Time.now
break if count > 1000
count += 1
puts "Xlog date is #{xlog.created_at.in_time_zone.to_date}"
end
puts "ETL Last Processed done."
end
end
end
【问题讨论】:
-
为什么不只使用
func_each或find_in_batches?例如XLog.order("created_at DESC").find_each do或...find_each(batch_size: 5000) do。没有所有。 -
你尝试
find_each(batch_size: N)和find_in_batches(batch_size: N)其中N > 1000? -
@IvanBlack 是的,我都试过了,但是查询首先要获取记录,然后 ActiveRecord 会为你批量处理。 find_each 和 find_in_batches 都不是 SQL 查询的一部分,它首先获取然后被批处理的记录,似乎?
-
@IvanBlack 我应该限定那句话,至少 to_sql 方法不对这些方法进行操作。
标签: sql ruby-on-rails postgresql