0

我有actions一张包含超过 450,000 条记录的表。我想在actions表上加入users表(它实际上是在加入表之前加入另外两个表,其中一个在另一个上加入,另一个在users表上加入actions。)sql查询如下所示:

SELECT "users".* FROM "users" INNER JOIN "campaigns" ON "campaigns"."user_id" = "users"."id" INNER JOIN "books" ON "books"."campaign_id" = "campaigns"."id" INNER JOIN "actions" ON "actions"."book_id" = "books"."id" AND "actions"."type" IN ('Impression')

但是,由于表中有大量记录,rails 中的此查询导致我的应用程序挂起actions

我应该如何处理这个?

4

1 回答 1

0

这种方法有几个问题:

  1. 您多次获取相同的用户(用户乘以操作数)
  2. 您正在一次获取所有具有相应操作的用户。这意味着大量的内存消耗和频繁的垃圾收集
  3. 您正在获取用户的所有属性。我想,你不需要所有这些
  4. 您已对按订单数量对用户进行排序发表评论。你在 Ruby 代码中这样做吗?如果是,那么这是第四个问题。大问题,确实

所以我建议使用 group() 方法对记录进行分组,或者只是简单的 SQL

    SELECT "users".id, count(*) as actions_cnt
    FROM "users" 
        INNER JOIN "campaigns" ON "campaigns"."user_id" = "users"."id" 
        INNER JOIN "books" ON "books"."campaign_id" = "campaigns"."id" 
        INNER JOIN "actions" ON "actions"."book_id" = "books"."id" AND "actions"."type" IN ('Impression')
    GROUP BY
        "users".id

如果您的应用中有很多用户,那么我建议添加“OFFSET #{offset} LIMIT #{limit}”来批量获取记录。

最后,您可以直接指定您需要的列,这样内存占用就不会那么大。

于 2012-05-21T11:54:01.350 回答