优化Sql Reporting Services 2005中的巨大报表的PDF导出

时间:2008-08-18 22:19:17

标签: sql-server reporting-services

首先,我了解运行极大/长时间运行的报告是一个可怕的想法。我知道微软有一条经验法则表明SSRS报告的执行时间不应超过30秒。然而,由于符合国家法律的外部力量,有时候庞大的报道是首选的邪恶。

在我的工作地点,我们有一个asp.net(2.0)应用程序,我们已经从Crystal Reports迁移到SSRS。由于庞大的用户群和复杂的报告UI要求,我们有一组屏幕接受用户输入的参数并创建要在夜间运行的计划。由于应用程序支持多个报告框架,因此我们不使用SSRS的调度/快照工具。系统中的所有报告都是由计划的控制台应用程序生成的,该应用程序获取用户输入的参数,并使用创建报告的相应报告解决方案生成报告。对于SSRS报告,控制台应用程序生成SSRS报告并通过SSRS Web服务API将其导出为PDF。

到目前为止,除了我们最近从水晶报告转换为SSRS的25,000页报告外,SSRS比Crystal更容易处理。 SSRS服务器是一个64位的2003服务器,有32个ram运行SSRS 2005.我们所有较小的报告都运行得非常好,但是我们在使用这个较大的报告时遇到了麻烦。不幸的是,我们似乎无法通过Web服务API生成上述报告。生成/导出大约30-35分钟发生以下错误:

异常消息:基础连接已关闭:接收时发生意外错误。

网络服务电话是我以前所见过的:

data = rs.Render(this.ReportPath, this.ExportFormat, null, deviceInfo,
   selectedParameters, null, null, out encoding, out mimeType, out usedParameters, 
   out warnings, out streamIds);

奇怪的是,如果使用报表管理器直接在报表服务器上运行报表,则此报表将运行/ render / export。为报告生成数据的proc运行大约5分钟。报告在大约12分钟后以浏览器/查看器中的SSRS原生格式呈现。通过报表管理器中的浏览器/查看器导出为pdf需要额外55分钟。这可靠地工作,它产生了惊人的1.03gb pdf。

以下是我尝试通过网络服务API使报告正常工作的一些更明显的事情:

  • 设置HttpRuntime ExecutionTimeout 报告中的值为3小时 服务器
  • 已禁用http在报表服务器上保持活动
  • 增加了报表服务器上的脚本超时
  • 将报告设置为永不超时服务器
  • 在客户来电时将报告超时设置为几个小时

从我尝试的调整中,我很自在地说任何超时问题都已消除。

根据我对错误消息的研究,我认为默认情况下Web服务API不会发送分块响应。这意味着它尝试在一个响应中通过线路发送所有1.3gb。在某个时刻,IIS引起了人们的注意。不幸的是,API抽象出Web服务配置,所以我似乎无法找到启用响应分块的方法。

  1. 有没有人知道在不降低总页数的情况下减少/优化PDF导出阶段和/或PDF的大小?
  2. 有没有办法打开SSRS的响应分块?
  3. 是否有其他人有任何其他理论为什么它在服务器上运行而不是通过API?
  4. 编辑:在阅读kcrumley的帖子后,我开始通过获取文件大小/页数来查看平均页面大小。有趣的是,对于较小的报告,数学计算结果是每页大约为5K。有趣的是,当报告变大时,这个“平均值”会增加。例如,8000页报告的平均值超过40K /页。很奇怪。我还要补充说,除了每个分组中的最后一页之外,每页的记录数都被设置,因此不是某些页面的记录多于另一个页面的情况。

3 个答案:

答案 0 :(得分:3)

  
      
  1. 无论如何都有人知道   减少/优化PDF导出阶段   和/或PDF的大小没有   降低总页数?
  2.   

我有一些想法和问题:
这是一张图片密集的报道吗?如果没有,您是否有以文本开头但由SSRS PDF渲染器转换为图形的表格(检查您是否可以选择PDF中的文本)?每页41K可能比应该更多,或者可能不是,这取决于您的报告信息密集程度。但是我们遇到过一些情况,我们在报告的布局上遇到了一些小问题,例如表格渗透到页面的边缘,这导致SSRS PDF渲染器“甩手”并将表格渲染为图像而不是文本。显然,报表中的图形越少,文件大小就越小。
2.有没有办法可以轻松地将报告分成几部分?例如,如果它是一个10位置的报告,其中位置1后面是位置2,等等,在您的最终报告中,您是否可以独立于位置2部分运行位置1部分,等等?如果是这样,您可以在收到所有内容之后使用PDFSharp将10个子报告加入到一个最终PDF中。这会导致页面编号出现一些困难,但没有什么不可克服的。

  

3。有没有其他人有任何其他   关于为什么会这样运行的理论   服务器但不通过API?

我的猜测是报告的庞大规模。我不记得什么是IIS设置以及特定于SSRS的内容,但可能有一些整体的IIS设置(可能在Metabase.xml中),您必须更新甚至允许传递大量数据。

您可以通过使用其中一个工作报告并使用WAITFOR在存储过程中构建一个漫长的等待时间(假设您的DBMS使用SQL Server)来隔离时间是否存在问题。

本身不是解决方案,而是想法。希望它有所帮助。

答案 1 :(得分:3)

我们缩小了SSRS的大型PDF出口,发现了2个主要罪魁祸首

1)除非图像是JPG或PNG颜色类型3,否则它们将扩展为BMP的参见here

2)除非您将SSRS配置为其他方式(不推荐),否则SSRS会将字体或字体子集嵌入到PDF中,除非它们是5 'standard' PDF fonts之一。

虽然大多数Windows操作系统都没有安装任何标准字体(我猜不是符号),但我们发现如果您使用Times New Roman, Courier New, or Arial,则会进行正向和反向字体替换。

转换RDL的最简单方法是将它们视为XML并搜索并替换FontFamily标记。

如果您必须使用非标准字体,那么您仍然可以将损害降至最低:

  • 尽可能少地使用字体。搜索RDL XML以确保没有任何冗余字体。
  • 如果使用不同大小的字体,请使用TTF字体。
  • 尽量不要混合字体的普通,粗体和斜体变体,否则会多次嵌入。

答案 2 :(得分:2)

显然,它是一份巨大的报告,实际上它比报告更接近1.3 GB的数据库。

你有没有想过找到一种方法将它分成多个部分,然后将它们组合在一起? (使用几种不同方法之一来组合本网站上列出的PDF。)