[SAP ABAP开发技术总结]ABAP调优——Open SQL优化

 

11.1.     数据库编程方面优化

1.   不要使用 SELECT * ...,选择须要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存数据库

2.   不要使用SELECT DISTINCT ...会绕过缓存,可以使用 SORT BY + DELETE ADJACENT DUPLICATES 代替express

3.   少用相关子查询,由于子查询对外层查询结果集中的每条记录都会执行一次编程

4.   少用嵌套SELECT … ENDSELECT,可使用联合查询或FOR ALL ENTRIES来替换,减小循环次数缓存

5.   若是肯定只查一条数据时,使用 SELECT SINGLE... 或者是 SELECT ...UP TO 1 ROWS ...服务器

6.   统计时,直接使用SQL聚合函数,而不是将数据读取出来后在程序里再进行统计网络

7.   使用游标读取数据,这样省掉了将从数据库中的取记录放入内表的INTO语句这一过程开销函数

8.   多使用inner join,必要时才使用left join性能

9.   inner join条件放置的位置应该按照 OnWhereHaving的顺序放,由于SQL条件的的执行通常是按这个顺序来执行的,将条件放在最开始执行,则可过滤掉大部数据;但要注意Left Outer Join,是否能够将ON中的条件移动到Where从句则要考虑(若是真能放在Where从句中,则应该使用Inner Join,而非Left Outer Join,由于Where条件会过滤掉哪些包括在右表中不存在的左表数据),由于此时条件放在On后面与放在Where语句后面结果是不同的(由于无论on中的条件是否为真,左表中在右边表不存在的数据也会被返回,但如放在where条件中,则会对On产生的数据再次过滤的条件,会滤掉不知足条件的记录——包括左表在右表中找不到的记录,这时已经没有left join的含义)优化

10.  要根据主键或索引字段查找数据,且WHERE从句中的条件字段需按INDEX字段顺序书写,且将索引字段条件靠前(左边),如:在VBFA表中查找SO所对应的交货单DN,由于若是直接到LIPS中找时,SO的订单中号与行号在LIPS中非主键,但在VBFA是部分主键VBFA中根据部分主键查找 SO -> DN; 根据索引查找 SO -> PO,VBFA-VBELN+VBFA-POSNN组合字段上建立了索引,即根据SOPO时,不要从EKKN关联表中查找,而是经过VBFA中查找后来查看EKKN,发如今VBELN+VBELP字段上建立了索引,因此从VBFAEKKO查找应该差很少,主要看哪一个表数据量少的问题了spa

检查条件组合字段是不是主键,或者是上在上面建立了索引,避免条件组合字段即不是主键又没有索引

11.使用部分索引字段问题:若是一个索引是由多个字段组成的,只使用一部分关键字段来进行查询时,也是可使用到索引,但使用时要注意要按照索引定义的顺序且取其前面部分

12.  根据索引字段进行ORDER BY,不然经过程序进行SORT BY。与其在数据库在经过非索引字段进行排序,不如在程序中使用SORT BY语句进行排序,由于此状况下应用服务器上的执行速度要比数据库服务器快(应用服务器上采用的是内存排序)

13.避免在索引字段上使用:

l  not<>!=IS NULLIS NOT NULL

l  避免使用 LIKE,但LIKE '销售组1000'LIKE '销售组1000%'能够用到,而LIKE '%销售组1000'(百分号前置)则用不到索引

l  不要使用OR来链接多个索引字段;对于同一索引字段,可使用IN来替代OR

image094[4]
image095[4]

14.避免使用如下语句,由于使用这些语句时,不能使用 Table Buffer

l  Aggregate expressions

l  Select distinct

l  Select …for update

l  Order bygroup byhaving从句

l  Joins,使用JOIN时,会绕过SAP缓存,可使用FOR ALL ENTRIES来代替

l  WHERE从句中使用Sub queries(子查询)

l  WHERE从句中使用IS NULL条件

15.在下面状况下使用FOR ALL ENTRIES IN:

l  在循环内表 LOOP...AT Itab中循环访问数据库

l  簇表是禁止JOIN的表类型, 当须要联接簇表查询数据时,如:BSEG(会计凭证)、KONV(条件表)

簇表通常是由多个表组成,簇表中的数据来自于多个表,有点像视图,但不能直接经过簇表进行数据维护

l  JOIN超过3个表会出现性能问题, 当使用JOIN联接的表超过3个时

l  若是两个表的数据很是大时(上百万),使用JOIN进行联合查询会很慢,此时改用FOR ALL ENTRIES IN

16.使用内表批量操做数据库,而不要使用工做区一条条操做,如:

SELECT ... INTO TABLE itab
INSERT dbtab FROM TABLE itab
DELETE
dbtab FROM TABLE itab
UPDATE/MODIFY
dbtab FROM TABLE itab

17.若是你使用 CLIENT SPECIFIED,需在WHERE从句第一个位置上指明 MANDT条件,不然使用不到索引

相关文章
相关标签/搜索