PDA

Ver la Versión Completa : Recorrido de tabla con alto volumen de registros


jalopez
20/12/08, 02:10:24
S.O.S.

Necesito eliminar registros de un tabla que actualmente posee 500.000 registros, el problema es que para eliminar un registro se debe verificar en otra tabla que el registro no exista. La segunda tabla posee 2.000.000 de registros. Actualmente lo estoy realizando así:

LOOP AT it_ztar_saldo_factu ASSIGNING <fs_ztar_saldo_factu>.
READ TABLE it_ztar_detalle_aux ASSIGNING <fs_ztar_detalle_aux>
WITH KEY nro_factura = <fs_ztar_saldo_factu>-nro_factura
sociedad = <fs_ztar_saldo_factu>-sociedad.
IF sy-subrc EQ 0.
<fs_ztar_saldo_factu>-compensada = 'B'. "Se marca el registro a borrar
ENDIF.
ENDLOOP.
DELETE it_ztar_saldo_factu WHERE compensada = 'B'. "Se eliminan los registros

Aun utilizando FIELD-SYLBOLS, este proceso se esta muriendo.

¡Alguien que me de una luz!

DavidXD_XD
20/12/08, 12:58:26
Hola, yo tenia un problema similar, se demoraba algo de 30 min en recorrer todo el LOOP y modificar el campo, pero ahora se demora 10 seg :D , lo hice con tablas hashed, esas son un tipo de tablas internas pero de solo consulta, deberias declarar la tabla interna it_ztar_saldo_factu de la siguiente manera

DATA: it_ztar_saldo_factu TYPE HASHED TABLE OF ty_tipo WITH UNIQUE KEY nro_factura sociedad.

Trata de probarlo con eso y nos cuentas como te fue ...

jalopez
20/12/08, 16:17:21
Hola David

Primero muchas gracias por la respuesta.
Bueno en la definición de la tablas interna it_ztar_saldo_factu, yo la tengo exactamente como me lo sugiere usted.
El resto de tablas estan de tipo
DATA it_ztar_detalle_aux TYPE STANDARD TABLE OF ztar_detalle.

El programa debe depurar registros de 4 tablas diferentes, pero la base es ztar_saldo_factu y el caso más critico es ztar_detalle que tiene millones de registros.

Por favor si tienes otra sugerencia te agradezco me la cuentas.

bisonye
22/12/08, 06:59:09
Buenos días,

Primero estos temas de rendimiento pueden ser muy diferentes de un sistema a otro, por lo que una solución válida en un sistema puede no funcionar en otro.

Yo lo que haría es lo siguiente:
Como comenta David crearía la TI it_ztar_detalle_aux como HASED o SORTED table con KEY nro_factura y sociedad.
El crear la tabla de saldo como hased no te sirve de nada ya que tienes que recorrerla completa pero sin embargo en esta haces lecturas por lo que la creación de índices debería ayudarte.

Segundo en el delete despues del loop estás volviendo a recorrer tu tabla, aunque pongas una condición. Yo haría el delete dentro del loop y así me ahorraría un recorrido a la tabla.
En resumen el código sería así:
LOOP AT it_ztar_saldo_factu ASSIGNING <fs_ztar_saldo_factu>.
indice = sy-tabix.
READ TABLE it_ztar_detalle_aux ASSIGNING <fs_ztar_detalle_aux>
WITH KEY nro_factura = <fs_ztar_saldo_factu>-nro_factura
sociedad = <fs_ztar_saldo_factu>-sociedad.
IF sy-subrc EQ 0.
delete it_ztar_saldo_factu index indice.
CONTINUE.
ENDIF.
ENDLOOP.

Espero que te sirva.

Saludos

goyleo
22/12/08, 15:55:31
La tabla it_ztar_detalle_aux ordenala por el campo nro_factura y sociedad . y en el READ a la misma utiliza BINARY SEARCH eso mejora la performance de la lectura de la tabla interna. :D