如何在多个线程上运行多个SSRS报告

时间:2014-12-19 10:56:26

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

我有大约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);

任何帮助都会非常感激。 非常感谢

1 个答案:

答案 0 :(得分:0)

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

尽管如此,我认为这是一种错误的做法。

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

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

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

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