Tabla Interna Con 200000 Registros

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • AJAA
    Junior Member
    • nov
    • 12

    #1

    Tabla Interna Con 200000 Registros

    Buenas tardes,

    Estoy haciendo un loop a una tabla interna con 200000 registros y el mismo se me tarda como hora y media.

    Antes de hacer ese loop hago otro a una tabla interna que tiene mas o menos la misma cantidad de registro y este se tarda solo 4 minutos.

    He probado liberando las tablas que ya no uso con REFRESH y FREE.

    He comentado todo lo que hago dentro del Loop y solo lo dejo correr pero nada todo sigue igual.

    Existe alguna forma de paginar una tabla interna, es decir, leer los primero 10.000.

    Que se les ocurre?.
    Consultor Técnico B1/ABAP
  • mysmb2
    Senior Member
    • ene
    • 406

    #2
    Hola podes probar paquetizarlo usando dos tablas internas una tiene todo los valores(i_tabla_full) y otra con el volumen de registros a procesar(i_tabla_tmp).

    Espero se entienda

    Código:
      DO.
    *     armo la tabla interna con d_packsize registros
          REFRESH i_tabla_tmp.
          DO d_packsize TIMES. 
            UNASSIGN <fs_tabla_all>.
            READ TABLE i_tabla_all INDEX 1 ASSIGNING <fs_tabla_all>.
            IF sy-subrc IS NOT INITIAL. 
              EXIT.
            ENDIF.
            APPEND <fs_tabla_all> TO i_tabla_tmp. 
            DELETE  i_tabla_all INDEX 1. 
          ENDDO.
    
    
          IF i_tabla_tmp[] IS INITIAL.
            EXIT.
          ENDIF.
    
          PERFORM proceso TABLES i_tabla_tmp."se procesan el paquete de registro
    
      ENDDO.

    saludos.
    Sebastián Chiavia
    http://www.programacionabap.com.ar

    Comentario

    • Tu amo
      Member
      • oct
      • 40

      #3
      A mi me suena a otra cosa, un loop de esa cantidad, del tamaño que sea, por si solo no deberia tardar tanto

      Digamos que te creo. Estas haciendo un loop a una work area?
      Que pasa si lo haces con un assigning a un field-symbol

      en vez de esto
      Código:
      loop at itab into wa.
      endloop.
      Cambialo a
      Código:
      loop at itab assigning <itab>.
      endloop.
      Lo segundo evita la copia y en teoria deberia ser mas rapido. Pero a menos que la cantidad de informacion por linea sea descomunal incluso lo primero deberia ser rapido

      Comentario

      • AJAA
        Junior Member
        • nov
        • 12

        #4
        Estoy trabajando con FIELD-SYMBOLS.

        Este es el código en cuestión.


        Código:
            
        
        LOOP AT IT_RESULT ASSIGNING <WA_RESULT>.
        
          READ TABLE IT_NEW ASSIGNING <WA_NEW> WITH KEY CAMPO1 = <WA_RESULT>-CAMPO1.
        
            IF SY-SUBRC = 0.
              IF ( <WA_RESULT>-CAMPO2 > <WA_NEW>-CAMPO2 )
                   <WA_NEW>-CAMPO2 = <WA_RESULT>-CAMPO2.
                    ...
                    ...
                    ...
              ENDIF.
            ELSE.
              APPEND INITIAL LINE TO IT_NEW ASSIGNING <WA_NEW>.
              MOVE-CORRESPONDING <WA_RESULT> TO <WA_NEW>.
            ENDIF.
        ENDLOOP.
        UNASSING <WA_NEW>.
        UNASSIGN <WA_RESULT>.
        Consultor Técnico B1/ABAP

        Comentario

        • Tu amo
          Member
          • oct
          • 40

          #5
          Ahi esta tu problema
          Probablemente es el read adentro del loop.
          Mal hecho eso puede ser peligroso. Me acuerdo mucho de un programa parecido (un loop de millones leyendo una tabla de miles) que tardaba como 5-6 horas y ya arreglado corria como 3-5 minutos.

          De dos.
          1. Ordenas it_new y lees con binary search
          2. Vuelves it_new una tabla hash.

          La opcion 2 seria la mas eficiente si it_new tiene muchos registros, pero tambien puede ser la mas laboriosa de implementar.
          Tu decides, en todo caso cualquiera de las dos debe darte una buena mejora

          Comentario

          • charly_ap

            #6
            Soy muy nuevo en el tema pero por conceptos que vi podrias ingresar
            UP TO 10000 ROWS
            dentro del loop, .

            saludos.

            Comentario

            Trabajando...