0

嗨,我有一项任务来缩短加载和运行 CR 的时间。超过30分钟。它针对 DB2 服务器,所有处理都在 Crystal 中完成。所以我的第一个想法是在服务器上创建一个视图,这样会更快。但是,该报告有一个从开始到现在。

那么,我需要一个存储过程。但这意味着,我需要将日期从 CR 传递到服务器上的 SP。

我还没有看到这样做,但也许有技术可以做到这一点?如果不是,我会尝试查看,但其中一些表上有大量数据。

4

2 回答 2

1

如果您将尽可能多的处理推送到主机,您将获得最佳性能。

首先,在没有 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,因为它们可以在查询中的更多位置被引用,并且更容易将它们的列内容包含在查询结果集中。

于 2014-11-15T06:46:23.883 回答
0

不要通过sp发送参数,通过代码传递参数,然后通过DB获取。看看这个会很有帮助.. MSDN SP 参数

于 2013-09-16T05:27:49.347 回答