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

Web applications 在服务器上生成大而慢的报告,web-applications,architecture,server,webserver,application-server,Web Applications,Architecture,Server,Webserver,Application Server,假设有人会如何在服务器上实现大而慢的报告? 我在想SQL不能再优化的报告,生成这些报告需要60秒或更长时间。 我曾经考虑过使用数据库的读取副本来不阻止传入的查询,或者使用某种方式让后台进程完成工作,并在报告完成时通知用户。 有没有最好的方法可以做到这一点?SQL数据库处理和的同时请求,您不必担心处理传入的查询。如果您想让用户注意到查询已排队,则必须实现用户界面以及Ajax请求,并显示进程状态。SQL数据库处理和同时发出的请求,您不必担心处理传入的查询。如果您想让用户注意到查询已排队,则必须实现用

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

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

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

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

另一种更加灵活和可扩展的方法是在消息传递基础设施上发布感兴趣的事件。然后,您可以拥有一个异步订阅服务器,该订阅服务器利用这些事件使报表的非规范化版本保持最新

例如,假设我们必须生成一份每年每种产品的总销售额报告。如果应用程序发布了一条消息,如
{type:'productsalled',productId:1,soldOn:someDate,price:45.55}
,那么您可能有一个异步订阅服务器,它会写入一个表,如
YearlyProductSales(year int,product_id uuid,total money)
,在新的销售发生时有效地保持报告的最新性


由于事件描述了已经发生并被记录的事件,因此在读取数据和生成报告时,您也不必锁定任何内容,只需从YearlyProductSales中选择*即可。因此,您可以与业务专家讨论,以确定数据在一段时间内过时是否可以接受。如果这段时间足够长,那么您可以预生成报告并缓存它们

另一种更加灵活和可扩展的方法是在消息传递基础设施上发布感兴趣的事件。然后,您可以拥有一个异步订阅服务器,该订阅服务器利用这些事件使报表的非规范化版本保持最新

例如,假设我们必须生成一份每年每种产品的总销售额报告。如果应用程序发布了一条消息,如
{type:'productsalled',productId:1,soldOn:someDate,price:45.55}
,那么您可能有一个异步订阅服务器,它会写入一个表,如
YearlyProductSales(year int,product_id uuid,total money)
,在新的销售发生时有效地保持报告的最新性


由于事件描述了已经发生并被记录的事件,因此在读取数据和生成报告时,您也不必锁定任何内容,只需从YearlyProductSales中选择*即可。许多报告引擎支持异步报告。具体的实现取决于您的技术堆栈,但是,例如,如果您正在使用。如果您使用的是SQL server,请参阅如何使用SSRS。大多数报告引擎都有某种异步执行方法


设置只读副本是减轻数据库负载的一种行之有效的方法。同样,实现取决于您的技术堆栈。上述答案也值得一提,因为它正朝着这个方向发展。阅读有关数据仓库/数据集市的详细信息将帮助您决定需要在这里投入多少精力。

许多报告引擎支持异步报告。具体的实现取决于您的技术堆栈,但是,例如,如果您正在使用。如果您使用的是SQL server,请参阅如何使用SSRS。大多数报告引擎都有某种异步执行方法


设置只读副本是减轻数据库负载的一种行之有效的方法。同样,实现取决于您的技术堆栈。上述答案也值得一提,因为它正朝着这个方向发展。阅读有关数据仓库/数据集市的详细信息将帮助您决定需要在这里投入多少精力。

您是在寻找sql查询的优化,还是向用户显示等待通知的方法?我只是在想一个假设的场景。生成报告时,sql查询无法再优化,并且服务器的执行时间被超过。您是在寻找sql查询的优化还是向用户显示等待通知的方法?我只是在想一个假设的场景。生成报告时,sql查询无法进行更优化,并且超出了服务器的执行时间。我可能没有跟踪您,但锁定是我希望读取副本的原因,因此,在用户更新真实副本时,我可以在该副本上生成报告。那么,回到问题上来,如果Ajax请求因服务器的等待时间而停止,该怎么办?SQL server、Mysql和其他数据库的开发人员到目前为止已经为他们的数据库实现了所有优化的数学和逻辑解决方案。我们的简单解决方案无法帮助数据库更快、更可靠地运行。我们只关心优化后的sql查询,而不关心服务器端的查询处理逻辑。在Ajax请求中,您可以跟踪服务器上所有成功和不成功的请求以及等待的请求,并向用户显示适当的通知。这将