慢SQL查询

时间:2013-10-21 19:24:32

标签: sql ruby-on-rails performance

我的网页存在一些问题。

它运行速度非常慢,所以我在互联网上读到它可能是一个不好用的SQL。所以我评论了更“复杂”的SQL行,它又开始顺利运行了。

我的问题是:'有没有办法让这个SQL请求“更轻”?

    @companies = Company.where('tbl_companys.state = "enabled"')

    @companies = @companies.includes(:benefit).where("tbl_benefits.end_date >= {Date.today}" )

    @companies = @companies.includes(:benefit).where(tbl_benefits: { state: 'enabled' })

    has_benef_gastro = false

    has_benef_hote = false

    has_benef_ent = false

     until has_benef_gastro == true

        @esta_gastro = (@companies.where('id_category = "2-gastronomia"').shuffle)[0]

        @benefit_gastro = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_gastro.id_company, Date.today).first 

        if @benefit_gastro.nil? == false

            has_benef_gastro = true

        end

    end

    until has_benef_hote == true

        @esta_hotelero = (@companies.where('id_category = "1-hoteleria"').shuffle)[0]

        @benefit_hote = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_hotelero.id_company, Date.today).first 

        if @benefit_hote.nil? == false

            has_benef_gastro = true

        end

    end

    until has_benef_ent == true

        @esta_ent = (@companies.where('id_category = "3-entretenimiento"').shuffle)[0]

        @benefit_ent = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_ent.id_company, Date.today).first 

        if @benefit_ent.nil? == false

            has_benef_gastro = true

        end

    end

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您每次都在调整@esta_gastro@esta_hotelero@esta_ent@benefit_变量,这实际上没有意义。每次执行循环时都需要多个新的数据库查询。

如果你想找到一个随机选择,只需在循环外创建你的集合,一次洗牌(在循环之外),然后迭代这些集合直到你符合你的标准。

例如:

@esta_gastro = @companies.where('id_category = "2-gastronomia"').shuffle
@benefits = Benefit.where('end_date >= ? AND state = "enabled"', Date.today)
@benefit_gastro = nil
i = 0
until !@benefit_gastro.blank?
  @benefit_gastro = @benefits.where('id_company = ?', @esta_gastro[i].id_company).first
  i += 1
end

修改

如果整个目标是定义@benefit_gastro,那么我甚至认为你不需要循环。您可以只定义@esta_gastro集,然后使用它查找对应的所有好处。由于@esta_gastro被随机播放,因此@benefit_gastro将是随机的:

@esta_gastro = @companies.where('id_category = "2-gastronomia"').shuffle
@benefit_gastro = Benefit.where('end_date >= ? AND state = "enabled"', Date.today).where('id_company = ?', @esta_gastro.map(&:id)).limit(1)

答案 1 :(得分:0)

我最终做了一个简单的SQL请求,所以我不必为一些rails问题而烦恼。

非常感谢!