ABAP程序性能优化

首先调试程序找到运行缓慢的位置,再判断是什么原因导致的运行缓慢,一般分为几种情况。

1.循环中执行一个以上读取数据库表的操作,loop select endloop,列如在循环中根据订单号、物料号、供应商、客户等编码字段使用select操作读取这些编码对应的描述,如物料描述,订单描述等。

这种情况应该尽量把读取数据库表的操作提到循环之前,然后在循环中使用read table binary search二分法查找提前取出的内表数据。

使用for entries in需要注意几点:

(1)IN条件所在内表不能为空(空值将取出所有数据,导致程序运行缓慢)

(2)这个语句会自动去重,使用时尽量多的带出主键,如果没有带出足够的主键可能导致取出的数据不全, 影响之后需要汇总的各种数据

(3)如果有必要可以把IN条件内表分批次作为条件读取数据,每次使用3000。因为IN条件内表很大的时候,比如几十上百万条数据,执行这个SQL则会占用大量内存,而且效率很差,此时应该限制IN内表条件的个数。

(4)这个语句会将SQL代码拆分为多条SQL语句在数据库中执行,在IN内表数据量大的时候也会发生性能问题,可以使用事务码RZ10和RZ11配置全局参数文件,优化FOR ALL ENTRIES IN 这个语句的效率。

rsdb/prefer_in_itab_opt

参数被设置为 1时,可以在 where 条件中仅有一个字段被内表限制的时候将内表的字段放到 IN 条件中。SQL 语句 IN 条件比 OR 条件的效率高, 启用该参数可以提高效率。

rsdb/max_blocking_factor

这个参数设定每个SQL语句处理的内表条件的个数。如果内表数据为 50条, rsdb/max_blocking_factor = 5 则生成10条 SQL语句,每个 SQL 语句包含5个内表条件。

rsdb/max_in_blocking_factor

同 rsdb/max_blocking_factor 类似, 该参数针对 rsdb/prefer_in_itab_opt ,即 WHERE 条件为 IN 的情况。

可以使用 %_HINTS ORACLE '&prefer_in_itab_opt 1& &max_in_blocking_factor 500&'.

 FOR ALL ENTRIES IN 性能速度优化

 

2.业务逻辑层面导致的性能问题,使用索引读取数据量大的数据库表时,可以提高程序运行效率。

比如读取会计核算凭证段表-BSEG中的数据时,如果没有确定凭证号,那么尽量不直接读取BSEG这个表,应该从其他表根据已有字段内容确定凭证号之后再到BSEG中读取数据。

比如确定科目号HKONT、客户编码KUNNR,应该先从科目和客户对应的索引表BSIS、BSAS、BSID、BSAD

获取到相对应的会计凭证号,然后再从表BSEG中读取需要的数据。

3.频繁使用表连接,比如select from A inner join B,应尽量避免使用,转而拆分成两个select语句。

4.使用CDS VIEW,实在需要多表连接后的视图数据,则可以用eclipse开发cds view,把连接多表的操作交给底层数据库处理,在程序中就可以更快的读取视图数据,提高效率。

ABAP Core Data Service Views 核心数据服务视图。

SE11的视图有很多限制,只能简单的连接下主键,删选一些固定的限制,CDS 视图更灵活。

5.循环内表并更新数据时,使用指针即时修改循环数据的值,代替使用loop into modify 这种语句,可以提高程序运行效率。

6.系统原本内存占用高导致的问题,只能优化SAP系统,或者更换内存硬件等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forwardEveryday

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值