需要优化一个包含200,000条记录的简单循环



我想知道是否有人可以优化以下代码:

LOOP AT dispinstock.
  SELECT matnr SUM( gesme ) SUM( verme ) SUM( einme ) SUM( ausme )
         INTO (dispinstock-matnr, dispinstock-gesme,
               dispinstock-verme, dispinstock-einme, dispinstock-ausme)
         FROM lqua
         WHERE matnr = dispinstock-matnr
         AND lgnum = 'xxxxx'
         AND ( lgtyp IN zsd_t301_n
          OR ( lgtyp >= '900' AND lgtyp <= '903' ) )
          GROUP BY matnr.
    MODIFY dispinstock.
  ENDSELECT.
ENDLOOP.

销毁170.000条记录,

LQUA 210,000条记录(不久将更大> 1,500,000条记录)

这个循环超过3分钟。用散列表代替会更好吗?

将选择从循环中取出—在单个选择语句中将所需的所有数据从lqua拉到单独的内部表中。然后对循环中的第二个表执行读取操作。使用散列/排序表或使用二进制搜索

您还应该考虑使用字段符号而不是使用modify.

field-symbols: <dispinstock> like line of dispinstock.
loop at dispinstock assigning <dispinstock>.
  " some work
  <dispinstock>-gesme = new value..
  "...
 endloop

这样可以减少读取disinstock表的次数,并直接更改值。

我确定你的内部表库存不包含170.000种不同的材料!因此,我建议构建一个不同matnr的表,并以FOR ALL ENTRIES IN…

开始选择。

…AND (lgtype IN zsd_t301_n OR (lgtype>= '900' AND lgtype <= '903'))

在您的范围对象zsd_t301_n中插入一行,并删除OR语句

Sign OPTION LOW HIGH

I BT 900 903

如果"MODIFY disinstock"这一行的意思是"用刚刚从SELECT中获得的值更新disinstock表中的一行",那么您可能可以用单个MERGE语句替换LOOP和SELECT。

之类的
MERGE INTO dispinstock
USING (  SELECT matnr, SUM( gesme ) gesme,  SUM( verme ) verme, SUM( einme ) einme,  SUM( ausme ) ausme
         FROM lqua
         WHERE lgnum = 'xxxxx'
         AND ( lgtyp IN zsd_t301_n
          OR ( lgtyp >= '900' AND lgtyp <= '903' ) )
          GROUP BY matnr
      ) lqua
ON lqua.matnr = dispinstock.matnr
WHEN MATCHED THEN UPDATE SET
  gesme = l.gesme, verme = l.verme, einme = l.einme, ausme = l.ausme

相关内容

  • 没有找到相关文章

最新更新