降低CPU负荷(减少循环次数)、降低DB负荷(减少IO操作)、降低内存使用(减少内表大小)
10.where 条件里面多用索引、主键,顺序也要遵循小表-大表
11.inner join条件放置的位置应该按照 On、Where、Having的顺序放,因为SQL条件的的执行一般是按这个顺序来执行的,将条件放在最开始执行,则可过滤掉大部数据;但要注意Left Outer Join,是否可以将ON中的条件移动到Where从句则要考虑(如果真能放在Where从句中,则应该使用Inner Join,而非Left Outer Join,因为Where条件会过滤掉那些包括在右表中不存在的左表数据),因为此时条件放在On后面与放在Where语句后面结果是不一样的(因为不管on中的条件是否为真,左表中在右边表不存在的数据也会被返回,但如放在where条件中,则会对On产生的数据再次过滤的条件,会滤掉不满足条件的记录——包括左表在右表中找不到的记录,这时已经没有left join的含义)
检查条件组合字段是否是主键,或者是上在上面创建了索引,避免条件组合字段即不是主键又没有索引
14.使用部分索引字段问题:如果一个索引是由多个字段组成的,只使用一部分关键字段来进行查询时,也是可以使用到索引,但使用时要注意要按照索引定义的顺序且取其前面部分
16.避免在索引字段上使用:
not、<>、!=、IS NULL、IS NOT NULL,**可以用> 与 < 来替代
避免使用 LIKE,但LIKE '销售组1000’和LIKE '销售组1000%'可以用到,而LIKE ‘%销售组1000’(百分号前置)则用不到索引
不要使用OR来连接多个索引字段(但同一字段多个值之间可以使用OR);对于同一索引字段,可以使用IN来替代OR:
带有BETWEEN 的WHERE 条件不能通过索引来搜索?也可使用IN代替
17.避免使用以下语句,因为使用这些语句时,不能使用 Table Buffer
18.在下面情况下使用FOR ALL ENTRIES IN:
簇表一般是由多个表组成,簇表中的数据来自于多个表,有点像视图,但不能直接通过簇表进行数据维护
19.使用内表批量操作数据库,而不要使用工作区一条条操作,如:
SELECT … INTO TABLE itabINSERT dbtab FROM TABLE itabDELETE dbtab FROM TABLE itabUPDATE/MODIFY dbtab FROM TABLE itab
20.如果你使用 CLIENT SPECIFIED,需在WHERE从句第一个位置上指明 MANDT条件,否则使用不到索引
在没有用二分查找的情况下,可在查询组合字段上创建第二索引(哈希或排序索引),则在读取或循环内表时会自动使用二分查找或哈希查找算法
10.不要使用混合类型进行计算与比较,除非有必须
11.尽量使用静态语句,少用动态编程,动态编辑虽然灵活,但性能有所下降
12.在对字符进行操作进,尽量使用String代替C固定长度类型,如:concatenate[k?n?kat?ne?t]语句对固定长度的C连接时,会去扫描那些非空字符出来再进行连接,速度没有String快
13.READ/MODIFY TABLE时使用TRANSPORTING只读取或修改必要的字段 [tr?ns?p?:t]
14.尽量避免使用MOVE-CORRESPONDING和 SELECT…INTO CORRESPONDING FIELDS OF [TABLE] (SELECT时,查询几个字段就定义具有这几个字段的内表,而不是直接使用基于数据库表类型创建的内表,否则如果直接使用 INTO TABLE语法检查时会警告,但结果是没有问题的)。CORRESPONDING语句在系统内部存在隐式操作: 逐个字段的检查元素名称匹配; 检查元素类型匹配;元素类型转换;[?k?ris?p?ndi?]
15.最好不要向排序内表中插入(INSERT … INTO TABLE …)数据,因为在插入时会进行排序,速度会随着数据量的增加而慢下来,所以最好只向标准内表或哈希表中插入数据
16.将某个内表中的全部记录或部分记录追加到另一内表时,使用INSERT/APPEND LINES OF … 代替循环逐条追加;如果是全新赋值,直接对内表使用“=”进行赋值操作即可
17.调用类方法要快于Function:
Calling Methods of global Classes: call method CL_PERFORMANCE_TEST=>M1.
Calling Function Modules: call function ‘FUNCTION1’.
18.通过运行事务代码SLIN(或者直接通过SE38的菜单),进行代码静态检查,根据SAP提供的反馈信息,优化代码
19.通过老式方式定义内表时,使用OCCURS 0 而非OCCURS n :[??k?:s] 重现
20.使用完成后及时清空释放内表所占用的空间:FREE .
21.使用CASE…WHEN语句代替 IF…ELSEIF…;使用WHILE…ENDWHILE 代替 DO…ENDDO
22.LOOP循环内表时加上Where条件减少CPU负荷,而不是在循环里通过IF语句来过滤数据