select/end select与loop类似是循环(一个是对数据库表,一个是对内表)
select *效率低于select 字段1 字段2...
select 主键1 主键2 主键3 非主键4效率高于select 主键1 主键2 非主键4.
into table 内表效率高于into corresponding fields of table 内表(into table 内表要注意内表的结构字段顺序)
表中取值语句的where条件
条件中单值条件放在前面(效率回更高)
例如where spras = sy-langu
and matnr in s_matnr.
其中范围的条件往后放> >= < <= <>都是范围条件
指针的的指向效率高于向工作区传值。
TRANSPORING NO FIELDS. 作用只读取不传值. 故gs_makt为空 同样也能加快read的效率.
效率低下代码
优化后
描述文字类字段要注意spras主键语言选取.
check效率比if效率更高,也比case效率高
check>case>if.
clear 工作区的必要性
loop是会按照依次读内表是 不需要提前手动清空
read效果与loop一样,但会出现读取数据读不到.所以需要读前清空
move需要看情况而定
TYPES:BEGIN OF ty_list,
val TYPE C,
name(4),
END OF ty_list.
DATA:gs_list TYPE ty_list,
gt_list TYPE TABLE OF ty_list WITH HEADER LINE.
DO 9 TIMES.
gs_list-val = sy-INDEX.
CONCATENATE '张' gs_list-val INTO gs_list-NAME.
APPEND gs_list TO gt_list.
ENDDO.
DO 2 TIMES.
WRITE:/ SY-INDEX.
LOOP AT gt_list INTO gs_list.
CHECK gs_list-val < 6.
WRITE:/ gs_list-val, gs_list-NAME.
ENDLOOP.
ENDDO.
CHECK在loop中相当于if中包continue.
一、性能调优工具
SE30/SAT
运行时间分析工具(旧):se30 运行时间分析工具(新):SAT
SE30主要提供看程序运行的总体时间(数据库、应用服务器成的总共运行时间)。通过输入事务码SE30进入运行分析初始界面如下图,输入需要运行的程序明细会事务代码,点击执行。
程序执行完成后,点击评估可查看程序总体运行时间图如下:
Settings:用来设置SAT运行属性的变式,默认为default,可以参照创建一个符合自己需求的变式。
执行之后可以在Evaluate页签下查看执行的分析文件
ST05
不仅提供SQL trace,还可以进行buffer trace,RFC trace等,看看语句执行耗时,分析是否有重复从一个表中抓取数据,对于耗时较长的取数语句,分析查询语句是否可优化
ST12
二、性能调优tips
数据库取数 、降低CPU负载、降低数据库负载(减少IO操作)、内存使用的优化
尽可能减少从数据库中取数的次数
在取数时尽可能只取自己需要的数据,尽量避免使用select * 这样的全量查询,相比 selcet ....INTO CORRESPONDING 的语句selcet ...into table会更有优,尽量避免使用MOVE-CORRESPONDING和INTO CORRESPONDING FIELDS OF,CORRESPONDING语句在系统内部存在隐式操作:元素名称匹配,元素类型匹配,元素类型转换。
读取数据内表时使用二分法查找会提高读数效率,read binary search ,记得读取之前先按关键字排序(备注:降序排序二分法查找就不生效了),二分法查找的速度很快,最大查询次数为log2n。也可以将内表定义为SORTED TABLE(顺序表是在计算机内存中以数组的形式保存的线性表,是指用一族地址连续的存储单元一次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中),当使用READ TABLE语法时,如果查询字段跟SORTED TABLE的排序开始字段能匹配上,则SAP将自动采用二分法查找,需要注意的是如果read table并非SORTED TABLE的第一排序字段,系统将采用顺序查找,速度会慢很多。对于STANDARD TABLE和使用SORTED TABLE进行二分法查找,二者区别如下 : (a、SORTED TABLE自始至终都保持排序,如果需要对内部进行频繁的插入、删除操作,则不推荐使用SORTED TABLE。 b、 如果我们要用的是类似LOOP AT it_lips WHERE....的语法时SORTED TABLE,系统会自动采用二分法优化查找过程) 。
内表类型 | 访问方式 | 主键 | 推荐方式 | 查找算法 |
---|---|---|---|---|
标准表 | 索引访问、键值访问 | NON-UNIQUE KEY | 索引访问 | 顺序查找法、二分查找法 |
排序表 | 索引访问、键值访问 | NON-UNIQUE KEY 、UNIQUE KEY | 键值访问 | 二分查找法 |
哈希表 | 键值访问 | UNIQUE KEY | 键值访问 | 哈希算法 |
当数据较小(小于100行)并既需要使用索引访问,又需要通过不同的键值访问时,建议使用标准表,数据量比较巨大,且不存在重复行,只需使用关键字访问的内表应定义为哈希表,排序表适用于运行期内必须以某种排序形式出现的内表。
使用inner join查询数据时,尽可能不要关联太多表,如果需要尽可能将有效查询条件放在前面(小表-大表),让查询第一个表后结果集尽可能小,各表之间进行连接的时候,应考虑关键字段或索引字段的作用,Where也要准遵循小表-大表。
尽可能避免嵌套循环。
适当使用索引,好的索引会很大程度提升性能。
查询数据时使用in会比使用not in 语句更佳,同时使用eq、ne会比使用=、<>更优。
loop at a where ..... endloop.使用优化
适时使用数据库中的聚合函数SUM.AVG,MAX.MIN.DISTICNT等。
使用第二索引提升性能查询。经常更新的表,不适合创建索引
内表求和,能够在SQL层次上实现就用SQL实现,不能实现的,在内表中使用at end of 之类进行求和。
用append lines of ***to ***,代替在循环中单条添加。
使用较高效的COLLECT 语句对记录进行聚集加总(备注:COLLECT 语句的效率只体现在当你使用的是排序表和哈希表的时候,或者内表经过有效排序之后。否则当内表数据过多时,检索时间会很长,一般不推荐使用记录条数非常多的标准表)
尽量不要在频率较高的循环语句中使用update,delete,insert,modify等操作。
使用up to n rows 来实现对数据前n项的查询
loop循环时,不要使用check语句对table进行查询,用where语句代替
OCCURS n 代表初始化内表的空间大小为n,当内表存储记录条数超出n时,系统将依靠页面文件存放超出部分的数据。当系统内存资源十分紧缺的时候,我们可以使用OCCURS n 的初始化方法,但是这样的效率稍微慢点。OCCURS 0 代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时,内表所使用的内存空间不断扩大,直到系统无法分配为止。使用内存比使用页面交换更快一些,但是要考虑系统的资源状态。
SAP ABAP程序性能优化-养成良好的代码习惯_ᝰ随心ꦿེএ的博客-CSDN博客
SAP性能优化_sap se30-CSDN博客