Problema Performance

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • DavidXD_XD
    Moderator
    • ago
    • 1255

    #1

    Problema Performance

    Buenos dias gente .... tengo una consulta, esta relacionado a Performance, veran tengo un SELECT en el cual me trae todos los movimientos de la MSEG y la MKPF y la guardo dentro de una tabla interna gt_mseg la cual es de tipo HASHED con llaves en mblnr, mjahr y zeile y despues hago lo siguiente

    Código:
    SELECT a~mblnr a~mjahr
             zeile
             budat
             bwart matnr werks lgort charg bustm
             shkzg menge
             meins
             lifnr grund
             xblnr
             ummat umcha umwrk umlgo
      INTO CORRESPONDING FIELDS OF TABLE gt_mseg
      FROM mkpf AS a
           INNER JOIN
           mseg AS b
      ON a~mandt = b~mandt AND
         a~mblnr = b~mblnr AND
         a~mjahr = b~mjahr
      WHERE a~mjahr IN lr_mjahr AND
            a~budat >= gv_fechaini AND
            b~mjahr IN lr_mjahr AND
            b~matnr IN s_matnr AND
            b~werks EQ p_werks AND
            b~lgort IN s_lgort AND
            b~charg IN s_charg AND
            b~bustm NE 'MA02' AND
            b~bustm NE 'MA05' AND
            b~lgort NE space.
    
      LOOP AT gt_mseg ASSIGNING <gfs_mseg> WHERE bwart IN lr_bwart.
        IF <gfs_mseg>-matnr = <gfs_mseg>-ummat AND
           <gfs_mseg>-charg = <gfs_mseg>-umcha AND
           <gfs_mseg>-werks = <gfs_mseg>-umwrk AND
           <gfs_mseg>-umlgo IN s_lgort.
          DELETE gt_mseg WHERE mblnr = <gfs_mseg>-mblnr
                           AND mjahr = <gfs_mseg>-mjahr
                           AND zeile = <gfs_mseg>-zeile.
        ENDIF.
      ENDLOOP.
    El problema es que el SELECT me bota aproximadamente como un millon de registros y donde se demora el programa es en el LOOP, el LOOP ya lleva muchas horas y no acaba , xfa necesito sus sugerencias o una mejor forma d q el LOOP avance rapido, un saludo a todos !!!
    David Carballido Córdova
  • francesc
    Member
    • mar
    • 58

    #2
    Podrías probar a hacer un delete antes del loop.

    Comentario

    • DavidXD_XD
      Moderator
      • ago
      • 1255

      #3
      Listo gente ... gracias por la ayuda, hola francesc gracias a ti tbm por la ayuda ... ya pude resolverlo y en efecto era con un DELETE pero dentro del LOOP, derrepente me ekivoco pero siempre es bueno para poder saber q es errado algunas ideas q tienes, ahi va

      Como habia declarado la tabla interna gt_mseg como HASHED no permite modificaciones a nivel de campo y tampoco admite la funcionalidad del sy-tabix al momento del LOOP, si entramos al LOOP con una tabla hashed el sy-tabix no se refresca (lo mire y mire dentro del debugg), entonces no pude borrar el registro simplemente usando DELETE gt_mseg INDEX sy-tabix

      Para eso simplemente declare una tabla interna normal lt_mseg e hice lo siguiente

      Código:
      LOOP AT lt_mseg ASSIGNING <gfs_mseg> WHERE bwart IN lr_bwart
                                             AND umlgo IN s_lgort.
        IF <gfs_mseg>-matnr = <gfs_mseg>-ummat AND
             <gfs_mseg>-charg = <gfs_mseg>-umcha AND
             <gfs_mseg>-werks = <gfs_mseg>-umwrk.
            DELETE lt_mseg.
          ENDIF.
      ENDLOOP.
      En esta parte a diferencia de la otra no realizo doble consulta, como la tabla interna es recontra pesada es muy mala idea realizarle un DELETE WHERE ahi realizo doble consulta y lentea el proceso ... un saludo a todos !!!
      David Carballido Córdova

      Comentario

      • Turu
        Junior Member
        • mar
        • 6

        #4
        Hola,

        Lo primero; creo que en tu loop borras el registro al uqe apunta el field-symbol y no sé si eso te puede dar problemas.

        Segundo te pongo tu codigo modificado, creo que el resultado es el mismo, a ver si te vale:


        LOOP AT gt_mseg ASSIGNING <gfs_mseg> WHERE bwart IN lr_bwart.
        IF <gfs_mseg>-matnr = <gfs_mseg>-ummat AND
        <gfs_mseg>-charg = <gfs_mseg>-umcha AND
        <gfs_mseg>-werks = <gfs_mseg>-umwrk AND
        <gfs_mseg>-umlgo IN s_lgort.

        append <gfs_mseg> to gt_mseg_aux.
        ENDIF.
        ENDLOOP.

        sort gt_mseg_aux by mblnr mjjahr zeile.
        sort gt_mseg by mblnr mjjahr zeile.

        LOOP AT gt_mseg_aux into wa_mseg.
        IF wa_mseg-matnr = wa_mseg-ummat AND
        wa_mseg-charg = wa_mseg-umcha AND
        wa_mseg-werks = wa_mseg-umwrk AND
        wa_mseg-umlgo IN s_lgort.

        DELETE gt_mseg WHERE mblnr = wa_mseg-mblnr
        AND mjahr = wa_mseg-mjahr
        AND zeile = wa_mseg-zeile.

        ENDIF.
        ENDLOOP.


        Espero que te sirva de ayuda y mejore el rendimiento
        Turu

        Comentario

        • DavidXD_XD
          Moderator
          • ago
          • 1255

          #5
          Hola turu, esa parte si funcionaba, pero cuando paso a real sacaba mas de 1 millon de registros para procesar y consultar, obligado borre el DELETE WHERE para colocarle el DELETE INDEX sy-tabix, tbm no puse los tiempos, yo deje en JOB ese proceso a las 10pm del dia de ayer y cuando eran las 8am todavia seguia en el LOOP, cancele el JOB y con el cambio q hice se barrio el LOOP en 10 seg
          David Carballido Córdova

          Comentario

          Trabajando...