通过计数查询来加速Active Record组

时间:2019-05-06 19:40:16

标签: ruby-on-rails postgresql activerecord

如何加快以下查询的速度?我希望找到具有6个或更少的fb_id唯一值的记录。选择似乎并没有增加太多时间,而是groupcount。有其他查询方式吗?我在fb_id上添加了索引,它仅使查询速度提高了50%

FbGroupApplication.group(:fb_id).where.not(
  fb_id: _get_exclude_fb_group_ids
).group(
  "count_fb_id desc"
).count(
  "fb_id"
).select{|k, v| v <= 6 }

该查询正在查找具有6个或更少应用程序的FbGroupApplications应用于同一fb_id

1 个答案:

答案 0 :(得分:2)

将块传递给select方法使Rails触发SQL,将找到的行转换为ActiveRecord :: Base的ruby对象(记录),然后根据所给的块在数组上执行选择。这整个过程成本很高(红宝石对此不擅长)。

您可以使用6子句“委托”将计数vs having与数据库进行比较的责任:

FbGroupApplication
  .group(:fb_id)
  .where.not(fb_id: _get_exclude_fb_group_ids)
  .having('count(fb_id) <= 6')