在服务器上生成大而慢的报告

时间:2016-05-30 19:39:36

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

设置只读副本是一种缓解数据库负载的可靠方法。再一次,实现取决于您的技术堆栈。上面的答案,即开始走向data-warehousing techniques的道路,也是值得的。关于数据仓库/数据集市的详细阅读将帮助您决定在这里投入多少精力。