嗨,我有一个任务来改善加载和运行 CR 所需的时间。 它超过 30 分钟。它与 DB2 服务器背道而驰,所有处理都在 Crystal 中完成。所以我的第一个想法是在服务器上制作一个视图,然后它会更快。但是,该报告有一个开始和日期。
那么,我将需要一个存储过程。 但这意味着,我需要将日期从 CR 传递到服务器上的 SP。
我还没有看到这样做,但也许有技术可以做到这一点?如果没有,我会尝试一个视图,但其中一些表上有大量数据。
处理推送到主机,您将获得最佳性能。
首先,尝试在主机上使用没有 WHERE 子句的 SQL 视图。 在引用 Crystal Reports 中的视图的 SQL 查询中,添加 WHERE 和 ORDER BY 子句。 系统会将您的客户端 SQL 与主机视图中的 SQL 合并,并提供合并 SQL 的净效果。我认为您不需要存储过程,使用视图更容易、更灵活。
我曾经使用过下面的技术来从复杂的SQL视图中挤出一些额外的性能,但它有点复杂,因此如果上面的技术在优化工作后没有产生所需的性能,我不会使用它。
另一种方法是使用 SQL 视图,方法是使用 TABLE 用户定义的函数将报表参数提供给视图,其中 TABLE 函数从临时表中获取参数。
例:
declare global temporary table SESSION.MY_PARMS (FROM_DATE, TO_DATE) as (
values ( CURRENT_DATE - 30 days, CURRENT_DATE )
) with data with replace
;
create or replace function MY_SCHEMA.MY_PARMS_UDF( )
returns table ( FROM_DATE date, TO_DATE date )
language sql
specific MY_SCHEMA.MY_PARMS_F
not deterministic
disallow parallel
no external action
reads SQL data
called on null input
not fenced
set option dbgview = *source
,commit = *nc
,closqlcsr = *endmod
,datfmt = *iso
,dftrdbcol = *none
,tgtrls = V7R1M0
return
select FROM_DATE, TO_DATE from SESSION.MY_PARMS
;
create or replace view MY_SCHEMA.MY_REPORT_VIEW for system name MY_REPORTV as (
select *
from table( MY_PARMS_UDF( ) )
as MY_PARMS ( FROM_DATE, TO_DATE )
inner join MY_REPORT_DATA R
on R.MY_REPORT_DATE >= MY_PARMS.FROM_DATE
and R.MY_REPORT_DATE <= MY_PARMS.TO_DATE
)
;
在水晶报表中,您需要创建参数表 SESSION。每个作业MY_PARMS(或者,如果您已在报表作业中创建它并且更喜欢更新,则使用 UPDATE 刷新其内容)。自2002年以来,我就没有使用过Crystal Reports,所以我无法有效地帮助完成这一部分。
然后,在 Crystal 报表中,您将能够嵌入如下所示的查询,该查询有效地使用您推送到 Table SESSION 中的报表参数。MY_PARMS。
select * from MY_SCHEMA.MY_REPORT_VIEW
;
由于表 MY_PARMS 是库/架构 QTEMP 中的 SESSION 临时表,因此此设计支持多个用户使用不同的参数同时运行报表(因为每个用户将具有单独的 JOB 和单独的 QTEMP 库)。
系统将后期绑定到表 SESSION。MY_PARMS表 UDF MY_PARMS_UDF,这意味着您甚至可以删除并重新创建该表,并且对 VIEW 和 UDF 的下一个引用将获取表 SESSION 的新副本。MY_PARMS(或新更新的行,如果您只是更新会话中的行。MY_PARMS)。
我认为您很有可能使用 SQL 存储过程,该过程接受您的报告参数作为输入,并将一个或多个结果集返回到报表的 Crystal Reports。 但是,由于我已经很久没有使用Crystal Reports了,我不记得它是否支持对SQL存储过程的调用。如果 Crystal Reports 支持使用参数调用 SQL 存储过程,并从该过程接收一个或多个结果集,那就简单一些了。 如果这样做,请确保在生成结果集的过程中使用面向结果集的 SQL,而不是单行游标处理,以便最大限度地提高性能。
请注意,使用过程比 UDF 和 View 技术更简单,但过程不太灵活,因为必须使用 CALL 调用过程,而 VIEW 可以在查询中引用表的任何位置引用。 出于灵活性的原因,我很少使用 SQL 过程,而是使用 VIEWS 和 UDF。我还建议在大多数情况下使用 TABLE UDF 而不是 SCALAR UDF,因为它们可以在查询中的更多位置引用,并且可以更轻松地将其列内容包含在查询结果集中。
不要通过 sp 发送参数,通过代码传递参数,然后通过数据库获取。 看看这个会很有帮助。.MSDN SP Paramerters