嗨,我有一项任务来缩短加载和运行 CR 的时间。超过30分钟。它针对 DB2 服务器,所有处理都在 Crystal 中完成。所以我的第一个想法是在服务器上创建一个视图,这样会更快。但是,该报告有一个从开始到现在。
那么,我需要一个存储过程。但这意味着,我需要将日期从 CR 传递到服务器上的 SP。
我还没有看到这样做,但也许有技术可以做到这一点?如果不是,我会尝试查看,但其中一些表上有大量数据。
嗨,我有一项任务来缩短加载和运行 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
)
;
在 Crystal Reports 中,您需要为每个作业创建参数表 SESSION.MY_PARMS(如果您已经在报表作业中创建了参数表并且更喜欢 UPDATE,则使用 UPDATE 刷新其内容)。自 2002 年以来我就没有使用过 Crystal Reports,所以我无法有效地帮助解决这部分问题。
然后,在 Crystal 报表中,您将能够嵌入如下所示的查询,该查询有效地使用您推送到表 SESSION.MY_PARMS 中的报表参数。
select * from MY_SCHEMA.MY_REPORT_VIEW
;
因为表 MY_PARMS 是库/模式 QTEMP 中的 SESSION 临时表,所以这种设计支持多个用户使用不同的参数同时运行报表(因为每个用户将有一个单独的 JOB 和单独的 QTEMP 库)。
系统将延迟绑定到表 UDF MY_PARMS_UDF 中的表 SESSION.MY_PARMS,这意味着您甚至可以删除并重新创建该表,并且下一次对 VIEW 和 UDF 的引用将获取表 SESSION.MY_PARMS 的新副本(或新更新的行如果您只是更新 SESSION.MY_PARMS 中的行)。
我认为您很有可能使用 SQL 存储过程,它接受您的报表参数作为输入并将一个或多个结果集返回给 Crystal Reports 以获取报表。但是,由于我很久没有使用 Crystal Reports,我不记得它是否支持对 SQL 存储过程的调用。如果 Crystal Reports 支持调用带参数的 SQL 存储过程,并从过程中接收一个或多个结果集,那就简单一些了。如果这样做,请确保在过程中使用面向结果集的 SQL 来构建结果集,而不是单行游标处理,以最大限度地提高性能。
请注意,使用过程比 UDF 和 View 技术更简单,但过程不太灵活,因为必须使用 CALL 调用过程,而在查询中可以引用表的任何地方都可以引用 VIEW。出于灵活性的原因,我很少使用 SQL 过程,而是使用 VIEWS 和 UDF。我还建议在大多数情况下使用 TABLE UDF 而不是 SCALAR UDF,因为它们可以在查询中的更多位置被引用,并且更容易将它们的列内容包含在查询结果集中。
不要通过sp发送参数,通过代码传递参数,然后通过DB获取。看看这个会很有帮助.. MSDN SP 参数