性能调优:SD自开发程序

SAP notes: 185530

症状:
自开发程序和程序增强运行很慢。当访问SAP SD表:VBAK,VBAP,VMVA,LIPS,VBRK,VBRP,VBFA时,性能很差。
理由和需求:
R/3系统发布的时候,大部分SD事物数据表没有第二索引。取而代之的是R/3系统有专有的
高效访问索引表(销售文档索引,例如表VAKPA,VAPMA匹配的表是M_VMVAB,M_VMVAC
或者配置的视图是M_VMVAA, M_VMVAE)
注意下面的警告:
    - 在高效使用列出的备选方案之前,必须仔细检查程序的功能准确性。
    - 销售文档的索引必须在系统中正确的维护。
考虑下面的标记:
下面的例子中,经常访问几个表,例如:
   SELECT FROM vakpa WHERE kunde = ... SELECT FROM vbak WHERE vbeln = vakpa-vbeln.
这样能提升性能,通过在相应的表上定义一个选择视图,把对两个表的读取合并为一次。
解决方案:
1.读取销售订单(VBAK,VBAP)
 a) 为客户编码搜索订单(字段 VBAK-KUNNR)
  错误: SELECT FROM vbak WHERE kunnr = ...
  正确: SELECT FROM vakpa WHERE kunde = ...
 b) 为物料编码搜索订单条目(字段 VBAP-MATNR)
  错误:  SELECT FROM vbap WHERE matnr = ...
  正确:  SELECT FROM vapma WHERE matnr = ...   SELECT FROM vbap WHERE vbeln = vapma-vbeln
 c)针对销售订单的其他搜索帮助提供匹配代码表和视图M_VMVAx,x.= A,B,C,...M;例如对用户,描述等等的采购订单的搜索。
2.访问发货(LIKP,LIPS)
 a) 为客户编码搜索发货(字段 LIKP-KUNNR)
   错误: SELECT FROM likp WHERE kunnr = ...
   正确:   SELECT FROM vlkpa  WHERE kunde = ... SELECT FROM likp WHERE vbeln = vlkpa-vbeln.
 b) 用物料编码搜索发货条目(字段 LIKP-MATNR)
   错误:SELECT FROM lips WHERE matnr = ...
   正确:  SELECT FROM vlpma WHERE matnr = ... SELECT FROM lips WHERE vbeln = vlpma-vbeln AND posnr = vlpma-posnn.
 c) 用销售订单号查找发货(前序文档 ,字段 LIPS-VGBEL)
  错误:SELECT FROM lips WHERE vgbel = ...
  正确:SELECT FROM vbfa WHERE VBELV = ... and VBTYP_N = 'J'     SELECT FROM lips WHERE vbeln = vbfa-vbeln and posnr = vbfa-posnn.
 d) 针对发货的其他搜索帮助提供匹配代码表和视图 M_VMVLx,x.= A,B,C,...M;例如对货物过账日期,捡配日期,运输计划日期等等的搜索。
3.访问发票(VBRK,VBRP)
  a) 用客户编码(“付账方”)搜索发票(字段 VBRK-KUNRG)
   错误: SELECT FROM vbrk WHERE  kunrg = ....
   正确: SELECT FROM vrkpa WHERE kunde = ... SELECT FROM vbrk WHERE vbeln = vrkpa-vbeln
 b)用物料编码搜索发票(字段 VBRP-MATNR)
  错误: SELECT FROM VBRP WHERE MATNR = ...
  正确: SELECT FROM VRPMA WHERE MATNR = ... SELECT FROM VBRK WHERE VBELN = VRPMA-VBELN AND POSNR = VRPMA-POSNR
 c) 用发货号搜索发票(前序文档 ,字段 VBRP-VGBEL)
 错误: SELECT FROM vbrp WHERE vgbel = ...
 正确: SELECT FROM vbfa WHERE vbtyp_n = 'M' AND vbelv  = ...    SELECT FROM vbrp WHERE vbeln = vbfa-vbeln AND posnr = vbfa-posnn 
 d) 用订单号搜索发票(前序文档 ,字段 VBRP-VGBEL)
错误: SELECT FROM vbrp WHERE aubel = ...
正确: SELECT FROM vbfa WHERE vbtyp_n = 'M' AND vbelv   = ...   SELECT FROM vbrp WHERE vbeln = vbfa-vbeln  AND posnr = vbfa-posnn
4. SD中的其他访问
a)文档流程
 错误:SELECT vbelv FROM vbfa WHERE vbeln ...
在vbfa表中前序文档用来查找后续文档(例如订单发货)。在这个表中搜索其他的方式是没有一样,
因为前序文档直接存储在这个文档表中。在vbfa表中只有一种查询方式。
正确: SELECT vgbel FROM lips WHERE vbeln = ...;
 or  SELECT vgbel FROM vbrp WHERE vbeln = ...;        
 or SELECT aubel FROM vbrp WHERE vbeln = ... 
b) 用发货查找运输单元条目
 错误: SELECT FROM vepo WHERE vbtyp = 'J' AND vbeln = i_lips-vbeln
 正确: SELECT FROM vbfa WHERE vbtyp_n = 'X' AND vbelv = i_lips-vbeln
           SELECT FROM vepo WHERE venum = vbfa-vbeln 

你可能感兴趣的:(性能调优:SD自开发程序)