优化查询以使随机运行更快

时间:2015-09-15 13:02:11

标签: sql ruby-on-rails ruby postgresql

在我的rails应用程序中,我有一个看起来像这样的方法:

def find_person(field, attribute)
  Person.where.not(Hash[field, nil])
      .where.not("lower(#{field})  = ?", attribute.downcase)
      .where("difference(#{field}, ?) < 2", attribute)
      .order('RANDOM()')
      .limit(3)
      .pluck("lower(#{field})")
      .uniq
end

由于.order('RANDOM()'),此查询非常慢。如何更快地进行此查询?

1 个答案:

答案 0 :(得分:1)

另一种方法,使用Ruby获取3个随机记录。

def find_person(field, attribute)
  ids = Person.where.not(Hash[field, nil])
      .where.not("lower(#{field})  = ?", attribute.downcase)
      .where("difference(#{field}, ?) < 2", attribute)
      .pluck("id")

  Person.where(:id => ids.sample(3))
end

如果采取太慢,另一种方法。

def find_person(field, attribute)
  q = Person.where.not(Hash[field, nil])
    .where.not("lower(#{field})  = ?", attribute.downcase)
    .where("difference(#{field}, ?) < 2", attribute)

  max = q.count
  offsets = [rand(max), rand(max), rand(max)]
  offsets.map { |o| q.offset(o).limit(1).pluck("lower(#{field})").first }

end