最近接手优化了几个ECC的程序,总计记录下几点心得,后续有补充会持续更新...
1、索引的使用
1.1 在从BKPF取数时必须使用索引字段,如果不使用速率会是数量级倍数的差距;
1.2 所有索引字段都在WHERE条件中时不需要考虑顺序;当某个索引中的某些字段在WHERE条件中,而某些又不在时候,我们应该严格按照索引中字段的排列次序来在WHERE条件中安排字段次序,因为数据库它在查找索引表的时候,是严格按照索引次序来在索引表中查询地址信息的。另,当某几个连续的索引字段中的一个不在WHERE条件中的时候,其实此字段后的索引字段对性能的提高已经失去了意义。例如:所以A,它包括A1、A2、A3、A4四个索引字段,当我们在WHERE条件中用到A1、A2、A4,此时A4其实在索引表中查询数据地址段的时候已经不会用到,也就失去了意义(当然限制在具体的数据表中还是有限制性的,只是不能提高性能而已);
1.3 WHERE条件中非索引字段的排列次序。应该将筛选作用大的字段排在右边,因为SQL中解析WHERE条件的次序是从右至左的,这样先最大限度地筛选数据,有利于提高数据查询性能;
1.4 SQL中尽量避免使用IN 性能最差。
参考:ABAP 查询性能提高之索引_ChampaignWolf的博客-CSDN博客_abap 索引
2、针对 FOR ALL ENTRIES 语法的优化
在对标AUFM取数时,发现一个很奇怪的问题,同样的条件在SE16N取数会比SQL取数快很多,ST05跟踪SQL路径也没有发现,考虑到使用了FOR ALL ENTRIES语法,尝试在这个语法角度进行优化,于是参考优通大神的示例进行修改,果然速度有了较大提升。但速度还是没有SE16N直接查询快,这点后期还要研究,最起码优化后程序可以用了就很开心。
"优化前
SELECT
mblnr
mjahr
zeile
bwart
kdauf
kdpos
menge
FROM aufm INTO CORRESPONDING FIELDS OF TABLE gt_aufm
FOR ALL ENTRIES IN gt_vbak
WHERE bwart IN ('101','102')
AND kdauf = gt_vbak-vbeln
AND kdpos = gt_vbak-posnr.
"优化后
SELECT
mblnr
mjahr
zeile
bwart
kdauf
kdpos
menge
FROM aufm INTO CORRESPONDING FIELDS OF TABLE gt_aufm
FOR ALL ENTRIES IN gt_vbak
WHERE bwart IN ('101','102')
AND kdauf = gt_vbak-vbeln
AND kdpos = gt_vbak-posnr
%_HINTS ORACLE 'index(AUFM"Z1") &max_blocking_factor 1000& &max_in_blocking_factor 1000&'.