【问题标题】:ASP.NET: Strategy for handling really large reportsASP.NET:处理超大报表的策略
【发布时间】:2009-11-10 14:30:42
【问题描述】:

也许不是特定于报告,但仍然...

在我的 asp.net mvc web 应用程序中,有一个报告部分显示 5 列数据,这些数据几乎直接映射到数据库中的一个表。

问题是,在某些情况下,该报告的长度可能超过 40,000 条记录(我知道,没有人可以真正处理 40,000 条数据记录,但报告就是这样),正如您所料,它会超时并且抛出错误。

问题是,处理和交付这种规模的报告的好方法是什么?我曾想过创建一个小型控制台应用程序来在网络服务器之外构建报告,但我不知道该往哪个方向研究?

【问题讨论】:

  • 分页可以选择吗?
  • 40,000 条记录在我看来并没有那么大。数百万条记录真的很大,需要千兆字节的内存才能将所有数据保存在内存中,但我们对什么是大的有不同的看法,对吧?
  • @blesh - 分页是一种选择,但我们遇到问题的报告是用户想要所有内容的报告...... @JB - 好点,希望有一天我们有数百万条记录我现在正在做的工作将有助于处理所有这些:)

标签: c# asp.net asp.net-mvc reporting


【解决方案1】:

报告是否需要最新数据?如果没有,您可以在晚上(或在您的服务器不忙时)将报告生成为 PDF 并提供指向 PDF 的链接。按照您的建议运行控制台应用程序的计划任务可以创建报告并将其输出到文件中。许多报告工具(如 Crystal Reports)允许您将报告导出为 PDF 或 Excel 电子表格。就此而言,您可以在完全不同的机器上生成报告,然后将其复制到 Web 服务器。这可以让您每小时(或其他时间)更新报告,而不会在您的网络服务器上增加这样的负载。

【讨论】:

  • 嗯,这真是个好主意。数据不需要是最新的,只在晚上创建报告可能是有意义的。好主意 - 谢谢!
  • +1。这正是我要做的,除了我将报告生成为 HTML,并对其进行优化(尽可能多地消除空白)。我这样做的唯一原因是,如果没有第三方工具,HTML 更容易生成,我对此不确定,但我认为这会导致文件更小,从而节省磁盘空间和带宽。
  • 报告可以是 html 或 csv(我们​​没有为此使用第三方工具) - 感谢您提供有关减少空格的提示!
【解决方案2】:

在用户等待时生成报告可能不是一个好主意(更不用说 SQL / IIS 超时等)

您可以让用户请求报告,然后让 Windows 服务接收这些请求,生成报告并通过电子邮件发送给用户? (或者在网站上有某种 ajax 轮询脚本,以便在用户的报告准备好时通知用户?)

您可以将此扩展到定期安排相同的报告等。

【讨论】:

  • +1 我有类似的问题,发现这个建议最适合我的情况。
【解决方案3】:

我会研究 SQL Reporting Services(假设它在 SQL Server 上运行)。有几种交付选项可能更适合您的应用程序需求(例如,您可以安排 PDF 或 Excel 文档每晚显示在某人的邮箱中)。

StackOverflow 团队还有一篇很棒的文章允许在 ASP.NET 中进行后台进程,前提是您可以简单地每隔一段时间而不是按需生成此报告(可能每 5-10 分钟一次?)

https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

【讨论】:

【解决方案4】:

我见过的另一个处理大规模报告的常见用法是设置一个 Windows 服务,该服务执行报告的物理生成,将完成的二进制文件转储到某个数据库或文件存储中,然后更新数据以显示报告是填写应用程序链接已完成报告所需的信息。

然后,您可以让您的“执行报告”按钮触发启动报告的请求,然后将它们移动到处理报告页面,其中列出了所有排队/正在为它们处理的报告。

【讨论】:

    【解决方案5】:

    用户是否会真正查看 40,000 行报告的全部内容是值得怀疑的。那么为什么不只显示倒序排列的前 1,000 个最新行呢?如果您正在使用支持按需报告的报告解决方案,您始终可以向下钻取到显示接下来 1,000 个最新行的第二个报告。只是一个想法......

    【讨论】:

    • 好吧,在我们的情况下,用户想要一份完整的报告......我们确实有一个分页选项,但它不会像这些包含所有记录的那样给我们带来麻烦......
    猜你喜欢
    • 2010-09-24
    • 2010-09-25
    • 2010-11-24
    • 2018-10-22
    • 1970-01-01
    • 2011-03-23
    • 2012-08-23
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多