防止报告服务器等待获取服务器上的所有数据以显示报告

Prevent Reporting Server from waiting for fetching all data at server to show report

我有一个 return 大容量记录的存储过程。因此,在显示 reporting service 中的记录时,它会等到所有数据都已获取然后显示它们。

我想知道是否有任何方法可以显示当前获取的记录和其他记录附加到页面并准备显示,以便用户可以立即看到报告。

编辑: 我搜索 reporting service 并找到 快照功能 。虽然这有助于报告的性能,但它是典型的离线。

有趣的是,这个问题以前没有出现在 Crystal 报告 6 或更早的版本上。 同样在 Sql Server 2000 执行存储过程时,它会立即显示结果,但在 new Sql Server 2005 和 upper 结果在全部获取之前不会显示!

简短的回答是否定的。 SSRS 数据集不支持读取调用或结果集的部分检索。他们在初始化报告呈现之前调用执行并检索完整的结果集。生成大型报告时,通常不建议按需 运行 它们,除非它们支持分页。但是分页只会限制SSRS服务和浏览器之间发送的数据,而不是SSRS服务和数据库之间发送的数据。在开始呈现第一页之前,SSRS 仍将等待整个数据集获取 SP returned。

最简单的解决方案是将数据集拆分成多个部分,将参数添加到获取 SP 以 return 更小的数据集。或者您可以尝试将页码传递给 SP 并在每一页上使用子报告。

This article is worth a read.

这里有 4 个可用于大型报告的基本策略

  1. Use pagination。服务器将一次一页地向浏览器发送报告。此选项仅在您在浏览器或报表查看器中呈现时才有效。例如,如果您按需下载 excel 文件,这将不起作用,这需要在将文件发送到客户端之前完成所有查询。
  2. Configure a subscription 定期通过电子邮件或共享文件夹分发报告。
  3. Configure report snapshots
  4. 使用 sub reports 将大型查询分成多个较小的部分 (不推荐)

您可能想要了解的报告服务的其他功能。

  1. Shared dataset cache
  2. Cache a report

更新:

分页可以通过添加page breaks or grouping in a table来设置。这将使 SSRS 能够 return 第一页到浏览器,而其他页面仍在呈现。但是应该注意,分页不会影响您的数据库和 SSRS 服务器之间的调用。如果您有一个大型查询,则在该结果集从数据库中完全加载之前,不会开始呈现第一页。

子报告 允许您return 查询报告中的每个页面。例如,如果您有一个查询 returns 100 行并且您只想显示 20 行。使用要显示的 RANK() OVER to group your results in to groups of 20,then return the group numbers, these will be your page numbers. Set this as the main query for the report and format your pagination to create one page per page number returned from the main query. Then create a sub query sp that accepts your page number and number of rows,从主查询中传递该页码。子查询将 return 您要在该页面上显示的 20 条记录。

为什么不推荐子报表分页? 不推荐使用这样的子查询,因为它很难更新或维护,加上所有额外的查询、分组和 SQL 中的 table 聚合,效率会低得多,也许甚至比您的原始查询花费更长的时间。对于大型查询,建议使用订阅、缓存或快照。