Itab的循环很慢

2020-09-25 23:07发布

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

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


我已经声明了一个内部表,例如

数据:wa_collectoraction TYPE zcollectoraction,
       it_collectoraction类似于zcollectoraction的标准表。

我们有以下记录:

200-1000-620-201708-20170819-20170819121212.356 ................................. ............

200-1000-620-201708-20170819-20170819121211.356 .................................... .....

200-1000-620-201708-20170815-20170815121211.31.3 .................................... ......

200-1000-620-201707-20170710-20170710121200.356 ................................. ......

200-1000-620-201707-20170710-20170710121100.356 .................................... ......

200-1000-620-201707-20170709-20170709121100.356 .................................... ......

然后我用以下2条记录填充表格

200-1000-620-201708-20170819

200-1000-620-201707-20170710

选择bukrs kunnr yearmonth MAX(dat)AS dat
 来自zcollectoraction
   到表it_collectoraction的对应字段
 so_bukrs在哪里以及
       kunnr IN so_kunnr AND
       日期
 GROUP BY Bukrs kunnr yearmonth。

最后,我进入了以下循环,获取每个记录的最长时间,然后使用关键字段获取记录的所有剩余字段。

在it_collectoraction INTO wa_collectoraction中循环。
 PERFORM progress_bar使用"正在检索数据..."(035)
                            sy-tabix
                            i_tab_lines。
 "为所有线路获取最大时间,以解决我们有多于一条线路的情况。
 选择单*从zcollectoraction
     wa_collectoraction的相应领域
   其中bukrs = wa_collectoraction-bukrs并且
         kunnr = wa_collectoraction-kunnr AND
         dat = wa_collectoraction-dat和
         时间=(SELECT MAX(时间)AS时间
                     来自zcollectoraction
                     其中bukrs = wa_collectoraction-bukrs并且
                           kunnr = wa_collectoraction-kunnr AND
                           dat = wa_collectoraction-dat)。

 从wa_collectoraction修改it_collectoraction。
 ENDLOOP。

此循环执行5分钟,记录3000条记录。 循环的itab拥有30500条记录。

我希望自己变得更加清晰。

有人可以告诉我怎么做才能更快?

预先感谢

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

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


我已经声明了一个内部表,例如

数据:wa_collectoraction TYPE zcollectoraction,
       it_collectoraction类似于zcollectoraction的标准表。

我们有以下记录:

200-1000-620-201708-20170819-20170819121212.356 ................................. ............

200-1000-620-201708-20170819-20170819121211.356 .................................... .....

200-1000-620-201708-20170815-20170815121211.31.3 .................................... ......

200-1000-620-201707-20170710-20170710121200.356 ................................. ......

200-1000-620-201707-20170710-20170710121100.356 .................................... ......

200-1000-620-201707-20170709-20170709121100.356 .................................... ......

然后我用以下2条记录填充表格

200-1000-620-201708-20170819

200-1000-620-201707-20170710

选择bukrs kunnr yearmonth MAX(dat)AS dat
 来自zcollectoraction
   到表it_collectoraction的对应字段
 so_bukrs在哪里以及
       kunnr IN so_kunnr AND
       日期
 GROUP BY Bukrs kunnr yearmonth。

最后,我进入了以下循环,获取每个记录的最长时间,然后使用关键字段获取记录的所有剩余字段。

在it_collectoraction INTO wa_collectoraction中循环。
 PERFORM progress_bar使用"正在检索数据..."(035)
                            sy-tabix
                            i_tab_lines。
 "为所有线路获取最大时间,以解决我们有多于一条线路的情况。
 选择单*从zcollectoraction
     wa_collectoraction的相应领域
   其中bukrs = wa_collectoraction-bukrs并且
         kunnr = wa_collectoraction-kunnr AND
         dat = wa_collectoraction-dat和
         时间=(SELECT MAX(时间)AS时间
                     来自zcollectoraction
                     其中bukrs = wa_collectoraction-bukrs并且
                           kunnr = wa_collectoraction-kunnr AND
                           dat = wa_collectoraction-dat)。

 从wa_collectoraction修改it_collectoraction。
 ENDLOOP。

此循环执行5分钟,记录3000条记录。 循环的itab拥有30500条记录。

我希望自己变得更加清晰。

有人可以告诉我怎么做才能更快?

预先感谢

付费偷看设置
发送
15条回答
槿木_熙
1楼 · 2020-09-25 23:55.采纳回答

首先,我要感谢大家的帮助。

我根据用户的选择数据,通过使用内部表和dbtab中的所有记录来更改选择的逻辑。

因此,代码如下:

数据:wa_collectoraction TYPE zcollectoraction,
       it_collectoraction TYPE OF TABLE OF zcollectoraction,
       itsort_collectoraction类型的zcollectoraction哈希表
           使用唯一键mandt bukrs kunnr yearmonth日期时间。

 FIELD-SYMBOLS:类似于it_collectoraction的行。

     SELECT bukrs kunnr yearmonth MAX(dat)AS dat
       来自zcollectoraction
         到表it_collectoraction的对应字段
       so_bukrs在哪里以及
             kunnr IN so_kunnr AND
             日期
       GROUP BY Bukrs Kunnr yearmonth。

     "保留将要插入的总记录。
     i_tab_lines = sy-dbcnt。

     SELECT * INTO TABLE itsort_collectoraction
       来自zcollectoraction
       so_bukrs在哪里以及
           kunnr IN so_kunnr AND
           日期为so_date。

     排序itsort_collectoraction
                 作者mandt bukrs kunnr yearmonth dat时间下降。

     循环至it_collectoraction ASSIGNING 。
       PERFORM progress_bar使用"正在检索数据..."(035)
                                  sy-tabix
                                  i_tab_lines。

       读取表itsort_collectoraction INTO wa_collectoraction
           WITH KEY bukrs =  -bukrs
                     kunnr =  -kunnr
                     yearmonth =  -yearmonth
                     dat =  -dat。
        = wa_collectoraction。
     ENDLOOP。

此代码在1分钟内运行43000条记录。

唯一的问题是,在开始的10000至15000条记录之后,该过程正在放缓。 我不知道是否有任何命令可以清除某物。 我不知道该清除什么。

再次感谢大家。

致谢

Elias

PS。 在1st 10秒内处理14.000条记录。

在1分钟内处理38.500和

在1分钟50秒内完成了54.500条记录。

给我的印象是,它可以满足某项要求,从而减慢了该过程。

有任何想法吗?

蓋茨
2楼-- · 2020-09-25 23:49

Hmmm ... SORT of 哈希表? 并在没有WITH TABLE KEY的情况下在散列表上读取TABLE。 恐怕表现不佳。

由于它是手动排序的,因此应声明内部表:

 zcollectoraction的数据itsort_collectoraction类型标准表。  

,然后在SORT之后(由于TIME递减而需要),您应该添加以下行:

从itsort_collectoraction中删除相邻的副本比较bukrs kunnr yearmonth dat。

,并且READ TABLE应该具有BINARY SEARCH。

在删除邻接之后紧接着将内部表转移到具有键bukrs kunnr yearmonth dat(无时间字段)的新哈希表中,并在该哈希表上使用READ TABLE ... WITH TABLE KEY。 p>

吹牛啤
3楼-- · 2020-09-26 00:04

您可以在循环之前尝试以下类型的查询,并在循环内使用READ TABLE-当然,您必须检查数据库执行计划并对其进行尽可能的优化(也许它将 表现不佳)-在我的示例中,CARRID,CONNID,FLDATE,DEPTIME列分别对应于您的BUKRS,KUNNR,DAT,TIME列:

 sltlights2的数据lt_sflights2类型表。
 SELECT * FROM sflights2作为INTO表lt_sflights2
   在何处(
       从sflights2 AS c选择SELECT MAX(fldate)AS fldate
         其中c〜carrid = a〜carrid
           AND c〜connid = a〜connid
         GROUP BY康妮
       )
     AND deptime IN(
       从sflights2 AS b中选择MAX(deptime)
         在哪里b〜carrid = a〜carrid
           AND b〜connid = a〜connid
           AND b〜fldate = a〜fldate
         GROUP BY康妮·弗朗德
       )。
 
哎,真难
4楼-- · 2020-09-25 23:47

这应该来自您的原始代码,其中98%以上的时间一次又一次地打开文件(循环选择)

现在从SQL跟踪,循环/选择/结束循环以及子查询语句中查看解释计划。

宇峰科技
5楼-- · 2020-09-25 23:47

嗨,

如果Z表中只有3000条记录,则只需在内部表中的循环之前选择所有记录,然后使用排序和读取即可获取所需的信息。

在条目较少的表上进行35.000个选择没有多大意义。

亲切的问候,Rob Dielemans

土豆飞人
6楼-- · 2020-09-25 23:50

我明白了,但是您实际上想要实现什么? 我们不知道该表格数据来自何处,我们唯一知道的是一些自定义设置。

通过退一步,我的意思是查看业务场景和表格。 您上面描述的逻辑,表格和示例相互矛盾。 也许那是我的解释。 修改后的示例显示了一个包含日期的时间戳类型字段,那么为什么不立即选择max()呢? 该选择不进行时间的条件查找-您的示例中没有逻辑来确定同一日期是否存在一个或多个记录("如果该最大日期存在多个记录,则...")

小熊yu生菜
7楼-- · 2020-09-26 00:06

乍看起来,您可能会在数据库端导致嵌套的SELECT。 可以尝试以下两种快速操作:

  • 最多1个行,而不是单个行
  • 将您的SELECT拆分,将Max(time)位放入itab,然后使用FOR ALL ENTRIES执行第二个SELECT。

一周热门 更多>