请教ABAP性能优化-关于MSEG

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教ABAP性能优化-关于MSEG相关的知识,希望对你有一定的参考价值。

因为查询条件没有用到有索引的字段,所以报表要查询MSEG时候使用的特别慢,有时还慢的跑不出来。请问各位有什么好办法?谢谢?

参考技术A 第一种的话好象字段要求多也不是很现实,业务部门因业务需求很大程度上输入的查询条件都是比较少的。而且如果查询的字段不是有索引的,都会很慢。第二种精简表也只不过数据少点,如果没有索引,还是比较慢,而已还要再写个出口程序,会不会有问题啊?如果在MSEG上建多几个索引,这样会不会快点?建索引是在后台去建吧? 参考技术B 因为MSEG表的数据量本身就很大,而且相信你家公司有关生产、库存、财务的报表数据恐怕都来源于这张表吧。所以,建议你做个MSEG与MKPF的join。当然了,你做个视图也是可以的。从使用范围及长远来看,弄个简化表还是可行的。 参考技术C 简化表占空间,我倒觉得你说的视图可行。 做几个分别属于业务量大的工厂的MSEG视图,再根据查询条件给视图增加索引,这样不占空间。还有请问一下 SELECT mblnr matnrINTO TABLE t_mseg from mseg 会比SELECT mblnr matnrINTO CORRESPONDING FIELDS OF TABLE t_mseg from mseg快吗?我从SAP优化文档里看到的。但自己测试来看,好象差不了几秒。我测试都是拿MSEG来测的 参考技术D 你这种能不能快点呢?我没试过。索引是在哪建?SAP?ORACLE?还要加上%_hints oracle 'index(MSEG "ZINDEX") 吗?

ABAP 内表的行列转换-NEW

REPORT Z_TEST_COL_TO_ROW.

TYPE-POOLS: slis.
TABLES: mseg,mkpf.
DATA: gd_fieldcat TYPE slis_t_fieldcat_alv.
DATA: sla TYPE slis_layout_alv ,
      ivariant LIKE disvariant,
      i_repid LIKE sy-repid ,
      i_excluding TYPE slis_t_extab.
TYPESBEGIN OF ty_sum ,
        werks LIKE mseg-werks ,
        matnr LIKE mseg-matnr ,
        lgort LIKE mseg-lgort ,
        bwart LIKE mseg-bwart ,
        menge LIKE mseg-menge ,
END OF ty_sum.

DATA : itab TYPE STANDARD TABLE OF ty_sum WITH HEADER LINE .
DATA : hs_sum TYPE HASHED TABLE OF ty_sum WITH UNIQUE KEY werks matnr lgort bwart WITH HEADER LINE .
DATA : itab_sum TYPE STANDARD TABLE OF ty_sum WITH HEADER LINE .
DATABEGIN OF itab_out OCCURS 0,
        werks LIKE mseg-werks ,
        matnr LIKE mseg-matnr ,
        lgort LIKE mseg-lgort ,
        menge01 TYPE ,
        menge02 TYPE ,
        menge03 TYPE ,
        menge04 TYPE ,
        menge05 TYPE ,
        menge06 TYPE ,
        menge07 TYPE ,
        menge08 TYPE ,
        menge09 TYPE ,
        menge10 TYPE ,
        menge11 TYPE ,
        menge12 TYPE ,
        menge13 TYPE ,
        menge14 TYPE ,
        menge15 TYPE ,
        menge16 TYPE ,
        menge17 TYPE ,
        menge18 TYPE ,
        menge19 TYPE ,
        menge20 TYPE ,
        menge21 TYPE ,
        menge22 TYPE ,
        menge23 TYPE ,
        menge24 TYPE ,
        menge25 TYPE ,
        menge26 TYPE ,
        line_sum TYPE ,
END OF itab_out.

TYPESBEGIN OF ty_bwart ,
      bwart LIKE mseg-bwart ,
END OF ty_bwart.

DATA : hs_bwart TYPE HASHED TABLE OF ty_bwart WITH UNIQUE KEY bwart WITH HEADER LINE .
DATA : itab_bwart TYPE STANDARD TABLE OF ty_bwart WITH HEADER LINE .
FIELD-SYMBOLS: <f_fs1> ,
<f_fs2>.
DATA: max_count TYPE .
SELECT-OPTIONS:
      s_mblnr FOR mseg-mblnr ,
      s_budat FOR mkpf-budat .
PARAMETERS: p_sum AS CHECKBOX .

START-OF-SELECTION.
PERFORM getdata.
PERFORM fixdata.

IF p_sum ‘X‘.
    PERFORM outdata.
ELSE.
    PERFORM outdata2.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
FORM getdata.
SELECT werks matnr lgort bwart menge INTO TABLE itab
    FROM mkpf INNER JOIN mseg ON mkpf~mblnr = mseg~mblnr AND
          mkpf~mjahr = mseg~mjahr
    WHERE mkpf~mblnr IN s_mblnr AND
          mkpf~budat IN s_budat .
ENDFORM" GETDATA
*&---------------------------------------------------------------------*
*& Form FIXDATA
*&---------------------------------------------------------------------*
FORM fixdata.
DATAindex LIKE sy-tabix .
LOOP AT itab.
      hs_sum = itab.
      COLLECT hs_sum.
            hs_bwart = itab-bwart .
      COLLECT hs_bwart.
ENDLOOP.

SORT hs_bwart.
      itab_bwart[] = hs_bwart[].
      itab_sum[] = hs_sum[].
LOOP AT itab_sum.
    itab_out-werks = itab_sum-werks .
    itab_out-matnr = itab_sum-matnr .
    itab_out-lgort = itab_sum-lgort .
READ TABLE itab_bwart WITH KEY bwart = itab_sum-bwart .
index = sy-tabix + 3.
ASSIGN COMPONENT index OF STRUCTURE itab_out TO <f_fs1>.
<f_fs1> = itab_sum-menge.
itab_out-line_sum = itab_sum-menge.
COLLECT itab_out.
CLEAR itab_out.
ENDLOOP.
ENDFORM" FIXDATA
*&---------------------------------------------------------------------*
*& Form outdata
*&---------------------------------------------------------------------*
FORM outdata.
PERFORM fieldcat_init .
sla-colwidth_optimize ‘X‘.
sla-zebra ‘X‘.
i_repid = sy-repid.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY‘
EXPORTING
i_callback_program = i_repid
it_fieldcat = gd_fieldcat[]
i_save ‘A‘
is_variant = ivariant
is_layout = sla
it_excluding = i_excluding
i_callback_user_command ‘USER_COMMAND‘
TABLES
t_outtab = itab_sum
EXCEPTIONS
program_error 1
OTHERS 2.
ENDFORM" outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init *
*---------------------------------------------------------------------*
FORM fieldcat_init .
PERFORM frm_catlg_set USING:
      ‘WERKS‘ ‘WERKS‘ ‘X‘ ,
      ‘MATNR‘ ‘MATNR‘ ‘X‘ ,
      ‘LGORT‘ ‘LGORT‘ ‘X‘ ,
      ‘BWART‘ ‘BWART‘ ‘X‘ ,
      ‘MENGE‘ ‘MENGE‘ ‘‘ .
ENDFORM"fieldcat_init
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
FORM frm_catlg_set USING p_field p_text  p_key.

DATA: ls_fieldcat TYPE slis_fieldcat_alv.
      ls_fieldcat-fieldname = p_field.
      ls_fieldcat-seltext_l = p_text.
      ls_fieldcat-key = p_key.
      IF p_field ‘LINE_SUM‘.
          ls_fieldcat-emphasize ‘C700‘.
      ENDIF.
APPEND ls_fieldcat TO gd_fieldcat .
CLEAR ls_fieldcat .
ENDFORM"frm_catlg_set
*&--------------------------------------------------------------------*
*& Form user_command
*&--------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
READ TABLE itab INDEX rs_selfield-tabindex.
CASE r_ucomm.
WHEN ‘&IC1‘"双击
WHEN ‘EXIT‘.
LEAVE PROGRAM.
ENDCASE.
rs_selfield-refresh ‘X‘"自动刷新
ENDFORM"user_com
*---------------------------------------------------------------------*
* FORM outdata2 *
*---------------------------------------------------------------------*
FORM outdata2.
PERFORM fieldcat_init2 . sla
-colwidth_optimize ‘X‘. sla
-zebra ‘X‘. i_repid 
= sy-repid.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY‘
EXPORTING i_callback_program 
= i_repid it_fieldcat 
= gd_fieldcat[] i_save 
‘A‘ is_variant 
= ivariant is_layout 
= sla it_excluding 
= i_excluding i_callback_user_command 
‘USER_COMMAND‘
TABLES t_outtab 
= itab_out
EXCEPTIONS program_error 
1
OTHERS 2.
ENDFORM" outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init2 *
*---------------------------------------------------------------------*
FORM fieldcat_init2 .
DATAc(2TYPE n , txt
(20TYPE .
PERFORM frm_catlg_set USING:       
‘WERKS‘ ‘WERKS‘ ‘X‘ ,       
‘MATNR‘ ‘MATNR‘ ‘X‘ ,       
‘LGORT‘ ‘LGORT‘ ‘X‘ .
LOOP AT hs_bwart .
c + 1.
CONCATENATE ‘MENGE‘ INTO txt.
PERFORM frm_catlg_set USING: txt hs_bwart-bwart ‘‘ .
ENDLOOP.
PERFORM frm_catlg_set USING‘LINE_SUM‘ ‘SUM‘ ‘‘ .
ENDFORM"fieldcat_init

以上是关于请教ABAP性能优化-关于MSEG的主要内容,如果未能解决你的问题,请参考以下文章

iOS性能优化总结

关于前端性能优化问题,认识网页加载过程和防抖节流

关于有效的性能调优的一些建议

关于java内存优化和性能优化

关于React性能优化

OO_Unit2 关于性能优化与测试的那些事