【问题标题】:Optimising ActiveRecord queries in Rails 2.3在 Rails 2.3 中优化 ActiveRecord 查询
【发布时间】:2012-05-09 00:35:41
【问题描述】:

我正在使用 sqlite db 执行查询,我从数据库中提取了相当大的通话记录数据集。在同一页面上,我想显示通话记录中每天的计数细分,因此我对数据库执行了大约 30 次计数查询。

有没有一种方法可以过滤我最初检索的集合并对内存中的集合执行计数,这样我就不必运行那些连续查询?我需要这些计数用于图形和显示目的,但即使有日期索引,运行初始查询和所有计数查询也需要大约 10 秒。

我基本上要问的是有没有办法对返回的记录进行计数或对其进行分析,或者有没有更聪明的方法来缓存这些数据?

    @set = Record.get_records_for_range(date1, date2)
while date1 < date2
    @count = Record.count_records_for_date(date1)
    date1 = date1 + 1
end

基本上就是我正在做的事情。肯定有更简单、更快捷的方法吗?

【问题讨论】:

  • 您是否有理由不能简单地按日期分组以获得每日总数?例如。 Record.count :id, :group =&gt; 'date'。我猜你最终仍然会运行两个查询,但它比 30 好。也许我错过了一个皱纹。
  • 我想我可能不知道 activerecord API。我什至没有意识到你能做到这一点。

标签: ruby-on-rails sqlite activerecord


【解决方案1】:

使用@set.length 将在不查询数据库的情况下获得内存集的计数,因为它是由 ruby​​ 非活动记录执行的(如.count 是)

阅读这里https://batsov.com/articles/2014/02/17/the-elements-of-style-in-ruby-number-13-length-vs-size-vs-count/

这是从那篇文章中摘录的一段话

length 是一种不属于 Enumerable 的方法——它是具体类(如 String 或 Array)的一部分,并且通常在 O(1)(常数)时间内运行。这是最快的,这意味着使用它可能是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多