在专家例程中进行性能调整。

2020-09-08 08:15发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中) BW/ABAP专家, 在我们...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


BW/ABAP专家,

在我们的项目的BW系统中,以下代码是用Expert例程编写的。 但是,在执行数据加载时,Expert例程花费了更多时间。 似乎必须对例程进行微调以改善数据负载。

当我检查下面的代码时,我感觉由于删除相邻语句中使用的"或条件"而导致数据加载花费了很多时间。 您能否建议我如何优化以下代码。 目前,此流中正在加载3300万数据。

$ * $例程的开始-仅在此行下方插入代码*-*
数据:LV_DATE TYPE DATUM。
数据:LV_MAXDATE TYPE DATUM。
数据:LV_FLAG TYPE C长度1。 br> DATA:LV_COUNT TYPE I VALUE 1。 br>字段符号:与RESULT_PACKAGE行类似。

在以下位置删除源包(/BIC/TABLE1初始或
/BIC/TABLE2初始)或
/BIC/TABLE3是


不能检查源代码包。

从/BIC/TABLE4


*从临时历史加载日期
SELECT CALDAY/中选择MAX(CALDAY)到LV_MAXDATE。 BIC/G_TIC9038/BIC/G_MCC2037 INTO(LV_ADHOC_DATE,
LV_DATE_TYPE,LV_FLAG)
从/BIC/TABLE5,其中对象='A'。 '。
LV_DATEFROM = LV_ADHOC_DATE。
ELSEIF LV_DATE_TYPE ='TO'和LV_FLAG ='X'。
LV_DATETO = LV_ADHOC_DATE。
ENDI F.
ENDSELECT。

*如果未保留临时日期
************************** ************************************************
如果LV_DATETO IS INITIAL。
LV_DATETO = SY-DATUM。 "-1.
ENDIF。

如果LV_DATEFROM是INITIAL。
LV_DATEFROM = LV_MAXDATE。
ENDIF。

************ ****************************************************** ********

在源包分配中循环
清除:LV_DATE。
*如果源数据晚于目标DSO max,则仅对源数据使用有效
*日期或临时日期来自
如果LV_DATEFROM是INITIAL或-//BIC/TABLE2>
LV_DATEFROM。
LV_DATE = -//BIC/TABLE2。
ELSE。
LV_DATE = LV_DATEFROM。
ENDIF。

DO。
*仅创建并转换成当前日期之前的每日格式
*或有效至日期的临时格式
如果LV_DATE> -/BIC/TABLE1或LV_DATE>
LV_DATETO。
退出。
ENDIF。
*基于有效日期和有效日期
* duration
的附录格式以每日格式创建条目 到RESULT_PACKAGE分配的行

-/BIC/CARC0200 = -/BIC/E02MATNR。
-/BIC/CSTC0100 = -/BIC/E02WERKS。
-/BIC/CARC0302 = -/BIC/E02ZRANGE。
-CALDAY = LV_DATE。
-/BIC/G_MCC2013 =``。
-/BIC/CARC0405 = -/BIC/TABLE2
-/BIC/CARC0406 = -/BIC/TABLE1。
* ****************************************************** *******************
-RECORDMODE = -RECORDMODE。
-RECORD = LV_COUNT。
** ****************************************************** ******************
LV_DATE = LV_DATE +1。
LV_COUNT = LV_COUNT + 1.
ENDDO。
ENDLOOP。
< br>从RESULT_PACKAGE中删除相邻重复项
比较/BIC/CARC0200
/BIC/CSTC0100 CALDAY。

谢谢。

3条回答
spaceman01
2020-09-08 08:41 .采纳回答

1。 在例程开始时,条件=>从source_package中删除的数据=>我认为您可以将其移至DTP的过滤条件。

2。 如果您的数据库是HANA,请尝试将逻辑移至过程或创建HANA视图。

3。 将/BIC/TABLE5上的选择移到/BIC/TABLE4的选择之外,因为那里没有关系(条件仅是活动版本)。 我还认为您可以用TVARVC替换TABLE4,TABLE5。

还有更多...我尝试如下所示,您可以考虑:

数据:lv_date TYPE数据。
 数据:lv_maxdate TYPE基准。
 数据:lv_flag TYPE C长度1。
 数据:lv_count类型i值1。
 数据:lv_date_type TYPE/bic/oig_tic9038。
 数据:lv_adhoc_date TYPE数据。
 数据:来自TYPE数据的lv_date。
 数据:lv_dateto TYPE基准。
 FIELD-SYMBOLS:类似于result_package的行。
 在哪里删除source_package(/bic/table1是INITIAL或
                             /bic/table2是INITIAL)或
                             /bic/table3是INITIAL。
 检查source_package是否为INITIAL。
 *阅读临时历史加载日期
 SELECT CALDAY
      /bic/g_tic9038
      /bic/g_mcc2037
   INTO(lv_adhoc_date,
         lv_date_type,
         lv_flag)
   从/bic/table5
  objvers ='A'。
 从/bic/table4选择SELECT MAX(calday)到lv_maxdate中。
 lv_datefrom = COND#(当lv_date_type ='FROM'
                        AND lv_flag ='X'
                        AND lv_adhoc_date不是初始的
                       然后lv_adhoc_date
                       ELSE lv_maxdate)。
 lv_dateto = COND#(当lv_date_type ='TO'
                      AND lv_flag ='X'
                      AND lv_adhoc_date不是初始的
                     然后lv_adhoc_date
                     ELSE sy-datum)。
 *仅使用源数据中的有效值(如果其晚于目标DSO最大值)
 *日期或临时日期
 在/bic/table2  lv_dateto处删除source_package。
 循环AT source_package ASSIGNING 。
     lv_date = <源字段>-/bic/table2。
     lv_count = 0。
     lv_date <= <源字段>-/bic/table1。
 *基于有效期至和有效期自每日以每日格式创建条目
 *持续时间
     在result_package ASSIGNING 上附加初始行。
     <结果字段>-/bic/carc0200 = <源字段>-/bic/e02matnr。
     <结果字段>-/bic/cstc0100 = <源字段>-/bic/e02werks。
     <结果字段>-/bic/carc0302 = <源字段>-/bic/e02zrange。
      -calday = lv_date。
     -/bic/g_mcc2013 =''。
     <结果字段>-/bic/carc0405 = <源字段>-/bic/table2。
     <结果字段>-/bic/carc0406 = <源字段>-/bic/table1。
 ******************************************************  ********************
     <结果字段> -recordmode = <源字段> -recordmode。
     <结果字段>-记录= lv_count。
 ******************************************************  ********************
     lv_date = lv_date + 1。
     lv_count = lv_count + 1。
     结束。
 结局。
 从result_package删除相邻的重复项
 比较/bic/carc0200
         /bic/cstc0100
           卡尔迪。
 

一周热门 更多>