将批量数据导出为ex​​cel

时间:2014-08-25 16:43:57

标签: ruby-on-rails nginx export-to-excel

我尝试通过在后台执行以下查询(ruby on rails)将数据导出为ex​​cel文件。但是,完成执行需要4分钟左右。

您是否可以通过单击按钮向我建议任何从数据库导出大量数据的方法/概念。以下查询的结果可能超过计数50000(记录)。当我点击按钮时,由于大量执行而导致超时。

我正在为我的应用程序(ROR)使用nginx + unicorn服务器。我尝试通过将unicorn worker超时值从60增加到240并且还更改了nginx中的超时值。但没有效果。

以下查询是一种观点。查询优化建议随时欢迎。

SELECT temp.id,
       temp.first_name,
       temp.last_name,
       temp.email,
       temp.status,
       temp.pdate,
       temp.dname,
       (CASE WHEN temp.credit IS NULL THEN 0 ELSE temp.credit END) -(CASE WHEN temp.claim IS NULL THEN 0 ELSE temp.claim END) as b ,
       (CASE WHEN temp.claim IS NULL THEN 0 ELSE temp.claim END) as b1
FROM
  (SELECT users.id,
          first_name,
          last_name,
          email,
          status,
     (SELECT to_char((max(purchased_date) + interval '1 year')::date, 'DD/MM/YYYY')
      FROM purchases
      WHERE users.id = purchases.user_id
        AND type = 0) AS pdate,
     (SELECT name
      FROM owners
      WHERE owners.id=users.owner_id) AS dname,
     (SELECT sum(credits.credit)
      FROM credits
      INNER JOIN purchases ON purchases.id = credits.purchase_id
      WHERE purchases.user_id = users.id
      GROUP BY purchases.user_id) AS credit,
     (SELECT sum(claims.credits)
      FROM claims
      LEFT OUTER JOIN purchases ON purchases.id = claims.purchase_id
      WHERE purchases.user_id = users.id
      GROUP BY purchases.user_id) AS claim
   FROM users) AS TEMP

1 个答案:

答案 0 :(得分:0)

不要那样做。

HTTP请求周期不应包含花费太长时间的操作,例如您要完成的操作。这是糟糕的设计。

用户应单击导出按钮,应用程序应立即将控件返回给用户。然后后台作业应该处理从数据库导出数据。 (您可以使用delayed_job)等工具。换句话说,工作应该异步完成。

应将流程结果发回用户电子邮件或用户信息中心或其他浏览器通知。

P上。