我想知道是否有人可以优化以下代码:
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