报表故障排除:报表性能
查看报表时,可能需要等待很长时间才能看到第一页。若要帮助确定需要报表处理时间的位置,请参阅报表问题的故障排除技术。确定延迟时间是处于数据检索、报表处理还是报表呈现阶段之后,可使用本主题来帮助解决问题。
数据检索时间太长
报表处理时间太长
报表呈现时间太长
优化报表处理的设计技巧
数据检索时间太长。
报表数据越多就需要使用更多资源、更大的网络通信流量、较长的处理时间以及更大的存储空间。分析报表中出现的问题以确定需要的数据量,然后从报表数据源中仅检索该数据。
为报表检索的数据比所需的数据多
筛选、排序和聚合对数据源比在报表处理期间更为有效。编写查询以仅返回在报表中显示的详细信息级别。以下列表建议评估报表中每个报表查询的方法:
编写带有 WHERE 子句或 HAVING 子句的查询,这些子句将数据限制为用户必须在报表中看到的内容。使用查询参数以限制在运行时检索的数据。查询参数会自动绑定到相应的报表参数,使用户能够确定对哪些数据感兴趣。有关详细信息,请参阅使用 WHERE 和 HAVING 筛选行。
创建的快照报表具有筛选数据的报表参数时,可在报表中显示的所有可能数据都必须保存在快照中。在这种情况下,请勿在数据集查询中使用查询参数。相反,请手动创建可在筛选表达式中使用的报表参数,使用户能够指定所需的报表数据。
编写带有 ORDER BY 子句的查询对为报表检索的数据进行预排序。按希望数据在报表中排序的顺序对其进行排序。由于预排序的数据在内存中的存储方式,因此节省了报表处理时间。许多报表处理任务在处理数据之前不需要进行排序。例如,SUM 与顺序无关。不会对组实例中的数据自动进行排序。如果报表中不需要经过排序的数据,则不必对数据集或数据区域设置排序表达式。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL) 和对报表中的数据进行排序。
对组进行排序或按聚合值进行排序在报表中比在查询中更为简单,通常也更为有效。
编写带有 GROUP BY 的查询以聚合数据源中的值。
在许多情况下,传递信息最有效的方法是聚合值和显示摘要。可以对数据源计算某些级别的聚合并为数据集检索这些聚合。数据集中的“详细信息”数据现在表示对数据源计算的聚合。有关详细信息,请参阅汇总查询结果 (Visual Database Tools)。
这些预聚合值存在于报表中后,只要您使用可算术传递的聚合函数(例如 SUM),就可以继续聚合这些值。例如,假设有一组值(6 个):1、2、3、4、5、6。如果将这些值按对进行组合,则有一组值(3 个):3、7、11。可以计算第一组的总和 (21),然后计算第二组的总和 (21),无论如何分组,总和都相同。如果使用 AVG 函数计算组中这些值的平均值,则每组会得到不同的结果。6 个值一组的平均值是 21/6 或 3.5。3 个值一组的平均值是 21/3 或 7。AVG 不是可传递函数。
考虑图表或仪表所需的数据量。在监视器上以很小的像素绘制数百个点会降低性能,也不会增强图形的可视显示效果。如果饼图中的切片超过 7 或 8 个,则值可能有问题。有关详细信息,请参阅准备要在图表数据区域中显示的数据。
对于具有条件可见性的报表项,报表处理器必须应用分组表达式、排序表达式和筛选表达式,即使只有顶层数据首先可见也是如此。尽管 SQL Server 2008 Reporting Services 中的按需处理能够通过仅处理可见的数据来优化数据评估,但是所有可能的数据都是报表的一部分。如果用户只希望不时查看详细信息数据,最好使用钻取报表。有关详细信息,请参阅报表类型。
考虑为报表创建执行快照。报表快照包含为报表定义中的数据集检索的所有报表数据。有关详细信息,请参阅创建、修改和删除报表历史记录中的快照。
查询超时
查询超时值是定义数据集时创作报表过程指定的。超时值随报表一起存储在查询的 Timeout 元素中。默认情况下,此值设置为 30 秒。有关详细信息,请参阅设置报表处理超时值。
若要设置数据集查询的超时值,请参阅ms160345(v=sql.100).md。
大量网络通信流量导致用户的等待时间
作为网络通信流量传递的大量数据会增加用户的等待时间。根据预期的用户群和预期的报表视图容量,您可以选择部署报表服务器组件的相应方法。有关详细信息,请参阅规划部署拓扑。
例如,以下策略可能有助于缩短用户的等待时间:
将报表服务器目录保存在报表服务器所在的计算机上。
报表服务器数据库 tempdb 管理为报表定义中每个数据集查询检索的报表数据。将报表数据与报表处理器保存在一起会减少可降低报表执行速度的网络通信流量。
对于数据仓库数据源,将数据仓库保存到与报表服务器不同的服务器上。
尽管在网络中检索数据确实会增加额外的报表执行任务,但是将争用内存的数据仓库和 Reporting ServicesServices 放在同一台服务器上会降低性能。
报表处理时间太长。
为报表数据集检索数据之后将执行报表处理,此时报表处理器将报表布局与数据组合在一起来创建临时报表格式,随后此格式会传递到报表呈现器。通常,报表处理器仅将用户查看的当前页的数据和布局组合在一起。报表处理时间会受报表布局、分页和报表区域中有多个实例的复杂表达式的影响。
使用本部分可以帮助改善报表的处理性能。
页眉或页脚中的表达式强制处理所有页面
如果包含对内置字段 [&TotalPages] 的引用,报表处理器必须先对整个报表进行分页,然后才能呈现第一页。如果不存在对 [&TotalPages] 的引用,则会立即向用户呈现并返回第一页,而不处理报表的其余部分。此外,报表处理器假设页眉或页脚中的任何复杂表达式可能包含对 [&TotalPages] 的直接或间接引用。
为了避免使报表处理器对较长的报表进行分页,请勿在页眉和页脚中包含对 [&TotalPages] 的引用或任何复杂表达式。
报表中无分页符
当用户在报表中翻页时,报表处理器会将每个报表页的数据和报表布局信息组合在一起,并将该页传递给报表呈现器。对于没有分页符的报表,必须先处理整个报表,用户才能查看第一页。
软分页呈现器(如 HTML 查看器)会自动为您处理分页。可通过将报表属性 InteractiveHeight 设置为 0,来覆盖此自动行为并将报表设置为一页。对于硬分页呈现器,必须手动添加分页符。有关呈现器类型的详细信息,请参阅了解呈现行为。
验证 InteractiveHeight 不为 0,并将其设置为某个合理的页面大小,例如 8.5 in。向报表项或 Tablix 组添加分页符将报表分为多页。这样可减少每页必须处理的数据量。有关详细信息,请参阅如何添加分页符 (Reporting Services)。
复杂的 Tablix 数据区域分组和聚合函数
Tablix 数据区域中嵌套组和相邻组的许多级别都会影响报表处理性能。请考虑分组级别、组实例数以及在应用分组、筛选和排序表达式之后需要评估的聚合函数的使用。例如,Previous 是一个“高开销”聚合函数,原因是其值取决于数据区域的已排序元素;Sum 则与顺序无关且需要的资源更少。其他排序后聚合包含 First 和 Last。有关详细信息,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services)。
评估报表的报表设计,并考虑对数据源是否可以执行某些数据聚合。在不更改任何聚合函数调用的情况下,减少报表中的数据量可能足以提供可接受的性能。
Tablix 数据区域中过多子报表实例会降低报表性能
了解使用子报表的优点和缺点。每个子报表实例都是一个单独的查询执行和一个单独的报表处理任务。
只有几个子报表实例时,可以使用子报表。
如果有多个组实例,请勿在组中使用子报表。例如,若要显示每个客户的销售额和退货量列表,请考虑使用钻取报表。考虑是否可以编写查询,以便将客户与销售额和退货量联系起来,然后按客户 ID 进行分组。
如果子报表使用的数据源不是主报表,可使用子报表。如果存在性能问题,请考虑使用以下缓解策略之一来更改主报表中的数据集查询:
收集数据仓库中的数据,并将数据仓库用作单个数据集的数据源。
使用 SQL Server 链接服务器,并编写从多个数据库检索数据的查询。
使用 OPEN ROWSET 功能指定不同的数据库。
报表服务器上争用同一内存的进程
报表服务器上争用同一内存资源的多个应用程序会影响报表处理。
请与系统管理员联系,验证内存管理配置是否是用于报表服务器的正确模型。有关详细信息,请参阅为报表服务器应用程序配置可用内存。
报表执行超时
若要运行大型报表,必须调整两个超时值:报表执行超时值和 ASP.NET 超时值。
报表执行超时值在报表服务器上指定。有关详细信息,请参阅设置报表处理超时值。
ASP.NET 超时值策略由报表服务器配置文件控制。此文件的默认位置为:<驱动器>:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\ReportServer\web.config。若要设置请求可以执行的最大秒数,请向此文件中添加 httpRuntime 元素:
<configuration>
. . .
<system.web.
. . .
<httpRuntime executionTimeout="90"/>
. . .
</system.web.
. . .
</configuration>
此值可能需要表示几个小时,具体取决于报表的大小。
报表呈现时间太长。
将数据和布局组合成临时格式,然后将该格式传递给呈现扩展插件之后,才进行报表呈现。呈现时间受数据量、报表项的实例数和分页的影响。导出报表时,您是将临时格式传递给特定的呈现器。如果您知道用户以特定格式查看报表,则必须为该呈现器优化报表。有关详细信息,请参阅导出报表和了解呈现行为。
使用本部分可以帮助改善报表的呈现性能。
未针对所选的呈现格式优化报表
某些功能仅在某些呈现器中受支持。如果查看报表的主要格式是一种特殊文件格式,则可能必须修改报表设计以优化用户的查看体验。
在有意义的位置添加分页符。例如,每个分页符在 Excel 中定义一个新的工作表。每个工作表最多可以容纳 65000 行。在报表中设置分页符时,请考虑这些限制。
若要导出到 Excel,请勿合并 Tablix 数据区域中的单元。在自由格式的报表中,垂直对齐报表项。合并后的单元和未对齐的报表项会影响已导出报表中的 Excel 功能。
HTML 分析器在呈现非常大的 HTML 页时效率很低。如果在呈现报表时遇到麻烦,请选择可产生更小文件的格式(例如,CSV)。如果由于报表工具栏不可用而无法选择其他格式,可以定义一个订阅来设置呈现格式,将报表作为静态文档传递到文件共享位置。有关详细信息,请参阅 Reporting Services 中的文件共享传递。
优化报表处理的设计技巧
如果报表性能是您最关心的问题,请使用以下信息来帮助优化处理报表所需的时间:
对于有许多文本框实例的报表,请将文本框中的 CanGrow 和 CanShrink 设置为 FALSE。默认情况下,Tablix 数据区域中的每个单元都包含文本框,这样必须呈现的文本框总数就会快速增长。
对于有许多图像的报表,请将图像的 AutoSize 设置为不同值,如 Fit。
对于文本框,请避免将 TextAlign 属性设置为 General。此值需要根据文本框内容进行条件处理。
不必要时,请避免水平分页符。查看报表中的边距、列宽和空格。例如,将报表呈现为 .TIFF 文件,并在 Microsoft Windows 图片和传真查看器中查看该文件,以确定是否呈现额外页。
仅当必须控制 Tablix 数据区域的特定呈现行为时,才对 Tablix 成员设置 KeepTogether 属性。计算分页符时,KeepTogether 功能要求进行额外处理。