`
王三
  • 浏览: 170715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ABAP 报表程序OpenSQL性能调优

    博客分类:
  • ABAP
阅读更多

 临上线了,需求还在改,报表也得改,需求满足了,程序性能又不满足了,净折腾啊. 可客户是付钱的上帝,所以程序要调优要改进,不然,要钱不给!

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

 

0
0
分享到:
评论
2 楼 王三 2009-12-30  
ai2ming 写道
hints不对不会造成dump的,在oralce里面如果hints里面的信息错误,会把hints当成注释处理。

  SELECT SINGLE matnr
    INTO matnr
    FROM mara
    WHERE matnr = 'C075'
  %_HINTS ORACLE 'INDEX(MARA~Z99)'.

Z99的索引其实不存在,这时候程序照常运行。


谢谢指正. dump掉是因为数据的问题.
1 楼 ai2ming 2009-12-29  
hints不对不会造成dump的,在oralce里面如果hints里面的信息错误,会把hints当成注释处理。

  SELECT SINGLE matnr
    INTO matnr
    FROM mara
    WHERE matnr = 'C075'
  %_HINTS ORACLE 'INDEX(MARA~Z99)'.

Z99的索引其实不存在,这时候程序照常运行。

相关推荐

Global site tag (gtag.js) - Google Analytics