将记录选择下推到数据库服务器

提高报表处理速度最为重要的做法是限制从数据库返回的数据量。实现这种做法的主要工具是记录选择公式。

Crystal Reports 提供的用于 SQL 数据源的驱动程序允许将记录选择“下推到”数据库服务器。在基于 SQL 数据源的报表中指定记录选择公式时,Crystal Reports 分析该公式,从该公式生成 SQL 查询,并将 SQL 查询传递到数据库服务器。然后分两个阶段执行记录选择:

  • 记录选择的第一个阶段是数据库服务器处理 SQL 查询,然后将一组记录返回 Crystal Reports 时
  • 在第二个阶段,针对从数据库服务器返回的记录集,Crystal Reports 在本地进一步对记录选择公式进行求值。

因为数据库服务器通常比工作站快,所以在第一阶段指定可以由服务器处理的记录选择公式比较有利。这样做将会最大限度地降低第二阶段在本地计算机上执行的记录选择。下列类型的记录选择可以下推到服务器:

  • 索引和非索引字段上的选定(索引字段响应较快)。
  • 带有 AND 和 OR 子句的 SQL 查询。
  • 为记录选择执行公式计算的 SQL 表达式字段。(有关 SQL 服务器所支持的 SQL 表达式的类型,请参见随服务器提供的文档)。

将记录选择下推

本示例展示编写可以下推到数据库服务器的记录选择公式的好处。

在 Xtreme 示例数据库的“订单”表中共有 2,192 条记录,其中 181 条的订单日期早于 2001 年。假定您只需要报告这些记录。一方面,可以使用下面的记录选择公式:

Year ({Orders.Order Date}) < 2001

所生成的 SQL 查询将 2,192 条记录全部发送到 Crystal Reports,然后记录选择公式将此记录数减少到 181 条。若要查看这一过程,请单击“数据库”菜单上的“显示 SQL 查询”,您会注意到 SQL 查询中没有 WHERE 子句。这是因为 Crystal Reports 无法下推 WHERE 子句中的 Year ( ) 函数。

另一方面,下面的记录选择公式生成相同的报表:

{Orders.Order Date} < #Jan 1, 2001#

上面的第二条公式可在数据库服务器上执行,因此可以下推。所生成的 SQL 查询仅将 181 条记录发送到 Crystal Reports。因此,在由 Crystal Reports 对记录选择公式求值时,无须进一步消除记录。单击“数据库”菜单上的“显示 SQL 查询”,您会注意到所生成的 SQL 查询中有 WHERE 子句。

如本示例所示,在改进记录选择公式后,报表的处理速度提高了。在本例中,两个公式生成相同的报表,但第二个公式利用了数据库服务器在处理其数据时可以使用的功能和优化。

记录选择性能提示

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

常规

  • 若要下推记录选择,必须选择“报表选项”对话框中的“为提高速度而使用索引或服务器”(打开该对话框的方法是:在嵌入式 Crystal Reports 设计器中右击,指向“报表”,然后选择“报表选项”)。

  • 在记录选择公式中,避免在非参数字段的字段上进行数据类型转换。

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

  • 能够下推一些使用常量表达式的记录选择公式。

SQL 数据库

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