水晶报表系列文章--优化策略笔记

水晶报表系列文章--优化策略笔记

设计优化的 Web 报表

Crystal Reports 本身的性能优点:

  • 按需分配页技术

按需分配页的报表访问允许用户只下载需要查看的特定报表页,从而缩短了响应时间,减少了 Web 流量。不仅如此,占位符和部分页技术还使您无须等待图形和子报表等大对象的处理,就能立即查看 Web 上的报表页和数据。

  • 优化的多线程报表引擎

Crystal Report 引擎的多线程能力及线程安全数据库驱动程序使您能够在许多其他操作在后台进行的同时,继续执行您自己的重要任务。此外,报表引擎减少了数据传递次数,通过改善的内存管理来加快处理速度,尽可能高效处理子报表和参数。

 

优化 Web 报表的关键策略

通过 BusinessObjects Enterprise 缩放。

计划

BusinessObjects Enterprise 包含一个灵活的基于时间和事件的调度系统,使您可以在工余时间处理大的报表,从而避免不必要的数据库访问。(Report Application Server 提供按需制表功能,每个查看请求都会产生一个单独的数据库查询)。

版本管理

版本管理和调度功能紧密配合,共同实现报表实例的存储。版本管理不仅可以降低为服务用户而造访数据库的次数,而且可以保留报表实例的档案作为历史参考。

集群

BusinessObjects Enterprise 整合了成熟的集群和负载平衡技术,可帮助您实现一个高度易用、性能可靠的信息传送系统。

可伸缩性

BusinessObjects Enterprise 建立在分布式多服务器结构的基础上,可使您通过单机扩容(添加处理器)或多机扩展来处理较重的用户负载。

管理

BusinessObjects Enterprise 包含大量的管理控件,可用来组织内容,设置复杂的调度和安全性,并调节系统达到最佳性能。

外部(第三方)身份验证

BusinessObjects Enterprise 允许您利用现有安全系统来管理用户和组。所有身份验证工作都可委托给第三方 NT 或 LDAP 系统。

BusinessObjects Enterprise 中日期函数的求值时间

Crystal Reports 中可用的不同日期和时间函数是在报表处理的不同阶段求值的。某些函数是在处理预定的报表或刷新报表实例时求值的:该求值时间称为“WhileReadingRecords”。其他函数是在每次格式化报表页以在报表查看器或浏览器中显示时求值的:该求值时间称为“WhilePrintingRecords”。

如果使用 BusinessObjects Enterprise 生成报表实例,并且注意到所求出的日期或时间函数值不是预期值,请考虑以下因素:

  • 当前日期和时间始终是从报表引擎可以在本地访问的时钟(即处理报表的计算机上的时钟)中读取的。在 BusinessObjects Enterprise 中,“作业服务器”依据数据库处理预定报表,而“页面服务器”依据数据库处理按需要显示的报表。Page Server 还在用户查看报表实例的个别页面时对页面进行格式化。
  • 在处理预定报表时,Job Server 将对所有日期和时间公式进行求值,以便生成报表实例。如果只是查看生成的报表实例,则不会对任何公式重新求值。
  • 当您查看缓存的报表页时,不会对任何日期函数重新求值,原因是记录已被读取并且页面已被格式化。
  • 如果在报表的选定公式中使用日期和/或时间函数,则报表数据依赖于这些公式的返回值。因此,在以后某个日期查看报表实例时,函数可能会导致系统依据数据库对报表数据进行更新。
  • 若要确保日期和时间函数返回预期的值,可以通过使用 WhileReadingRecords 和 WhilePrintingRecords 函数来强制确定求值时间。

 

作出正确的设计选择

在设计报表,尤其是设计用于 Web 的报表时,应该允许报表用户操纵其所查看的数据。即,显示汇总信息,以便每个用户可以快速地浏览报表,然后深化以访问其他数据。采用此方法,由于仅从数据库服务器传输用户所请求的数据,所以最大限度地降低了 Web 流量并缩短了响应时间。

下面只是设计用户驱动报表的几点优势:

  • 报表用户可以对其在 Web 上查看的信息类型和数量进行交互控制。
  • 因为只从数据库服务器返回用户所请求的信息,所以数据传输和网络流量减少。
  • 当用户需要通过 Web 根据实时数据制作报表时,面向用户的报表响应迅速,并能有效地与数据库服务器通讯。
  • 报表变得更有用,原因在于每个用户均可自定义报表的内容,从而创建针对其特定决策问题的报表解决方案。

使用更快的报表格式

要提高在 Crystal Reports 旧版本中创建的报表的性能,最快速的方法是将其以最新的 Crystal Reports 格式保存。Crystal Reports 在经过改进后,已能较以往更快地处理报表:更新旧报表可利用这些改进功能。

若要更新旧报表的格式,只需用 Crystal Reports 将其打开,然后从“文件”菜单中选择“保存”。旧版本的报表将被替换为版本 11 的报表。

 

在实时数据和已保存数据之间选择

设计汇总报表

设计和分发摘要报表是确保用户可以在 Web 上快速查找所需数据的一种相对简便的方法。摘要报表可以包含的数据与其他任何报表一样多。但是,通过隐藏汇总报表的“详细资料”节,可以避免用户陷入他们可能并不直接需要的数据中。

Crystal Reports 中打开报表。

如果尚未创建分组及汇总的报表,则从“Feature Examples”样本文件夹中打开“Group.rpt”。

“报表”菜单上,单击“节专家”打开“节专家”。

“节”列表中,单击“详细资料”

“节专家”的“公用”选项卡上,选中“隐藏(深化完成)”复选框。

单击“确定”

慎用子报表

利用按需分配子报表

如果报表有处理大量记录的节,则可以将该节放入按需分配子报表中。按需分配子报表在主报表中以超级链接的形式出现。在打开主报表时,不会检索按需分配子报表的任何数据,直到深化相应的超级链接为止。

 

使用链接子报表

当链接子报表时,Crystal Reports 会根据主报表中的匹配记录协调子报表中的数据。

 

链接表而不是链接子报表

只要可能,就应采用以下方法协调报表数据:将数据库专家链接选项卡上的数据库表链接到主报表,而不是将常规子报表(即非按需分配子报表)链接到主报表。因为每个子报表都是作为单独的报表运行,所以链接的表常常有性能优势

 

有效地使用其他设计元素

映射

映射呈现是一种单线程操作,它的缩放性能并不好。尽管支持映射,但您仍然需要仔细考虑报表中的映射将对性能产生的总体影响。

报表模板

如果将对多个报表应用同一模板,最好将报表模板打开一次,然后将其保存在缓存中,这是因为模板只需要为只读。

包括“第 N 页,共 M 页”或“总页数”

如果在报表中包括特殊字段“第 N 页,共 M 页”或“总页数”,则报表需要先完成处理,然后才能计算此值。除非报表非常小或者的确需要此值,否则,请避免使用这些特殊字段。

设计报表以最大程度地利用数据共享

BusinessObjects Enterprise 具有数据共享功能,通过减少具有多个用户的系统中进行的数据库调用次数来提高性能。

只有在满足某些条件时,才能在报表对象的用户之间共享数据。在不损害用户的报表信息需求的情况下,尝试通过设计尽可能满足数据共享条件的报表来最大程度地利用数据共享。

如果报表由页面服务器处理,则在满足以下条件时将会在报表用户之间共享数据:

  • 用户使用相同数据库登录信息查看报表时。
  • 用户使用相同参数查看报表时。
  • 用户使用相同页面布局选项查看报表时。
  • 用户使用相同区域设置查看报表时。

使用 DHTML 查看器、ActiveX 查看器或 Java 查看器查看的报表是使用页面服务器处理的。这些查看器不允许用户更改报表的页面布局或区域设置。但是,可以开发提供此功能的自定义查看器应用程序。

如果报表由报表应用程序服务器 (RAS) 处理,则在满足以下条件时将会在报表用户之间共享数据:

  • 用户使用相同数据库登录信息查看报表时。
  • 用户使用相同参数查看报表时。
  • 用户使用相同区域设置查看报表时。
  • 用户不修改报表时。

使用高级 DHTML 查看器(或允许查看或修改报表的自定义应用程序)查看的报表是使用报表应用程序服务器处理的。

 

优化您的制表环境

选择最快的数据库和连接

若要提高制表性能,应充分利用数据库进行大部分报表处理工作。理想情况下,结构化查询语言 (SQL) 数据库是执行这类任务最有效的数据库。

使用表索引

要使处理速度达到最快,可基于 SQL 数据库中带索引的字段创建报表。使用表索引很容易提高数据的访问速度,减少 Crystal Reports 计算数据所花的时间。

改进表链接选择

1.      确保每个数据库表在要使用的字段上编制了索引。

2.       将数据库表添加到您的报表,然后在公用字段上链接主表和查阅表,而不要插入链接子报表再将其绑定到主报表的数据。

3.       在主表中,使用对索引字段设置了范围限制的记录选定公式。这样可以减少 Crystal Reports 必须在查阅表中找到的与主表中记录相匹配的记录的数目。

使用线程安全数据库驱动程序

使用存储过程进行更快的处理

使用增强的记录选定公式

下推记录选定

Year ({订单.订单日期}) < 2001 返回所有DB记录;{订单.订单日期} < #Jan 1, 2001# 只返回所需记录

记录选定性能提示

在设置记录选定请求时,请考虑下列与性能相关的项目:

常规
  • 要下推记录选定,必须在“报表选项”对话框(从“文件”菜单打开)中选中“为提高速度而使用索引或服务器”。
  • 在记录选定公式中,避免在非参数字段的字段上进行数据类型转换。

例如,避免使用 ToText( ) 将某数值数据库字段转换为字符串数据库字段。

  • 能够下推一些使用常量表达式的记录选定公式。
PC 数据库
  • 只能下推编有索引的字段上的记录选定。
  • 只能下推 AND 子句(非 OR)。
SQL 数据库
  • 能够下推索引字段或非索引字段上的记录选定。
  • 如果使用索引字段,SQL 服务器响应速度将加快。
  • 能够下推 AND 和 OR 子句。
  • 可以下推包含某些类型的嵌入公式的记录选定公式。
  • 应该合并 SQL 表达式字段以下推进行记录选定所需的公式计算。
  • “数据库”菜单上单击“显示 SQL 查询”,以查看将要发送到数据库服务器的 SQL。

编写高效记录选定公式的策略

考虑 1

任何完全用“选择专家”生成、而不是自己编写的记录选定公式,都可以下推。

考虑 2

任何具有 DataBaseField SupportedOperator ConstantOrParameterExpression 形式的选定公式均可下推。

当然,DataBaseField 只是一个数据库字段。SupportedOperator 是 =、<>、<、<=、>、>=、StartsWith、Like 或 In 之中的任何一个。

ConstantOrParameterExpression 是涉及常量值、运算符、函数和参数字段的任何表达式。它不能包含变量、控制结构或参数字段以外的字段。根据其本身定义,常量表达式和参数表达式可以无须访问数据库而求得。

注意:    常量或参数表达式的求值结果可以是简单值、区域值、数组值或一个区域值数组。这类表达式的举例如下:

{?number parameter} - 3

Year ({?run date})

CurrentDate + 5

DateDiff ("q", CurrentDate, CDate("Jan 1, 1996"))

Month (Maximum ({?date range parameter}) + 15)

["Canada", "Mexico", "USA", {?enter a country}]

1000 To 5000

[5000 To 10000, 20000 To 30000, 50000 To 60000]

一个完整的示例:

{订单.订单日期} >= CurrentDate - 3

该程序还可下推只包含布尔字段(不包含运算符和常量部分)的表达式。

{订单.已发货}

Not {订单.已发货}

考虑 3

IsNull (DataBaseField) 可以下推。

考虑 4

SqlExpression SupportedOperator ConstantOrParameterExpression 可以下推。例如,如果 {@ExtendedPrice} = (Quantity * Price),则选定公式 {@ExtendedPrice} > 1000 不能下推。但是,如果用等价的 SQL 表达式代替 @ExtendedPrice,则该选定公式可以下推。

考虑 5

当使用遵循上述考虑因素编写的多个表达式时,将其用 AND 和 OR 分开,也可以使用 NOT。每种表达式可以有多个,并用括号确定优先级。例如:

{Orders.Order ID} < Minimum({?number range}) Or

{订单.订单金额} >= 1000

(IsNull({客户.地区}) Or

{客户.地区} = "BC") And

{客户.去年销售额} > 2000

 

将参数字段合并到记录选定公式中

不要在每次打开报表时均显示报表的所有数据,可以创建参数字段提示用户指定希望查看的数据。为了减少从数据库服务器传输的数据量,请将这些参数字段直接合并到记录选定公式中。

一般情况下,参数字段为用户提供交互性,用户响应参数提示以指定希望查看的数据。但是,通过将参数字段直接合并到记录选定公式中,将不仅提供交互性,而且减少了数据传输并改善了性能。

可以通过“选择专家”或“记录选定公式工作室”向记录选定公式添加参数字段。当使用“记录选定公式工作室”时,可将参数字段和其他任何字段一样对待。

 

适时使用 SQL 表达式

为了维持最佳的报表处理速度,请避免在记录选定公式中使用公式(不管是 Crystal 语法还是 Basic 语法)。而应该用等效的 SQL 表达式字段替换原公式,然后将 SQL 表达式字段合并到记录选定公式中。这样做将大大提高您的记录选定被下推到服务器的机会。

另外,应避免对公式字段进行排序、分组或总计(不管是 Crystal 语法还是 Basic 语法)。而应该用等效的 SQL 表达式字段替换原公式字段,然后在 SQL 表达式字段上进行排序、分组或总计。这样做也将大大提高在服务器上执行处理的机会。

最后,如果数据库支持 Case 逻辑,并且报表需要摘要 If-Then-Else 公式计算,请用 SQL 表达式字段替换该公式。

改进分组、排序和总计

在服务器上执行分组

当通过 Web 从活动数据中进行实时制表时,使用选项“在服务器上执行分组”可减少从数据库服务器传输的数据量。使用此选项后,大部分数据处理工作都卸载到数据库服务器,并且开始时仅读入一个数据子集。仅当您在报表中进行深化时才从数据库返回详细数据。

注意:    服务器端处理仅适用于那些基于 SQL 数据源的经过排序和分组的报表。

启用服务器端处理
  1. “文件”菜单中,单击“报表选项”
  1. 选择“报表选项”对话框中的“在服务器上执行分组”

如果没有选择“为提高速度而使用索引或服务器”,则该复选框是不活动的。

提示:    当选中“为提高速度而使用索引或服务器”后,您可以迅速从“数据库”菜单启用“在服务器上执行分组”。

  1. 单击“确定”

SQL 表达式用于分组、排序和总计

SQL 表达式用于 Case 逻辑

如果数据库支持 Case 逻辑,并且报表需要对 If-Then-Else 公式计算进行汇总,请用 SQL 表达式字段替换该公式。在此类情况下,SQL 表达式字段使 Crystal Reports 可以在服务器上执行报表的分组。

例如,假设您正在从支持 Case 逻辑的 MS SQL Server 7 数据库中制作报表。您需要在报表中包含一个 If-Then-Else 计算,并且对报表中每个组的计算进行汇总。通过使用如下形式的 SQL 表达式字段执行计算,您就利用了数据库的能力来处理 Case 逻辑:

CASE DatabaseTable."DatabaseField"

WHEN 'SpecifiedValue' THEN Calculation1

ELSE Calculation2

END

如果记录的 DatabaseField 值等于 SpecifiedValue 值,则执行 Calculation1;对于所有其他记录则执行 Calculation2。通过包含 SQL 表达式字段,您利用了数据库服务器的能力来处理 Case 逻辑。甚至当您在报表的其他地方对该 SQL 表达式字段进行汇总时,报表的分组也将随之在服务器上进行。

在可能的位置插入汇总和运行总计字段

可能的情况下,应避免创建包含全局变量的公式来计算汇总或运行总计。

相反,应通过单击“插入”菜单然后选择相应的命令(小计、总计和汇总)来创建汇总。通过打开“字段资源管理器”,右击“运行总计字段”,然后从快捷菜单中选择“新建”来创建运行总计字段。

 

 

 

你可能感兴趣的:(水晶报表系列文章--优化策略笔记)