【问题标题】:SSRS - OutOfMemory exception for Matrix reportSSRS - 矩阵报告的 OutOfMemory 异常
【发布时间】:2019-07-12 16:07:54
【问题描述】:

我正在尝试通过 SSRS 设计一个Matrix 报告,以在另一列(即数据透视表)中为一系列动态值聚合一列。该数据仅包含超过 1300 万行,因此它是一个大型数据集。

当通过 T-SQL 对此数据执行 PIVOT 时,它能够在大约 1 分钟内聚合所有这些行,但是当让 SSRS 通过 Matrix 报告为我进行数据透视时,我尝试在我的 PC 上预览报告时出现 OutOfMemory 异常。

返回数据集本身的查询并不复杂,很简单:

SELECT
    ID
    ,Test_Ref
    ,Data_issue_indicator
FROM MyTable

我们尝试对Test_Ref 中的值求和Data_issue_indicator(可以是10),其中有一个动态范围的值可以聚合;换句话说,我们不能使用标准的Tablix 报告,因为如果将新的Test_Ref 值引入数据集中,列的数量可能随时增加。

我使用的是 Visual Studio Enterprise 2019,我的电脑是 Windows 10,i7-8850H,内存为 16GB。

有解决此问题的建议吗?

【问题讨论】:

  • 您是否尝试过聚合数据集的数据,而不是让报表完成所有工作?您可以保持报表设计相同(可能)只需将数据集查询更改为 SELECT Test_Ref, SUM(Data_issue_indicator) AS Data_issue_indicator FROM myTable GROUP BY Test_Ref
  • @AlanSchofield 这在将返回的行数从 ~13m 减少到 ~6m 方面略有帮助,但这对于 SSRS 来说仍然难以处理;至少在我的环境中

标签: sql-server reporting-services visual-studio-2019


【解决方案1】:

使用 SSRS 时,建议一次抓取更多数据,以防多次使用数据集。但是当你有一个更大的数据集时,你需要在你想要实现的目标和你需要所有数据之间进行权衡。

因此,在这种情况下,我建议使用一个程序来限制您抓取到报告中的数据量。

我已经经历过这种情况,我也必须这样做,因为超时的不是查询,而是加载到报告中的大量数据导致报告失败。

如果您有 SQL server profiler ,您会看到 SQL 已执行并完成,但报告会超时呈现。

【讨论】:

    【解决方案2】:

    两个想法,假设您计划将报表部署到具有内存来处理此问题的服务器,并且出于某种原因您更愿意在报表服务器而不是 SQL 服务器上执行此处理:

    1. 不要在您的 PC 上的 Visual Studio 中测试功能。设计报告,将其部署到您的报告服务器,并在那里测试它是否有效。

    2. 在您的 PC 上进行测试时,以某种方式强制它使用一个小得多的数据集:一个大到足以验证旋转矩阵工作的数据集,但又小到您的 PC 的内存可以处理它。

    或者更好的是,执行选项 2,然后执行选项 1。

    【讨论】:

    • 它需要在报表服务器上完成,因为列数可能会改变,这意味着如果 SQL Server 端的 PIVOT 出现新列,我将不得不去更改报表定义以手动包含该新列。这个想法是矩阵报告能够自动处理,而无需开发人员手动更改报告定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    相关资源
    最近更新 更多