我想知道是否有人可以优化以下代码:
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分钟以上。 使用散列表会更好吗? 任何帮助或想法将不胜感激。
答案 0 :(得分:7)
从循环中取出选择 - 将所需的所有数据从lqua中拉入单个select语句中的单独内部表中。然后在循环内的第二个表上读取。使用散列/排序表或使用二进制搜索。
答案 1 :(得分:4)
您还应该考虑使用字段符号而不是使用修改。
field-symbols: <dispinstock> like line of dispinstock.
loop at dispinstock assigning <dispinstock>.
" some work
<dispinstock>-gesme = new value..
"...
endloop
通过这种方式,您可以减少读取显示表的次数并直接更改值。
答案 2 :(得分:0)
我确定您的内部表格不包含170.000种不同的材料! 所以我建议建立一个不同的MATNR表,然后用FOR ALL ENTRIES IN开始选择......
... AND(lgtyp IN zsd_t301_n OR(lgtyp&gt; ='900'和lgtyp&lt; ='903'))
在范围对象zsd_t301_n中插入一行并删除OR语句
签署OPTION LOW HIGH
I BT 900 903
答案 3 :(得分:0)
如果显示“MODIFY dispinstock”的行表示“使用刚刚从SELECT中获取的值更新dispinstock表中的行”,那么您可以用单个MERGE语句替换LOOP和SELECT。 / p>
像
这样的东西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