【问题标题】:Rails efficient method to query table from last record backward or reverseRails 从最后一条记录向后或反向查询表的有效方法
【发布时间】: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_eachfind_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 方法不对这些方法进行操作。
  • 嗯,我在 Rails 控制台中尝试过这个,查询忽略了order("created_at DESC")condition。 Rails 5.0.3-beta。我用使用的 SQL 创建了一个paste。所以,如果你想order("created_at DESC")find_each 不是一个选项。这是thread 关于。

标签: sql ruby-on-rails postgresql


【解决方案1】:

我更改了逻辑以有效使用“created_at ASC”。这对我的整体逻辑变化是有道理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多