[ABAP] ECC ORACLE数据库程序优化记录

最近接手优化了几个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&'.

参考:FOR ALL ENTRIES 优化 | 优通SAP (ut163.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值