临上线了,需求还在改,报表也得改,需求满足了,程序性能又不满足了,净折腾啊. 可客户是付钱的上帝,所以程序要调优要改进,不然,要钱不给!
SAP 系统是经典的三层架构,分为DB, 应用服务器,展示层三层.ABAP程序运行在应用服务器层,访问的数据存储在DB,而我们要做的就是把数据从DB中取出来,然后送到展示层以展现给用户. 而这里DB是作为集中式资源存在的,难以水平扩展,而应用服务器则可以水平进行扩展以满足系统性能需求.所以,调优要尽可能地优先在应用服务器做,其次在 DB层.而报表程序中,往往对数据库的访问会占用大部分的程序运行时间,而且在SAP系统中,业务数据表数据量都很大, 在实现业务逻辑时,要考虑到OpenSQL的效率问题.
1. 避免Table full scan, 尽可能的使用表的索引.
在使用索引时,索引的字段要匹配其顺序,并且索引的字段要尽可能靠前. 可以使用ST05查看程序使用索引的情况.
另外,有一些表并没有直接的索引字段,譬如SD中的表如VBRK等,可以通过索引表VBRKPA等预先取得主键再去访问VBRK.
有意思的是在 的DDIC透明表在ORACLE中并没有真正的主键,而是将DDIC的主键字段作为primary index使用的.
2. 对于FOR ALL ENTRIES 的使用
它一般是根据内表中记录的数量分割成多条SQL语句来执行,所以当内表比较大时,使用FOR ALL ENTRIES对程序运行时间有影响,使用时多考虑.
另外,连接的内表中不要有重复纪录,这样会重复对数据库的访问.
3. 直接将数据缓存在内表
譬如在访问如Sales office等数据量不大的主数据表时,可以将记录预先读出.
4. 使用 database hints
这是杀招,谨慎使用.
它是一些基于特定数据库的优化技巧,使用这些技巧可以影响数据库优化器对表使用的访问策略. 注意,ABAP语法并不能检查它的对错,一定要保证hints的正确性, 另外它只能用于透明表.
示例:
%_HINTS ORACLE 'LEADING(T_01) USE_NL (T_00 T_02)'.
使用T_01作为首要访问的表,并将T_00作为内部表联接.
Note 129385 - Database hints in Open SQL
Note 130480 - Database Hints in Open SQL for Oracle