PDA

Ver la Versión Completa : Problema Performance


DavidXD_XD
13/01/09, 12:27:50
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

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 !!!

francesc
13/01/09, 12:44:30
Podrías probar a hacer un delete antes del loop.

DavidXD_XD
13/01/09, 14:46:13
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

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 !!!

Turu
13/01/09, 14:57:54
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

DavidXD_XD
13/01/09, 16:04:00
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