WinForms ReportViewer:缓慢的初始渲染

时间:2009-01-09 21:49:06

标签: vb.net reporting-services reportviewer performance

更新2.4.2010 是的,这是一个老问题,但我想我会给出更新。所以,我再次使用ReportViewer,它仍然在初始加载时缓慢渲染。唯一的区别是SQL数据库位于报告服务器上。


更新3.16.2009

我已经完成了分析,并且不是在第一次调用时使ReportViewer缓慢渲染的SQL。在第一次调用时,ReportViewer控件会锁定UI线程并使程序无响应。大约5秒后,ReportViewer将解锁UI线程并显示“正在生成报告”,然后最终显示报告。我知道5秒并不多,但这不应该发生。我的同事在他的程序中执行相同的操作,并且ReportViewer会根据任何请求立即显示“正在生成报告”。

唯一的区别是报告服务器位于一台服务器上,而数据位于另一台服务器上。但是,当我在SSRS中开发报告时,没有延迟。


更新

我注意到只有第一次加载ReportViewer需要很长时间;相同或不同报告的每个后续加载都会快速加载。


我有一个 WinForms ReportViewer,我在远程处理模式下使用,当调用ReportViewer.RefreshReport()方法时,渲染最多可能需要30秒。但是,报告本身运行得很快。

这是设置ReportViewer的代码:

rvReport.ProcessingMode = ProcessingMode.Remote
rvReport.ShowParameterPrompts = False
rvReport.ServerReport.ReportServerUrl = New Uri(_reportServerURL)
rvReport.ServerReport.ReportPath = _reportPath

这是ReportViewer最多需要30秒才能呈现的地方:

rvReport.RefreshReport()

11 个答案:

答案 0 :(得分:4)

我在其他论坛上找到了答案。 MSDN解释说DLL正在搜索一些Verisign Web服务器并且它需要永远...有两种方法可以关闭它,一种是Internet Explorer中的复选框,另一种是向app.config添加一些行。该应用程序的文件。

答案 1 :(得分:3)

ReportServer总是需要一段时间才能唤醒,因为它在IIS下运行。每个AppPool都有一个进程超时。我们的ASP.NET应用程序的报表查看器遇到了同样的问题。您可以尝试在IIS设置中增加AppPool保持活动时间。

见这里:

我假设你当然正在运行SQL2005 SSRS。

一种选择是升级到2008,其中SSRS不再依赖于IIS。

答案 2 :(得分:3)

总结已经提出的各种想法,可能是

  • 客户端上的报表查看器基础结构的启动时间
  • 在客户端上缓存加载时间
  • 在服务器上查询执行时间
  • 报告服务器上的呈现时间

尝试运行报告,关闭客户端,重新启动客户端并再次运行报告。如果第二次报告速度快得多,请重复此实验,但在报告运行之间加载,运行和卸载另一个大型应用程序。

如果第二次报告运行继续快得多,那么您所看到的差异更多地与SQL Server的I / O缓存有关,而不是客户端上发生的情况。您可以通过运行从报表中未使用的表中提取大量数据的查询来故意替换MSSQL缓存来进一步测试。

以上所有内容都很有趣但不重要。如果您想确保快速报告响应Reporting Services为计划生成的报告提供了广泛的支持,那么当消费者请求报告时,唯一的延迟就是网络传送。

如果您的用户坚持报告最新(实时)数据,他们必须指定更严格的约束参数或习惯等待。

答案 3 :(得分:2)

您可以在本地和服务器两种模式下提取报告。如果您在本地模式下运行,它会将数据和报告定义同时提取到您的计算机上,然后同时渲染它们。在服务器模式下,它只是让SSRS完成所有工作,然后撤回要呈现的信息。

如果您使用的是本地模式,则可能是硬件问题。如果你有一个巨大的数据集,那就是要存储在内存中的 lot 数据。

除此之外,这还不是很多信息......

更新:既然你已经注意到它只是需要一段时间的第一次调用,你是否进行了任何分析以确定大部分工作是在后端SQL调用上完成还是花在实际的报表渲染中?

如果在后续呼叫中速度更快,则可能(偶然)在一个级别或另一个级别进行缓存。您可以缓存报告(http://www.sqlservercurry.com/2007/12/configure-report-to-be-cached-ssrs-2005.html),也可以是在SQL Server中深度缓存返回数据的执行计划。

答案 4 :(得分:2)

开箱即用的思维方式:报表服务器是否与运行应用程序的计算机不同?网络可能需要很长时间来解决“reportServerURL”。一旦解析,名称将被缓存,因此后续调用会更快..

我之前遇到过这个问题,配置不当的DNS服务器。尝试将“reportServerUrl”替换为“reportServerIPAddress”,看看对ReportViewer的初始调用是否更快。

答案 5 :(得分:2)

我遇到了同样的问题。

我发现更改默认打印机(此处网速较慢)可以解决问题。

ReportViewer从默认打印机获取一些信息, 由于这里的网络很慢,我有10秒的延迟

希望有所帮助

答案 6 :(得分:1)

<强>更新

我注意到只有第一次加载ReportViewer需要很长时间;相同或不同报告的每个后续加载都会快速加载。

答案 7 :(得分:1)

你被设置为在服务器上运行,这意味着SRS服务器需要进行渲染,因为第一次出现以下一个或所有原因的延迟(这些是最慢的,有其他的但他们更快):

  • DNS解析:需要将URL解析为IP地址。完成后,它会在本地缓存,从而加快速度。
  • ASP.NET / IIS需要时间来预热。必须进行各种编译和初始加载 - 加载后它将保留在服务器内存中,直到重新启动IIS或发生默认清理时间。
  • Reporting Services需要时间以与ASP.NET / IIS相同的方式进行预热。

要测试此用途,请使用网络监视器,例如Netmon(如果您是Microsoft粉丝)或Wireshark(我的建议),并观察从您的计算机到服务器的流量。您将看到DNS请求,然后HTTP请求将继续,延迟将在返回的数据中。在第二次通话时,您将看到返回和DNS检查的速度差别很大。

你可以做些什么来防止这是一个热身脚本 - 我不知道一个SRS,但这里是一个link到一个不难改变,因为它具有完全相同的问题。

答案 8 :(得分:1)

好像你正在直接追踪SSRS报告。您可能希望改为使用SSRS Web服务。这可能会改善您的表现。

答案 9 :(得分:0)

以下是您的问题的可能解决方案: 在使用该应用程序访问任何报告之前,尝试从Web访问第一个报告。

如果问题没有出现,您可以制作一个“预加载”第一份报告的应用程序,以便让报告服务能够启动。

我已经看到了Microsoft的一些演示应用程序的这种解决方案。使用Analysis Services和Reporting Services的应用程序。

祝你好运

答案 10 :(得分:0)

据我所知,我认为微软正在努力解决这个问题。

最初,报表加载程序只是在第一次呈现报表时很慢,后续报表加载得非常快(稍快一些)。

要帮助解决这个问题,请将启动表单放在标签(Label1)和Timer(Timer1)控件上。设置Label1.Text =“请等待(约15秒)”。设置Timer1.Interval = 3。 在Startup Form的form_Load事件中,设置Timer1.Start。 在Timer1的Tick事件处“frmMyReportForm.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.Normal)”

“frmMyReportForm”包含reportviewer控件的项目中的任何表单。

此处将记录所有延迟,以便在您生成实际报告时,不会有任何延迟。

我希望这可能对我的开发人员有所帮助。