【问题标题】:Generating big and slow reports on a server在服务器上生成大而慢的报告
【发布时间】:2016-05-31 15:39:34
【问题描述】:

假设,有人会如何在服务器上实现大而慢的报告? 我正在考虑无法对 SQL 进行更多优化的报告,并且生成最多需要 60 秒或更长时间。 我考虑过拥有数据库的读取副本以不阻止传入的查询,或者以某种方式让后台进程完成工作并在报告完成时通知用户。 有没有最好的方法来做这样的事情?

【问题讨论】:

  • 您是在寻找优化 sql 查询还是向用户显示等待通知的方法?
  • 我只是在想一个假设的场景。 sql查询无法再优化,生成报表时超出服务器执行时间

标签: web-applications architecture server webserver application-server


【解决方案1】:

报告必须接近实时的情况很少见。因此,您可以与业务专家讨论,以确定数据在一段时间内可能过时是否可以接受。如果这段时间足够长,那么您可以预先生成报告并缓存它们。

另一种更灵活和可扩展的方法是在消息传递基础架构上发布感兴趣的事件,因为它们正在发生。然后,您可以拥有一个异步订阅者,该订阅者利用这些事件来使报告的非规范化版本保持最新。

例如,假设我们必须生成每件产品每年的总销售额报告。如果应用程序发布了诸如{ type: 'ProductSold', productId: 1, soldOn: someDate, price: 45.55 } 之类的消息,那么您可能有一个异步订阅者写入诸如YearlyProductSales (year int, product_id uuid, total money) 之类的表中,从而有效地在新销售出现时使报告保持最新。

由于事件描述了已经发生并记录的事情,因此您在读取数据和生成报告时也不必锁定任何内容,就像SELECT * FROM YearlyProductSales 一样简单。

【讨论】:

    【解决方案2】:

    许多报告引擎都支持异步报告。确切的实现取决于您的技术堆栈,但是,例如,如果您使用的是Jasper Reports, here is how to run a report asynchronously。如果您使用的是 SQL 服务器,Here 是您使用 SSRS 的方式。大多数报告引擎都有某种异步执行方法。

    设置只读副本是减轻数据库负载的一种行之有效的方法。再一次,实施取决于您的技术堆栈。上面的答案是从data-warehousing techniques 开始的,也是值得的。深入了解数据仓库/数据集市将帮助您确定需要在此处投入多少精力。

    【讨论】:

      【解决方案3】:

      SQL 数据库同时处理TransactionsLocking 的请求,您不必担心处理传入的查询。如果您想通知用户查询已排队,您必须实现用户界面以及 Ajax 请求并显示进程状态。

      【讨论】:

      • 我可能没有关注你,但锁定是我想要阅读副本的原因,所以我可以在用户更新真实副本时生成关于该副本的报告。那么,回到问题上来,如果 Ajax 请求被服务器的等待时间拖住了怎么办?
      • SQL server 和 Mysql 等数据库的开发者,到目前为止,已经为他们的数据库实现了所有优化的数学和逻辑解决方案。我们简单的解决方案不会帮助数据库更快、更可靠地行动。我们只是担心优化的 sql 查询,而不是服务器端的查询处理逻辑。
      • 在 Ajax 请求中,您可以跟踪服务器上所有成功和不成功以及等待的请求,并向用户显示正确的通知。
      • 这只会掩盖问题,但您仍然会牺牲很多宝贵的资源。
      猜你喜欢
      • 2021-10-31
      • 2015-02-20
      • 2012-06-09
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多