【问题标题】:Out of memory exeception for straightforward report直接报告的内存不足异常
【发布时间】:2013-01-26 16:47:25
【问题描述】:

我正在尝试生成 SSRS 报告。这是一个简单的报告,仅用于呈现包含大约 80K 记录的表中的数据。

报表中不进行聚合或数据处理。大约有 50 列以及 19 个报告参数。我只需在报告中显示这 50 列(无数据透视表)。

通常在我们的开发服务器上呈现此报告大约需要 5 分钟(非高峰时段)。我们的生产服务器也是如此,但是用户经常遇到“内存不足”异常,并且报告参数标准没有被使用(这是我从用户那里得到的抱怨)。

尽管渲染需要很长时间,但我可以在本地过滤条件而没有任何问题。

  1. 为什么要花这么长时间才能呈现报告,即使报告很简单?

  2. 当我在 VS 2008 上按 F5 时报告运行良好,但当我点击“预览”选项卡时有时会出现内存不足异常。

  3. 某些列的名称带有“#”字符。如果我在报告中包含此类列,则会引发“内存不足异常”(尤其是在预览模式下)。这是真的吗:SSRS 不喜欢带有“#”的列名吗?例如。我的列名是“KLN#”。

  4. 我在表上创建了一个非聚集索引,但这对我没有多大帮助。

  5. 在预览模式下运行报表与在 VS 2008 上按 F5 有什么区别?按F5虽然需要5分钟也没问题,但是预览模式有问题。

没有太大的重新设计空间(因为它是一个直截了当的报告),也许我只能删除报告参数。

任何建议都将不胜感激。

【问题讨论】:

  • IIRC 在 VS 中按 F5 执行独立预览 - 在单独的进程中。在 VS 中使用 Preview 选项卡时,报表在 VS 进程中处理。预览时检查VS的内存使用情况。

标签: ssrs-2008 reporting-services reportingservices-2005


【解决方案1】:

除了已经发布的答案以及关于报表设计器或报表管理器中的预览问题之外,还有另一种可能的解决方案:避免在第一个报表页面上显示过多的数据!

它可以通过分页到小记录量来完成,即通过带有分页符的自定义组或有时自动(参见 done_merson 的答案)或通过添加简单的封面页来完成。 这些解决方案在开发阶段特别有用,如果您打算将报告结果呈现为 Excel 或 PDF。

我有一个类似的案例,内存不足异常,并且从不返回带有简单报表及其包含大约 70k 记录的数据集的报表。 该查询在大约 1-2 分钟内执行,但报表设计器和我们的开发 SSRS 2008R2 服务器(报表管理器)都无法显示生成的报表预览。最后,我怀疑 HTML 预览是瓶颈,并通过添加带有简单文本框的封面来避免它。下一个报表执行大约需要 2 分钟,并成功显示了带有封面的 HTML 预览。将完整的结果呈现到 Excel 只需要 30 秒。

希望这对其他人有所帮助,因为如果您搜索 SSRS 内存不足异常,此页面仍然是热门帖子之一。

【讨论】:

  • 效果很好!天哪,真是个把戏!非常感谢!终于解决了我的问题!
【解决方案2】:

为什么渲染需要这么长时间...?
我在表上创建了一个非聚集索引,但这对我没有多大帮助。

因为 (AFAIK) SSRS 将在呈现之前构建报表的内存模型。知道 SSRS 将采取三个步骤来创建报告:

  1. 检索数据。
  2. 通过组合报告和数据创建内部模型。
  3. 将报告呈现为适当的格式(预览、html、xls 等)

您可以查看ExecutionLog2 View,了解每个步骤需要多少时间。第 1 步可能已经相当快(几秒钟),所以添加的索引并没有解决瓶颈。可能第 2 步和第 3 步会花费大量时间,并且需要大量 RAM。

SSRS 不喜欢带有#?? 的列名我的专栏名称是 KLN#。

据我所知,这应该不是问题。删除该列的可能性刚好可以使报告再次运行。

没有什么需要重新设计的(因为它是一个直接的报告),例如我可以删除报告参数。

SSRS 不是解决此问题的正确工具。因此,您的问题没有真正的“解决方案”,只有替代方案和解决方法。

解决方法:

  • 正如@glh 在他的回答中提到的那样,为 SSRS 提供更多 RAM 可能“有帮助”。
  • 要求用户使用参数过滤数据(即不允许用户选择所有这些行,只选择他需要的行)。
  • 将报告安排在安静的时刻(当有足够的可用 RAM 时)和cache the report

替代方案:

  • 创建一个小型自定义应用程序,从数据库中读取数据并输出 Excel。
  • 使用SSIS,(我认为)它更适合此类任务(数据转换和迁移)。
  • 重新考虑您的设置。您没有提到报告的上下文,但也许您有一个XY Problem。也许您的用户想要整个报告但只需要几个关键行,或者他们只将其用作备份机制(有更好的替代方案),或者......

【讨论】:

  • ...我认为您遗漏了厨房水槽... ;) 我喜欢您的回答,它肯定表明需要进行更多调查:(
【解决方案3】:

尝试增加你的内存,看到这个帖子有类似的错误:

Need SSRS matrix to show more than 400k records

【讨论】:

  • 增加 RAM,1. 您的意思是在报告服务/sql 服务器或运行报告的计算机上。 2. 我看到其他关于在 64 位上运行大型报告的文章,所以再次在报告服务/sql 服务器或运行报告的计算机上运行 64 位
  • 我怀疑这是在服务器上,因为它会进行处理。老实说,祝你好运,正如@Jeroen 所说,可能存在许多问题。我很想在这里提供您的最终解决方案!
【解决方案4】:

我们刚刚遇到了类似的情况,将 Tablix 属性/常规/分页选项中的“如果可能,保持在一页上”选项设置为关闭,效果很好。

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2012-12-01
    • 2011-04-01
    • 1970-01-01
    • 2017-05-29
    • 2010-10-05
    相关资源
    最近更新 更多