首页 > SAP > ABAP > 关于自定义程序的效能优化
2019
08-29

关于自定义程序的效能优化

在项目中,总会有各种的ABAP程序的性能太慢,需要优化,

说明:本文档是参照sap程序优化标准培训教材BC490。

程序优化宗旨:

1.正确运用索引,尽量避免以全表扫描的方式提取数据,这是程序效能的最主要影响因素。

2.尽量减少数据的传输(例如,利用buffer,无用列不要传,数据的过滤尽量放在数据库层等)。

3.批处理优于逐笔处理。

4.让代码少作无用功,摈弃无用程序代码。

一、实现方式的优化:

1.检查系统标准报表,察看有没有功能相同,相似的报表,以标准报表,或标准报表的增强版代替自定义开发程序。

2.低效率的query程序,如果问题出在无法优化的infoset 则应该考虑abap开发。

3.通过信息结构产生的查询程序,要特别注意效能,必要的时候考虑abap自定义开发,或query, report painter 等方式实现。

4.通过逻辑数据库实现的程序,如果效能低,可以考虑abap开发实现。

二、运行方式的优化:

1.对于非实时数据查询报表,可以考虑放到后台运行。

2.非实时数据查询,可以通过自定数据表存储运算结果,让用户直接从自定义表抽取报表数据,大大提升查询响应速度。

3.定期后台运行程序,把结果存入文档直接让用户下载等。

三、查询界面的优化:

1. 注意避免完全无输入限制的界面,这样可能会导致全表扫描的查询方式,带来效能问题

2.查询界面的设计要尽量契合程序中SQL的where条件。

四、程序代码的优化:

1) 正确运用索引:For all frequently used Select statements, try to use an

index. You always use an index if you specify (a generic part of)

the index fields concatenated with logical Ands in the Select

statement’s Where clause. Note that complex Where clauses

are poison for the statement optimizer in any database system。

如果一个大数据量的SQL查询,WHERE条件没有利用索引提取数据,必然带来严重的效能问题:可以通过工具ST05等分析查询效能,或直接通过观察法分析SQL查询语句。

A.首先查看是否使用正确的数据表,(例如如果要取得科目期间金额数据,可直接从glt0表中获得,而不要通过bseg累加计算了)。

B.如果当前表不能提供按索引查询,可考虑是否可以通过索引表,例如vbrp中没有按物料的条件查询,但vbrmp则有按物料的索引,可以通过该表获得凭证号,再通过凭证号到VBRP中获得所需信息。

C.看有没有符合条件的视图。

D.按查询条件建立索引。

*自定义索引请注意以下问题:

1.不要修改标准索引。

2.每个表一般索引个数不要超过5个,索引字段一般不要超过4个。

3.尽量不要在主数据表和业务数据表中添加索引。

4.不要在以DD打头的标中建索引,因为他们是基础表。

5.字段排列按一下规则: Identifiers:+ Organizational units:+ Status fields:+ Classifiers:+ Date and time:+ Text fields:)。

6.对于非常复杂的where条件要拆成多查询语句,因为数据库的查询优化器无法对复杂条

件查询实现优化,可能导致非索引查询。

2) Where条件中尽量不要用“非”的查询条件(诸如not,, not in ,etc),这样可以缩小

数据搜索范围。

3)注意BUFFER:For all frequently used, read-only tables, try to use SAP buffering.

Network load is considerably less。

4) 尽量避免嵌套查询,多SQL查询,看可不可以用视图,表关联或子查询替代。

5) 用Select Into Table 代替Select + Append模式语句。

6) 用批处理模式代替逐纪录处理,例如:

INSERT CUSTOMERS FROM TABLE TAB.

比下面语句要高效的多

LOOP AT TAB INTO TAB_WA.

INSERT INTO CUSTOMERS VALUES TAB_WA.

ENDLOOP.

其他操作原理相同

7) 把运算尽量放到SQL层次实现,避免不必要数据的传输,例如

SELECT * FROM SBOOK INTO SBOOK_WA

WHERE CARRID = ‘LH’ AND CONNID = ‘0400’.

ENDSELECT.

比下面语句要高效率

SELECT * FROM SBOOK INTO SBOOK_WA.

CHECK: SBOOK_WA-CARRID = ‘LH’ AND SBOOK_WA-CONNID = ‘0400’.

ENDSELECT.

还有: DATA: MAX_MSGNR type t100-msgnr.

SELECT MAX( MSGNR ) FROM T100 INTO max_msgnr

WHERE SPRSL = ‘D’ AND

ARBGB = ’00’.比下面语句要高效率得多

DATA: MAX_MSGNR type t100-msgnr.

MAX_MSGNR = ‘000’.

SELECT * FROM T100 INTO T100_WA

WHERE SPRSL = ‘D’ AND

ARBGB = ’00’.

CHECK: T100_WA-MSGNR > MAX_MSGNR.

MAX_MSGNR = T100_WA-MSGNR.

ENDSELECT.

等等,其他操作原理相同。

8)不要滥用 SELECT *,一般应把所需字段list出来,不要list不必要的字段,减少数据传输,减轻网络负担,提升性能。

9)大数据量内表处理的优化

a.批处理优于逐纪录处理,例如APPEND LINES OF ITAB1 TO ITAB2.

优于

LOOP AT ITAB1 INTO WA.

APPEND WA TO ITAB2.

ENDLOOP.

ITAB2[] = ITAB1[].

优于

REFRESH ITAB2.

LOOP AT ITAB1 INTO WA.

APPEND WA TO ITAB2.

ENDLOOP.

b.运用排序和BINARY SEARCH

If internal tables are assumed to have many (>20) entries, a linear

search through all entries is very time-consuming.

Try to keep the table ordered and use binary search

or used a table of type SORTED TABLE.

If TAB has n entries, linear search runs in O( n ) time, whereas

binary search takes only O( log2( n ) ).

例如:

READ TABLE ITAB INTO WA WITH KEY K = ‘X’ BINARY SEARCH.

远优于

READ TABLE ITAB INTO WA WITH KEY K = ‘X’.

最后编辑:
作者:yangsen
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。