【问题标题】:SSRS Performance with multiple datasets具有多个数据集的 SSRS 性能
【发布时间】:2019-03-19 16:11:49
【问题描述】:

我有两个关于 SSRS 性能的主要问题。我正在合并 10 个 SSRS 报告(10 个汇总 RDL 和 10 个详细 RDL,每个报告有约 4 个 tablix)。每个报告都会点击一个存储过程来获取结果。现在我们已将所有 tablix 合并到一个 RDL 中,并创建了一个新参数,用户可以在其中选择他想要打开的报告,并相应地通过可见性属性显示该 tablix。 现在就性能而言,我想了解什么更好。以下问题:

  1. 合并后,在一个 RDL 中,我们有 10 个数据集,涉及 10 个不同的过程。我是否应该将所有程序合并为一个程序,并根据用户使用 IF Else 条件从参数中选择报告来运行程序部分。 示例用户选择报告 A,然后在过程中 IF @report = A --Code for A-- ELSE IF @report = B --Code for B--。 如果这样做,我是否能够为 10 份报告中的每一份保留缓存?

  2. 对于 10 个详细信息 RDL,它们又拥有自己的 10 个不同的详细信息存储过程。将所有详细的 Tablix 合并为一个并根据用户从报告参数中选择的报告显示/隐藏 Tablix 是否是个好主意。 基本上,我将通过 Action 属性将报告名称作为参数传递,然后使用 IIF 条件显示/隐藏 tablixs。或者我应该为详细报告保留 10 个不同的 RDL。我有那个选项打开。什么对性能更好。

【问题讨论】:

  • 选项2 不会阻止所有的SQL代码被执行,对吧?如果这是正确的,那么我想这取决于。即,这取决于您的 SQL Server 的大小/速度。由于如此复杂,我只想测试这两种情况。
  • 关于详细 RDL 的问题 2。我有 10 个不同的数据集访问 10 个不同的存储过程。请告诉我,如果我将所有详细的 tablix 合并为一个,请保持数据集分开并根据用户选择的报告隐藏 tablix。无论 tablix 是否隐藏,所有详细数据集是否仍会同时运行?有什么更好的维护缓存。程序中具有 IF ELSE 条件的一个数据集 OR10 个不同的数据集
  • 对,但您只是隐藏用户的结果,对吧?您仍在将结果返回到报表服务器,因此看起来这项工作是不必要的。
  • 好的,所以我认为将 RDL 分开会更好。或者我可以将它们合并为一个,包括所有存储过程,并在存储过程中使用 IF ELSE 条件来运行代码部分。这只会运行特定报告的代码。有什么想法吗?
  • 组合存储的过程似乎是合乎逻辑的,假设用户不会选择一个选项然后转身选择另一个选项并在等待数据返回客户端时感到沮丧。如果业务案例不会导致这种情况,那么我将合并 procs 或仅编写一个 wrapper 过程,该过程根据用户输入执行适当的过程。我认为无论哪种方式都可行

标签: sql-server reporting-services ssrs-2008 ssrs-2012 ssrs-tablix


【解决方案1】:

我要做的是 - 假设 10 个 RDL 正在运行 10 个不同的存储过程,为每个存储过程分配一个隐藏参数。让我们称之为@report_number(例如)。因此,对于报告一,在存储过程中,添加一个 where 子句以包含 and @report_number = 1 这应该在技术上停止存储过程运行,一旦它看到一个不同的数字传递(比如报告 2 的 2).. 等等..

@report_number 在单独的数据集中分配。
例如

report1 - 值 = 1

report2 - 值 = 2

.

.

report10 - 值 = 10

因此,当用户运行报告 1 时,@report_number 的值 1 将传递给该数据集。其余数据集不应运行与其关联的过程,因为它们在 where 中不具有预期值子句。

希望这是有道理的。

【讨论】:

  • 所以我有 10 个 RDL 用于摘要和 10 个 RDL 用于详细信息。基本上每个摘要都有其详细报告。我使用的逻辑与您上面提到的完全相同,但用于详细报告。我最担心的是缓存。我不太确定它是如何工作的。我希望我的报告为 10 个 summary 数据集(现在是一个 RDL)中的每一个维护缓存。稍后将 10 个详细 RDL 合并为 1。我可以使用上面的逻辑来限制仅针对特定报告的程序运行。如果我总结使用上面的逻辑,它可能不会维护缓存,对此不确定!您对此有何看法?
  • 我在你的问题中没有看到任何关于缓存的内容!您多久缓存一次报告?如果您正在缓存.. 根据要求每 X 分钟/小时刷新一次缓存.. 前端报告的性能不会成为问题,因为您只刷新一次数据..
  • 数据每天早上只刷新一次。因此,如果我将 10 个汇总数据集分开,它应该为每个数据集创建缓存,对吗?
  • 没错。如果报表超出缓存并且每天刷新,您无需担心性能问题..
  • 只是最后一个问题..所以目前我正在使用唯一的报告 ID 来隐藏/显示 tablixs。并且所有 10 个报告的所有数据集同时运行。但是如果我在我的存储过程中引入 where 条件。 示例 IF @report = A then --Code for A-- 然后它会维护缓存,因为这样代码只会针对用户选择的报告运行
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多