点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
ABAP/4(Advanced Business Application Programming 4GL)语言是一种“事件驱动”、“自顶向下”、结构良好且功能强大的编程语言。ABAP/4 处理器控制事件的执行。由于 ABAP/4 语言包含了许多“事件”关键字,而这些关键字在代码中不需要按任何特定顺序排列,因此实施内部 ABAP/4 编码标准是明智之举。
SAP 推荐的特定于客户的 ABAP/4 开发指南可以在 SAP 文档中找到。
此页面包含一些有效的 ABAP/4 程序开发的一般指南,应考虑在以下方面提高系统性能:-
物理 I/O - 数据必须从 I/O 设备读取和写入。这可能是一个潜在的瓶颈。一个配置良好的系统总是运行“I/O-bound”——I/O 的性能决定了整体性能。
数据库资源的内存消耗,例如。缓冲器等
数据库和应用服务器上的 CPU 消耗
网络通信 - 对于小数据量并不重要,但在传输大量数据时会成为瓶颈。
还可以制定政策和程序,以便在将对象提升到 SAP 生产系统之前,对每个 SAP 客户开发对象进行彻底审查(质量 - 程序正确性以及代码效率)。有关 SAP R/3 ABAP/4 Development Workbench 编程工具及其功能的信息可以在 SAP Public Web-Server 上找到。
-------------------------------------------------- ------------------------------
经典的 4GL 编程规范实践指南
避免死代码
去除不必要的代码和冗余处理
花时间记录并采用良好的变更控制实践
花足够的时间分析业务需求、流程、数据结构和数据模型
质量保证是关键:计划和执行良好的测试计划和测试方法
经验很重要
SELECT * FROM <TABLE>
CHECK: <CONDITION>
ENDSELECT
vs.
SELECT * FROM <TABLE>
WHERE <CONDITION>
ENDSELECT
为了将与查询相关的数据量保持在较小的范围内,请尽可能避免使用 SELECT+CHECK 语句。作为一般经验法则,始终在 WHERE 子句中指定所有已知条件(如果可能)。如果没有 WHERE 子句,DBMS 就没有机会进行优化。始终在 Where-clause 中指定您的条件,而不是使用 check-statements 自己检查它们。数据库系统还可以潜在地使用数据库索引(如果可能)以提高效率,从而减少数据库服务器上的负载并显着减少网络流量上的负载。
此外,尽可能在 WHERE 子句中使用 EQ (=) 并分析 SQL 语句以获得数据库优化器将在必要时通过 SQL 跟踪使用的最佳路径也很重要。
此外,请确保谨慎使用在 Open SQL 语句中使用不当的“OR”、“NOT”和值范围表 (INTTAB)。
-------------------------------------------------- ------------------------------
SELECT *
vs.
SELECT SINGLE *
如果您只对数据库表或视图的一行感兴趣,请使用 SELECT SINGLE 语句而不是 SELECT * 语句。SELECT SINGLE 需要与数据库系统进行一次通信,而 SELECT * 需要两次。
-------------------------------------------------- ------------------------------
SELECT * FROM <TABLE> INTO <INT-TAB>
APPEND <INT-TAB>
ENDSELECT
对比
SELECT * FROM <TABLE> INTO TABLE <INT-TAB>
使用 SELECT 语句的 INTO TABLE 版本通常比使用 APPEND 语句更快
-------------------------------------------------- ------------------------------
SELECT ... WHERE + CHECK
vs.
SELECT using aggregate function 使用聚合函数
如果要查找最大值、最小值、总和和平均值或数据库列的计数,请使用带有聚合函数的选择列表,而不是在程序中计算聚合。RDBMS 负责聚合计算,而不是将大量数据传输到应用程序。整体网络、应用服务器和数据库负载也大大减少。
--------------------------------------------------------------------------------
SELECT INTO TABLE <INT-TAB> + LOOP AT T
…………
SELECT * FROM <TABLE> INTO TABLE <INT-TAB>.
LOOP AT <INT-TAB>.
ENDLOOP.
vs.
SELECT * FROM <TABLE>
……….
ENDSELECT
如果您只处理一次数据,请使用 SELECT-ENDSELECT 循环而不是使用 SELECT ... INTO TABLE 在内部表中收集数据。内部表处理占用更多空间
--------------------------------------------------------------------------------
Nested SELECT statements:
SELECT * FROM <TABLE-A>
SELECT * FROM <TABLE-B>
……..
ENDSELECT.
ENDSELECT
vs.
Select with view
SELECT * FROM <VIEW>
ENDSELECT
要处理连接,请尽可能使用视图而不是嵌套的 SELECT 语句。
使用嵌套选择是一种性能低下的技术。内部选择语句被执行多次,这可能是一个开销。此外,如果使用另一种技术,则必须传输的数据更少。join 作为视图在 ABAP/4 存储库中实现。
· SELECT ... FORM ALL ENTRIES
· 显式游标处理(有关更多信息,请转到事务 SE30 – 提示和技巧)
--------------------------------------------------------------------------------
Nested select:
SELECT * FROM pers WHERE condition.
SELECT * FROM persproj WHERE person = pers-persnr.
... process ...
ENDSELECT.
ENDSELECT.
vs.
SELECT persnr FROM pers INTO TABLE ipers WHERE cond. ……….
SELECT * FROM persproj FOR ALL ENTRIES IN ipers
WHERE person = ipers-persnr
………... process .……………
ENDSELECT.
在较低版本中,使用新的 Open SQL 语句 FOR ALL ENTRIES。在调用之前,所有来自 'pers' 的有趣记录都被读入一个内部表中。第二个 SELECT 语句导致调用如下所示(ipers 包含:P01、P02、P03):
(SELECT * FROM persproj WHERE person = 'P01')
UNION
(SELECT * FROM persproj WHERE person = 'P02')
UNION
(SELECT * FROM persproj WHERE person = 'P03')
在大语句的情况下,R/3 的数据库接口将语句分成几个部分并将结果集重新组合为一个。这里的优点是传输次数最少,并且由于语句大小(与范围表相比)的限制最小。
--------------------------------------------------------------------------------
SELECT * FROM <TABLE>
vs.
SELECT <column(s)> FROM <TABLE>
如果您只对表的特定列感兴趣,请使用选择列表或视图而不是 SELECT *。如果仅需要某些字段,则应仅从数据库中读取这些字段。同样,也可以通过使用 ABAP/4 Dictionary 中定义的视图来限制列数。整体数据库和网络负载要小得多。
-------------------------------------------------- ------------------------------
SELECT without table buffering support
vs.
SELECT with table buffering support
对于所有经常使用的只读(很少更新)表,请尝试使用 SAP 缓冲来提高性能响应时间。这将减少整体数据库活动和网络流量。
-------------------------------------------------- ------------------------------
Single-line inserts
LOOP AT <INT-TAB>
INSERT INTO <TABLE> VALUES <INT-TAB>
ENDLOOP
vs.
Array inserts
尽可能使用数组操作而不是单行操作来修改数据库表。
应用程序和数据库系统之间的频繁通信会产生相当大的开销。
--------------------------------------------------------------------------------
Single-line updates
SELECT * FROM <TABLE>
<COLUMN-UPDATE STATEMENT>
UPDATE <TABLE>
ENDSELECT
vs.
Column updates
UPDATE <TABLE> SET <COLUMN-UPDATE STATEMENT>
在可能的情况下,使用列更新而不是单行更新来更新数据库表
-------------------------------------------------- ------------------------------
DO....ENDDO loop with Field-Symbol
vs.
Using CA operator
使用特殊运算符 CO、CA、CS,而不是自己编写操作
如果在长字符串上按字符执行 ABAP/4 语句,CPU 消耗会大幅增加
--------------------------------------------------------------------------------
Use of a CONCATENATE function module
vs.
Use of a CONCATENATE statement
一些字符串操作的功能模块已经过时,应该用ABAP语句或函数代替
STRING_CONCATENATE ... ---> CONCATENATE
STRING_SPLIT ... ---> SPLIT
STRING_LENGTH ... ---> strlen()
STRING_CENTER ... ---> WRITE..TO。..CENTERED
STRING_MOVE_RIGHT ---> 写...到...右对齐
-------------------------------------------------- ------------------------------
Moving with offset
vs.
Use of the CONCATENATE statement
使用 CONCATENATE 语句而不是编写您自己的字符串连接
--------------------------------------------------------------------------------
Use of SEARCH and MOVE with offset
vs.
Use of SPLIT statement
使用 SPLIT 语句而不是自己编写字符串拆分
--------------------------------------------------------------------------------
Shifting by SY-FDPOS places
vs
Using SHIFT...LEFT DELETING LEADING...
如果您想删除字符串中的前导空格,请使用 ABAP/4 语句 SHIFT...LEFT DELETING LEADING... 其他结构(使用 CN 和 SHIFT... BY SY-FDPOS PLCES,如果可能,使用 CONDENSE,使用 CN和 ASSIGN CLA+SY-FDPOS(LEN) ...) 没有那么快
-------------------------------------------------- ------------------------------
Get a check-sum with field length
vs
Get a check-sum with strlen ()
使用 strlen() 函数将 DO 循环限制在字段的相关部分,例如。确定校验和时