与分页查询一起使用时,有多少联接记录包含加载到内存中?

时间:2017-04-22 16:27:02

标签: ruby-on-rails activerecord

Rails应用中的一个特定页面不断在Heroku上引发Error R15 (Memory quota vastly exceeded)错误。

此页面有多个远程datatables。这些数据表由ajax查询填充,看起来像这样。

User.
  find( params[:id] ).
  events.
  includes(:city,:state,:country).
  where("users.name ilike :search or cities.name ilike :search or states.name ilike :search or countries.name ilike :search", search: "%#{params[:search][:value]}%" ).
  page(page).per(10)

这些表很大,但是当查询被分页时,我没想到会有多少内存加载。有人向我建议,虽然paginate可能会限制将Events加载到内存中的次数,但includes行会加载所有citystatecounty记录。

  1. 这听起来不错吗?以上查询是否会加载所有已连接的表 通过includes来电?
  2. 引用
  3. 如何更改此查询以确保有效使用内存?

1 个答案:

答案 0 :(得分:0)

不是全部,而是与使用外键的用户模型关联的那些。 使用iLike本身在数据库级别进行字符串搜索很重,但如果你真的想进行ilike搜索,我看到的一个优化范围是从所有表中只选择名称列。如果您在日志中注意到,您的查询将为select * from类型。