#1
|
|||
|
|||
Performance de una select
Tengo un par de selects para recoger documentos contables a partir de :
Sociedad Fecha de contabilizacion Cuenta de mayor. FORM get_data. SELECT * INTO TABLE gt_bkpf FROM bkpf WHERE bukrs IN p_bukrs AND bstat = space AND budat IN p_budat AND blart IN p_blart AND gjahr IN s_gjahr. CLEAR gt_bseg. REFRESH gt_bseg. LOOP AT gt_bkpf. SELECT * APPENDING TABLE gt_bseg FROM bseg WHERE bukrs = gt_bkpf-bukrs AND belnr = gt_bkpf-belnr AND gjahr = gt_bkpf-gjahr AND hkont IN p_hkont. ENDLOOP. ENDFORM. " get_data el tema es que para una rango de fechas de contabilizacion de 12 meses tarda casi 30 minutos, mientras que la FBL3N tarda 1 minuto. Alguien sabe como puedo depurar esta consulta a la bbdd para que sea mas rapida? Gracias |
#2
|
|||
|
|||
Lo que ralentiza muchisimo es el LOOP AT gt_bkpf. SELECT * APPENDING TABLE gt_bseg FROM bseg WHERE bukrs = gt_bkpf-bukrs AND belnr = gt_bkpf-belnr AND gjahr = gt_bkpf-gjahr AND hkont IN p_hkont. ENDLOOP. deberias utilizar FOR ALL ENTRIES SELECT * APPENDING TABLE gt_bseg FROM bseg FOR ALL ENTRIES IN gt_bkpf WHERE bukrs = gt_bkpf-bukrs AND belnr = gt_bkpf-belnr ... Otra cosa que mejorara el rendimiento es que en lugar de hacer SELECT * solo cojas los campos que necesitas y los seleccionas en el mismo orden en el que estan definidos en la tabla |
#3
|
|||
|
|||
que tal javibest, si lo que necesitas es solo los datos en tu tabla interna gt_bseg podrías utilizar un JOIN entre ambas tablas, seria algo así:
FORM get_data. CLEAR gt_bseg. REFRESH gt_bseg. SELECT B~campo1 B~campo2 B~campo3 A~campoX "... los campos que requieres de tu tabla bseg (B) o de la bkpf (A) INTO CORRESPONDING FIELDS OF TABLE gt_bseg FROM bkpf as A JOIN bseg as B ON A~bukrs = B~bukrs AND A~belnr = B~belnr AND A~gjahr = B~gjahr WHERE A~bukrs IN p_bukrs AND A~bstat IN p_bstat AND A~budat IN p_budat AND A~blart IN p_blart AND A~gjahr IN p_gjahr AND B~hkont IN p_hkont . ENDFORM. " get_data espero te sea de ayuda. |
#4
|
||||
|
||||
Hola oalanis, lo que dices no es del todo cierto ... un buen metodo es el INNER JOIN pero para los casos de tablas cluster como la BSEG se usa los FOR ALL ENTRIES como menciona ballan ... un saludo !!
__________________
David Carballido Córdova |
#5
|
|||
|
|||
Que tal david, tienes razón, se me estaba pasando ese grandisimo detalle una disculpa, por mi respuesta errónea, gracias por corregir.
|
#6
|
|||
|
|||
Pero mejor que usar la BSEG es usar las tablas que forman la BSEG, como BSAD, BSID, BSAK, BSIK, entre otras que componen el cluster.
¿Creo o me equivoco? Saludos |
#7
|
||||
|
||||
Sep, es correcto, si tienes los proveedores, materiales o codigos de clientes a la mano seria mejor con esas tablas y tbm usar el JOIN para agilizar las busquedas
__________________
David Carballido Córdova |
#8
|
||||
|
||||
Coincido con Maurio y tal vez un indice estaria a la tabla bien .
El 'for all entries' ........... |
#9
|
|||
|
|||
No puedes crear un índice en la bseg, es una tabla cluster. Por lo que veo quiere imitar el rendimiento de la FBL3N que es el listado de cuentas de mayor. Creo que la mejor solución es utilizar las tablas BSIS y BSAS dependiendo de si se tratan de partidas abiertas o compensadas y olvidarse de la BKPF y la BSEG. Saludos |
#10
|
|||
|
|||
Muchas gracias a todos.
el programa, para un año cuenta y sociedad determinada, tardaba unos 30 minutos. - Cambiando el loop at gt_bkpf por un all entries , el tiempo ha bajado a 20 minutos - Cambiando la bseg por la bsis y la bsas, el tiempo ha bajado a menos de un minuto. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|