ABAP性能和优化

哪些工具可以用于性能优化?

ST05-性能追踪。包含SQL追踪加RFC,队列和缓存追踪。SQL追踪主要用于测量程序中select语句的性能。

SE30-运行时分析。用于测量应用的性能。

SAT是过时的SE30的替代品。提供了和SE30相同的功能和额外的一些特性。

ST12事务(ST-A/PI软件组件的一部分)是ST05和SAT的结合。这是个非常强大的性能分析工具,由SAP提供支持。

Code Inspectior(SCI)是最好的静态性能分析工具之一。有很多选项可以用于找到通常的错误和可能的性能瓶颈。

优化ABAP代码的步骤

1,数据库

a. 在select语句中使用使用where子句来限制数据检索的体积。很重要!(译注:工作中见到过有人写select * from marc这种语句. 导致在生产系统中直接因为内存不足dump)

b. 设计查询,使其尽可能多地在where中使用索引字段。

c. 在select语句中使用inner(或者某些情况下使用outer)join语句以实现一次性查询得到匹配的数据。

d. 避免使用嵌套的select语句,以及loop中的select语句,使用join或者for all entries in会更好。如果已经有内表可以使用,或者在某些处理结束之后,可以使用for all entries in。如果select后面正好还有选择的话,使用join。

e. 访问缓存时避免使用into corresponding fields of table。相反,应该使用最适合程序的(字段)。

f. 避免使用select * ,应该只查询需要的字段。

g. 不要在select语句中使用order by,如果它和用到的索引不同的话(正确的做法是排序内表)。因为这会增加很多额外的工作。数据库系统只有一个,而ABAP服务器有好多。(译注:不确定这种观点在HANA平台中是否依旧适用)

h. 索引。在为了改善性能而创建索引前,需要深思熟虑。索引可以提高查询性能,但是也会带来两个间接的负担:存储空间和写入性能。在大事务表中创建索引时,用于存储索引的空间和索引的体积是非常巨大的!当在数据库表中插入一条新的记录的时候,所有索引都需要更新。索引越多,花费的时间也就越多。数据越多,索引也就越大,更新索引所需的时间也就越大。

i. 避免多次运行相同的select(同样的select, 同样的参数)。在你的abap代码中缓存相关信息。

j. 如果有不影响性能的标准的视图,避免使用join语句。

2,表缓存

a. 将表定义为“缓冲过的”(SE11)可以提高性能,但是要小心地使用它。表的缓存会导致程序从缓存中而不是表中读取数据。缓存和表是周期性同步的,只有极少情况下、某些东西改变的时候才会同步。如果是事务表,数据在不同的选择条件下会改变,因此这类表是不适合缓存的。不建议在这种情况下使用缓存。应该为配置表和某些主数据表启用缓存

b. 避免对缓存表使用复杂的查询,因为SAP可能解释不了这个请求,并且也许会把它传递给数据库——code inspector可以说明哪些命令会绕过缓存。

3,内表

a. 尽可能使用哈希表,其次是排序表。标准表是最后的选择。

b. 如果要修改内表的话,对于大工作区,应使用assign而不是loop into(译注:tab[ index ] -fieldname这样的表达式的效率应该也是比loop into要好的)

c. 有疑问的时候,运行SE30,以此检查代码

d. 如果不得不用标准表,并且要read读取其中的行的话,使用binary search来提高搜索速度。

4,杂项

a. perform:写子程序的时候,总是提供所有参数的类型。这减少了系统根据形参确定参数类型的开销。这也提高了程序的健壮性。

select single和select ... up to 1 rows的区别是什么?

  • select single和select up to 1 rows返回第一条匹配给定条件的记录。它可能不是唯一的,给定条件有可能匹配多条记录。
  • 对于oracle数据库而言,select single会被转换为select ... up to 1 rows,因此,它们是一样的。只不过ABAP的语法不允许将order by和select single放在一起用,但是允许其和select...up to 1 rows一起用。因此,如果你想获得最高/最低的一条记录,是不可以用select single的,只能用select ... up to 1 rows where ... order by.

join和for all entries in哪个性能好?

绝大多数场景下,inner join比for all entries in要好,应当被首先采用。只有当可能出现性能问题的时候才要用for all entries in,要仔细地测量更换为for all entries in前后的性能变化以验证是否真的有提升。

需要首先在一个测试程序上运行for all entries in并运行sql追踪以观察其效果。某些由BASIS设定的选项可以使for all entries in作为“OR”条件运行。这意味着如果使用for all entries in筛选的表有3条数据

,SQL追踪会显示3个SQL在执行。在这种情况下,使用for all entries in没意义。然而如果SQL追踪显示一条SQL语句,这时for all entries in是有用的,因为它实际上被当作一个in列表来执行。

比起for all entries in,更加推荐使用join。join连接的表的数量并没有实际的限制;不过太复杂的句子会难以维护,如果join里面有什么问题,也比较难以解决。如果join是使用两个表的键来连接的话,会减少程序负担,提高性能。

在某些场景下,你会需要以内表作为条件。此时,你可能没别的选择,只能用for all entries in了。

下面是使用了join的代码:

SELECT A~VBELN A~KUNNR A~KUNAG B~NAME1
INTO TABLE I_LIKP
FROM LIKP AS A
  INNER JOIN KNA1 AS B
    ON A~KUNNR = B~KUNNR.
* For with limited data using for all entries:
* Minimize entries in I_likp by deleting duplicate kunnr.
LOOP AT I_LIKP INTO W_LIKP.
  W_LIKP2-KUNAG = W_LIKP-KUNAG.
  APPEND W_LIKP2 TO I_LIKP2.
ENDLOOP.
SORT I_LIKP2 BY KUNNR.
DELETE ADJACENT DUPLICATES FROM I_LIKP2 COMPARING KUNNR.
* GET DATA FROM kna1
IF NOT I_LIKP2[] IS INITIAL.
  SELECT KUNNR NAME1
    INTO TABLE I_KNA1
    FROM KNA1
    FOR ALL ENTRIES IN I_LIKP2
    WHERE KUNNR = I_LIKP2-KUNNR.
ENDIF.

使用collect语句来在内表中求和

使用collect,而不是自定义逻辑来求和。对哈希表使用collect会很高效。

避免嵌套循环

例如:

LOOP AT ITAB1.

  LOOP AT ITAB2 WHERE F1 = ITAB1-F1.

    ....

  ENDLOOP.

  ENDLOOP.

在生成环境下,这样的代码可能会很慢甚至超时dump。

我们可以使用附加关键字binary search来改善性能。更好的是——使用哈希表或者排序表。

SORT ITAB2 BY F1.
LOOP AT ITAB1.
  READ TABLE ITAB2 WITH KEY F1 = ITAB1- BINARY SEARCH. "f1 is any field of itab1
  IF SY-SUBRC = 0.
    IDX = SY-TABIX.
    LOOP AT ITAB2 FROM IDX.
      IF ITAB2-F1 <> ITAB1-F1.
        EXIT.
      ENDIF.
      ....
    ENDLOOP.
  ENDIF.
ENDLOOP.

如果你有一个排序表,内表可以这样读取:

TYPES: BEGIN OF ITAB,
F1 TYPE MARA-MATNR,
....
*NOT ONLY THE KEYFIELD !!
END OF ITAB.
DATA: ITAB2 TYPE SORTED TABLE OF ITAB WITH UNIQUE KEY F1.
LOOP AT ITAB1.
  LOOP AT IATB2 WHERE F1 = ITAB1. "f1 is any field of itab1
  ....
  ENDLOOP.
ENDLOOP.

本文链接:http://www.cnblogs.com/hhelibeb/p/7043998.html

原文标题:ABAP Performance and Tuning

时间: 2024-10-13 11:23:56

ABAP性能和优化的相关文章

android入门开发教程之网络性能的优化

我在麦子学院上android开发的时候,麦子学院android开发老师讲到Android开发过程中经常会涉及到性能优化的问题,应该从基础.网络.测试等各个层面进行整合优化.现在咱们聊聊Android开发之网络性能的优化. 1)避免频繁网络请求 访问server端时,建立连接本身比传输需要跟多的时间,如非必要,不要将一交互可以做的事情分成多次交互(这需要与Server端协调好).有效管理Service 后台服务就相当于一个持续运行的Acitivity,如果开发的程序后台都会一个service不停的

能否针对容量和性能来优化数据中心的存储?Adaptec by PMC解决方案给你肯定的答案

能否针对容量和性能来优化数据中心的存储? Adaptec by PMC解决方案给你肯定的答案 Dave Berry 可能需要一个数据中心来帮助我记录下曾访问过的遍布全球的数据中心.然而,无论其地理位置,无论其服务的市场,所有的数据中心都有一个共同的使命:即用最少的资源.以最高的性能.来提供尽可能多的服务. 企业与用户两方面均需要快速而安全可靠的数据访问,另一方面,暴涨的存储内容迫使数据中心不得不添加越来越多的存储容量,同时还要维持客户所期望的高性能. 问题就在于找到一个有效的途径,既能处理日益增

移动端网站提升页面加载性能的优化技巧

移动端网站提升页面加载性能的优化技巧 收藏到:1时间:2015-06-17   文章来源:马海祥博客   访问次数:2501 网页性能的优化一直是网站成功的关键,越来越多的研究证明,不管是小型电商,还是大型连锁企业,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的广告收入,更多的用户粘性和更多的客户满意度. 在过去几年,Web开发者都是基于改善硬件或者提高带宽速度来优化用户体验,但是最近几年,爆炸式的移动Web浏览器的使用打破了这个途径,低带宽,高延迟,小内存,低处理器性能的移动设

网页性能智能优化——Apache扩展mod_pagespeed

本文主要介绍出自谷歌公司的Apache扩展模块mod_pagespeed.该模块的目标是提高网页的加载速度.具体的实现方法主要是通过优化html代码.css代码.js代码.缩放图片来减少请求数量.请求流量,从而提高网页的加载速度. ? 我们首先展示一下插件的效果.下图是还没有开启mod_pagespeed模块的情况. 在这种情况下,页面中充斥着大量空格,以及很长的变量名称和函数名称.其实对于正式运行的系统来说这些空格和名称都是一种浪费.而且将网页的源代码暴露在外,对于安全性要求比较高的网站,这种

[转载]双线性插值算法进行图像缩放及性能效果优化

原文地址:双线性插值算法进行图像缩放及性能效果优化 一)转自http://handspeaker.iteye.com/blog/1545126 最近在编程时用到了双线性插值算法,对图像进行缩放.网上有很多这方面的资料,介绍的也算明白.但是,这些文章只介绍了算法,并没有具体说怎么实现以及怎么实现最好,举个例子,你可以按照网上文章的算法自己写一个双线性插值程序,用它对一张图片进行处理,然后再用matlab或者openCV的resize函数对同一张图片进行处理,得到的结果是不一样的,如果源图片较小,效

Android-优化UI性能(5)-优化布局文件

Android-优化UI性能(5)-优化布局文件 1,使用观察布局的工具:Hierarchy Viewer 这时Android用来观察布局的工具,层级观察器, 它是一个优秀的布局优化工具和观察工具 该工具在sdk目录下的tools文件夹 **2,使用布局优化工具:**lint以前叫做layoutopt API16后改为lint,来检测项目的问题 \sdk\tools\lint.bat 版权声明:欢迎交流指正文章的错误,必定虚心接受,QQ872785786

oracle数据性能库优化方案精髓整理收集回顾

oracle数据库性能优化总体法则: 一.减少数据访问(减少硬盘房访问次数) 二.返回更少的数据(减少网络传输或磁盘访问) 三.减少交互次数(减少网络传输) 四.减少服务器开销(减少cpu及内存开销) 五.利用更多的资源(增加资源) ===================具体说明================= 一.减少数据访问(减少硬盘房访问次数) 1.减少数据访问 1.1.创建并使用正确的索引 索引会大大增加DML(增删改)的开销[合理的索引会大大提高效率100倍.1000倍,但不合理的索

Android-优化UI性能(3)-优化Activity的背景图片

Android-优化UI性能(3)-优化Activity的背景图片 某些时候,我们可能希望尽可能提高Activity的性能,这时候就可以开率优化Activity的背景图 首先,在Activity中,不只有你使用的setContentView()使用的View,还包含一些其他的view 如下图: 在默认情况下,DecorView就包含一个默认的背景图,要优化Activity就可以以此为出发点 1,使用 getWindow().setBackgroundDrawable(drawable) getW

mysql性能及优化探讨

最近在公司内部进行了一次mysql性能和优化相关的内部分享,放在这里备忘,同时也希望能跟大家交流相关的话题,整理自书本及网络上的文章,感谢相关内容的作者 在百度文库上有,可以点击这里