需要优化超过200,000条记录的简单循环

时间:2011-07-26 16:48:54

标签: sql oracle optimization abap

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

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分钟以上。 使用散列表会更好吗? 任何帮助或想法将不胜感激。

4 个答案:

答案 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