【问题标题】:How can I run multiple SSRS reports on multiple threads如何在多个线程上运行多个 SSRS 报告
【发布时间】:2025-12-27 16:35:12
【问题描述】:

我有大约 100 个链接报告,每周和每月运行一次。我已经组合了一个 c# 控制台,该控制台从 db 表动态创建特定时期的 Report Server 文件夹,并从 db 表创建链接的 SSRS 报告。这些报告运行良好,但每个报告在 foreach 循环中一次运行一个,如果您在一夜之间运行它们很好,但有时这些报告会失败(无论出于何种原因)并且失败的报告在数据库中被标记为这样。

我的问题是: 如何在一个线程上运行(例如)10 个报告并同时运行每个线程——同时运行 10 个线程,因此运行所有报告的时间应该更快。这应该只需要一小部分时间来在星期一重新运行任何失败的报告。这甚至可能吗?

在我的 c# 控制台中,我使用 ReportingService2010 创建链接报告:

ReportingService2010.CreateLinkedItem(linkedReport, folder, existingReportPath, props);

ReportingService2010.SetExecutionOptions(reportPath, "Snapshot", new NoSchedule());

ReportingService2010.SetItemHistoryOptions(reportPath, true, true, new NoSchedule());

ReportingService2010.UpdateItemExecutionSnapshot(reportPath);

任何帮助将不胜感激。 非常感谢

【问题讨论】:

  • 您意识到 SSRS 有一项功能,您可以在其中安排报告的运行时间?以这种方式运行它们似乎没有充分的理由。
  • 您可以动态创建报表服务器文件夹并通过计划创建链接报表吗?对于每周/每月,我们需要创建一个具有新处理周期的文件夹结构,以便我们的用户可以查看任何给定时间的历史数据。
  • 报告历史可以通过快照来实现。也许可以对快照进行分组或任何自定义列表。无论如何,仅依靠快照,您的整个过程都会得到很大改善:如果您运行快照,您必须完成的任务是“简单”下载每个报告的最新快照,以将其存储在适当的文件夹中。
  • 感谢 Ben 和 Paulo 回复我。我们目前正在创建报告历史记录。 B 创建链接报告,我们正在创建快照。快照是在特定一周的文件夹中创建的,例如 201401。接下来的一周,我们创建相同的报告,不同的日期作为快照,并在文件夹 201402 中创建。我们正在创建大约 100 个报告,一次运行一个是没有效率。我希望找到一种在一个线程上创建 10 个报告并运行多个线程的方法。这可能吗?

标签: c# sql-server multithreading reporting-services


【解决方案1】:

直接的解决方案是:创建多个共享所有报告生成的 C# 控制台客户端(就像多个客户端同时访问可用报告一样)。通过这种方式,您可以确定报告生成是分批执行的。就是这样,因为您不能强制 SSRS 服务器同时处理一定数量的报告。无论您如何请求生成报告,它都会处理其工作量。

不过,我认为这是一种错误的做法。

您必须考虑到 SSRS 会根据需要同时处理尽可能多的报告,即使同时请求和处理这些报告,SQL Server 引擎也会(再次)按照它的想法处理工作负载应该做。所有这一切意味着同时执行所有报告(或分批执行 N 个报告)并不能保证总时间会更短。另一件需要考虑的事情是,呈现报告可能会占用总执行时间的很大一部分(有时比执行所有 sql 查询要多得多),这会大量使用 CPU。

另一方面,正确的方法是创建一个数据仓库来保存所有历史数据(这将是纯粹的数据库引擎进程),而报告(应该使用日期参数)只是一种访问方式已经存储在数据仓库中的数据。

无论如何,我知道创建 DW 是一个大项目,而您正在寻找更简单的解决方案。为此,您需要确定瓶颈在哪里(sql 引擎、ssrs 渲染……)并尝试平衡或增加您的资源(如果可能)以释放该瓶颈。

可能不是您需要的答案,但可以为您节省一些时间来尝试开发一个对您的总处理时间影响很小或没有影响的解决方案。

【讨论】: