报表性能故障排除
新建日期: 2008 年 11 月 17 日
本主题介绍可以帮助改善报表性能的方法。
若要解决报表性能问题,请使用 Reporting Services 日志文件确定大部分时间花在哪个环节:检索数据、处理报表布局还是呈现报表。有关详细信息,请参阅报表故障排除。
确定大部分时间花在哪个环节之后,请使用以下部分来帮助解决特定问题。
改善数据的检索性能
改善报表的处理性能
改善报表的呈现性能
改善数据的检索性能
报表数据越多,使用的资源和存储空间就越多,造成的网络通信流量也越大,需要的处理时间也越多。为了帮助控制报表性能,请设计具有合理数据量和复杂性的报表。例如,很少有用户想要查看一个 1,000 页的报表。如果表的嵌套级别太多,用户在保持明细报表的上下文时会有难度;如果表包含的列太多,用户在扫描时可能有困难。有数百个切片的饼图看起来会比较混乱且难以阅读。请认真分析报表要求以确定需要多少数据,然后仅从报表数据源中检索这些数据。
以下各部分中的信息可有助于缩短检索报表数据所用的时间。
检索的数据多于所需的数据
与在处理报表期间筛选、排序和聚合大量数据相比,对数据源执行这些操作会更为有效。编写查询以便仅返回要在报表中显示的数据。如果打算仅显示摘要数据,请对数据源计算聚合,但不检索明细数据。以下列表建议评估报表中每个报表查询的方法:
- 编写带有 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 不是可传递函数。 - 考虑对数据源分析和优化查询性能。例如,若要了解 SQL Server 2005 的查询优化器,请参阅查询性能和单个 SQL 语句处理。
- 考虑图表所需的数据量。在折线图中,在监视器上以很小的像素绘制数百个点会降低性能,也不会增强图形的可视显示效果。如果饼图中的切片超过 7 或 8 个,则值可能有问题。
- 对于具有条件可见性的报表项,报表处理器必须应用分组表达式、排序表达式和筛选表达式,即使只有顶层数据首先可见也是如此。如果用户只希望不时查看详细信息数据,最好使用钻取报表。用户在主报表中单击钻取链接之前,不会运行钻取报表。明细报表或子报表将处理所有数据,即使些数据最初是隐藏的。有关详细信息,请参阅将链接添加到报表中。
- 考虑为报表创建执行快照。报表快照包含为报表定义中的数据集检索的所有报表数据。有关详细信息,请参阅报表快照。
大量网络通信流量导致等待时间更长
作为网络通信流量传递的大量数据会增加用户的等待时间。如果您了解预期的用户群和预期的报表视图容量,则可以选择相应的方法来部署报表服务器组件。
考虑以下策略以有助于缩短用户的等待时间:
- 将报表服务器数据库保存在报表服务器所在的计算机上。
报表服务器数据库 tempdb 管理为每个数据集查询检索的报表数据。将 tempdb 保存在报表服务器上可以减少网络通信流量,从而提高报表执行速度。 - 对于数据仓库数据源,将数据仓库保存到与报表服务器不同的服务器上。
尽管在网络中检索数据确实会增加额外的报表执行任务,但是由于数据仓库和 Reporting Services 争用内存,将它们放在同一台服务器上会降低性能。
有关详细信息,请参阅安排 Reporting Services 部署计划。
查询超时
如果数据集查询在检索数据之前超时,则可以在报表中指定一个超时值。默认情况下,此值设置为 30 秒。若要设置数据集查询的超时值,请参阅如何创建数据集(报表设计器)。有关详细信息,请参阅设置报表执行超时值。
改善报表的处理性能
为报表数据集和报表参数检索数据之后会执行报表处理。报表处理器将报表布局与数据组合在一起来创建临时报表格式,随后此格式会传递到报表呈现器。报表处理时间会受报表布局、分页和报表项中有多个实例的复杂表达式的影响。使用本部分可以帮助改善报表的处理性能。
选择正确的数据区域
如果可能,请使用表和列表数据区域。处理表或列表比处理矩阵更有效。表和列表数据区域仅支持行的动态元素;而矩阵布局则支持行和列的动态元素,会创建更复杂的布局结构。
避免在物理页呈现器的页眉和页脚中使用总页值
如果呈现报表的布局呈现扩展插件对物理页进行分页(例如 PDF 或图像),那么引用全局字段 TotalPages 会影响报表的处理性能。有关呈现器的详细信息,请参阅报表呈现设计注意事项。
使用复杂的数据区域分组和聚合函数
表或矩阵数据区域中嵌套组级别太多会影响报表的处理性能。请考虑分组级别、组实例数以及在应用分组、筛选和排序表达式之后需要评估的聚合函数的使用。
避免使用“**排序后”聚合。排序后聚合取决于排序顺序,并且包含以下函数:Previous、First、Last 和 RunningValue。如果表达式中包含一个或多个上述函数,则报表处理器在应用函数之前必须对目标数据进行排序。如果可能,请避免在具有复杂组定义(例如多个嵌套组或相邻组)的矩阵布局的表达式中包含排序后聚合。
评估报表设计,并考虑对数据源是否可以执行某些数据聚合。在不更改任何聚合函数调用的情况下,减少报表中的数据量可能足以提供可接受的性能。
有关聚合函数的详细信息,请参阅在表达式中使用报表函数 (Reporting Services)。
在表达式中指定不需要的递归
仅当定义递归层次结构(例如,显示经理和雇员的组织报表)时才指定组的父表达式。Parent 属性仅适用于递归数据。Parent 属性尤其不适用于嵌套组的父子关系。
在包含许多行的数据区域中使用子报表
了解使用子报表的优点和缺点。每个子报表实例都是一个单独的查询执行和一个单独的报表处理任务。
- 只有几个子报表实例时,可在数据区域中使用子报表。
- 当有许多组实例时,应避免在数据区域组中使用子报表。例如,若要显示每个客户的销售额和退货量列表,请考虑使用钻取报表。请考虑是否可以编写查询以便将客户数据与销售数据和退货数据联接起来,然后按客户 ID 进行分组。
- 如果子报表使用的数据源不是主报表,可使用子报表。如果存在性能问题,请考虑使用以下策略之一来更改主报表中的数据集查询:
- 收集数据仓库中的数据,并将数据仓库用作单个数据集的数据源。
- 使用 SQL Server 链接服务器,并编写从多个数据库检索数据的查询。
- 使用 OPEN ROWSET 功能指定不同的数据库。
使用交互式排序
除非用户要求能够更改报表中数据的排序顺序,否则请避免使用交互式排序按钮。
使用图像
了解图像的资源要求。
- 避免使用大图像,包括背景图像。大图像需要内存、处理和呈现资源,尤其是将这些大图像呈现到硬拷贝呈现器(例如 PDF、打印或文档图像)时。
- 避免使用数据库或服务器上的许多小图像实例,例如关键性能指标 (KPI)。应将这些图像作为嵌入图像包含在报表中。
- 对于具有许多图像的报表,请将图像的 AutoSize 设置为不同值,例如“Fit”。
报表服务器上争用同一内存的进程
在报表服务器上的多个应用程序争用同一内存资源会影响报表处理。
请与系统管理员联系,验证内存管理配置是否是用于报表服务器的正确模型。有关详细信息,请参阅为 Reporting Services 配置可用内存。
报表执行超时
若要运行大型报表,必须调整两个超时值:报表执行超时值和 ASP.NET 超时值。
报表执行超时值在报表服务器上指定。有关详细信息,请参阅设置报表执行超时值。
ASP.NET 超时值策略由报表服务器配置文件控制。此文件的默认位置为:<drive>:\Program Files\Microsoft SQL Server\MSSQL.n\Reporting Services\ReportServer\web.config。若要设置请求可以执行的最大秒数,请将 httpRuntime 元素设置为超时值(以秒为单位)。以下 XML 片段演示将此元素添加到配置文件中的什么位置:
<configuration>
. . .
<system.web>
. . .
<httpRuntime executionTimeout="90"/>
. . .
</system.web>
. . .
</configuration>
对于长时间运行的查询或复杂报表,可能需要指定一个表示几个小时的值。
改善报表的呈现性能
将数据和布局组合并传递到呈现扩展插件之后,将执行报表呈现。呈现时间取决于数据量、报表项的实例数和页大小。报表呈现器确定一页容纳多少数据。页的定义在不同的呈现器中是不同的。Excel 呈现器的页是工作表。PDF 呈现器(可以打印报表)的页是物理页。HTML 查看器的页可以是整个报表。打印页的报表设计与用于联机查看的报表设计有所不同。如果期望用户以特定格式查看报表,请针对该格式来设计报表。有关详细信息,请参阅报表呈现设计注意事项。
下表提供的建议有助于改善报表的呈现性能。
呈现格式 | 说明 |
---|---|
全部 |
|
Excel |
|
HTML |
|
图像 TIFF 打印 |
|
如果以一种格式呈现报表时遇到麻烦,请选择可产生更小文件的格式,例如 CSV。对于已发布的报表,可以在 URL 中指定呈现格式。有关详细信息,请参阅Specifying a Rendering Format in a URL。
如果由于报表工具栏不可用而无法选择其他格式,可以定义一个订阅来设置呈现格式,将报表作为静态文档传递到文件共享位置。有关详细信息,请参阅 Reporting Services 中的文件共享传递。
请参阅
概念
Reporting Services 日志文件
处理大型报表
其他资源
Reporting Services 故障排除
Reporting Services 错误和事件
报表故障排除