【问题标题】:Rails 3 Improve Active Record Query PerformanceRails 3 提高 Active Record 查询性能
【发布时间】:2012-06-17 09:25:21
【问题描述】:

您好,我有以下问题:

Player.select("Players.*, (SELECT COUNT(*) FROM Results WHERE Results.player_id = Players.id and win = true and competition_id = 4) as wins").where("competition_id = 4").order("wins desc")

本质上,它是根据结果表中的外键出现来计算和排序玩家记录,其中对于特定比赛,win 设置为 true。为了让您更好地了解结果表中的一些示例数据可能是...

Player_ID | Match_ID|Win|Elapsed_Time|etc..
1         |    1    |T  | 1:00       |etc..
2         |    1    |F  | 1:00       |etc..
1         |    2    |T  | 3:00       |etc..
3         |    2    |F  | 3:00       |etc..

如您所见,此语句中出现了两个选择,我认为这可能会在未来导致性能下降。玩家实际上与结果有一对多的关系,你可以猜到,但我不知道如何使用我认为可能更有效的连接来完成这项工作。

也许我错了,上述查询没有任何问题 - 无论哪种情况,请提供一些建议。

我使用的是 PostgreSQL 数据库。

【问题讨论】:

    标签: ruby-on-rails-3 performance


    【解决方案1】:

    也许是这样的?

    Player.joins(:results).where("results.win = true AND results.competition_id = 4").order("results.count DESC")
    

    【讨论】:

    • 您好,我收到错误消息:PGError: ERROR: column "results.id" 必须出现在 GROUP BY 子句中或用于聚合函数最后的订单子句
    • 我没有使用 Heroku,实际上我也已经在 PG 9.1 上。实际上,事实证明,无论如何see here,上述查询并不能完全满足我的需要,因此需要以一种或另一种方式进行修订。我认为加入可能是我必须采取的路线
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多