#1
|
|||
|
|||
Duda con select
Hola gente! tengo una duda existencial.. puede ir dentro de un select un inner join y un for all entries como el siguiente?
SELECT a~vbeln a~fkart a~waerk a~vkorg a~vtweg b~posnr b~pstyv b~werks b~wavwr b~kzwi1 b~kzwi3 INTO TABLE it_vbrk FROM vbrk AS a INNER JOIN vbrp AS b ON a~vbeln = b~vbeln FOR ALL ENTRIES IN it_s900 WHERE a~vbeln EQ it_s900-vbeln AND a~vkorg IN s_vkorg AND a~vtweg IN s_vtweg AND a~bukrs EQ p_bukrs AND b~pstyv IN s_pstyv. es performante esto? Desde ya se los agradezco!! |
#2
|
||||
|
||||
Yo pienso que si, en ese caso estas consultando con cabecera y detalle (VBRK y VBRP), y con respecto al FOR ALL ENTRIES creo q otra opcion en vez de la sentencia es realizar un LOOP y barrer con cada registro ... entre esos 2 mas performance es el FOR ALL ENTRIES
__________________
David Carballido Córdova |
#3
|
||||
|
||||
Es correcto lo mejor opcion lo que tratas de hacer ya que estas ahorrandote el barrido de la tabla interna.
__________________
01010000 01001010 10011000 10100001 De Byte a Beat. |
#4
|
|||
|
|||
joya! voy en buen camino entonces!!
Ahora si pongo esto.. SELECT spmon sptag vbeln pkunag pkunre matnr fkimg INTO TABLE it_s900 FROM s900 FOR ALL ENTRIES IN it_ausp WHERE matnr EQ it_ausp-matnr AND sptag IN s_sptag AND fkart IN s_fkart AND pkunag IN s_pkunag AND pkunre IN s_pkunre AND waerk EQ p_waers. IF sy-subrc EQ 0. sort it_s900 by vbeln. SELECT a~vbeln a~fkart a~waerk a~vkorg a~vtweg b~posnr b~pstyv b~werks b~wavwr b~kzwi1 b~kzwi3 INTO TABLE it_vbrk FROM ( vbrk AS a INNER JOIN vbrp AS b ON a~vbeln = b~vbeln ) FOR ALL ENTRIES IN it_s900 WHERE a~vbeln EQ it_s900-vbeln AND a~vkorg IN s_vkorg AND a~vtweg IN s_vtweg AND a~bukrs EQ p_bukrs AND b~pstyv IN s_pstyv. sique siendo performante?? Úlima edición por mystic_soul fecha: 11/04/08 a las 18:17:45. |
#5
|
|||
|
|||
Hola gente! todavia sigo sin poder sacarme la duda de este select...
SELECT spmon sptag vbeln pkunag pkunre matnr fkimg INTO TABLE it_s900 FROM s900 FOR ALL ENTRIES IN it_ausp WHERE matnr EQ it_ausp-matnr AND sptag IN s_sptag AND fkart IN s_fkart AND pkunag IN s_pkunag AND pkunre IN s_pkunre AND waerk EQ p_waers. IF sy-subrc EQ 0. sort it_s900 by vbeln. SELECT a~vbeln a~fkart a~waerk a~vkorg a~vtweg b~posnr b~pstyv b~werks b~wavwr b~kzwi1 b~kzwi3 INTO TABLE it_vbrk FROM ( vbrk AS a INNER JOIN vbrp AS b ON a~vbeln = b~vbeln ) FOR ALL ENTRIES IN it_s900 WHERE a~vbeln EQ it_s900-vbeln AND a~vkorg IN s_vkorg AND a~vtweg IN s_vtweg AND a~bukrs EQ p_bukrs AND b~pstyv IN s_pstyv. no se si es performante.. o esto es mas performante?? :S SELECT b~werks c~vkorg c~vtweg a~pkunag a~pkunre a~spmon a~matnr c~fkart b~pstyv a~fkimg b~wavwr c~waerk b~kzwi3 b~kzwi1 a~sptag b~vbeln b~posnr INTO TABLE it_s900 FROM s900 AS a INNER JOIN vbrp AS b ON a~vbeln = b~vbeln AND a~posnr = b~posnr INNER JOIN vbrk AS c ON b~vbeln = c~vbeln FOR ALL ENTRIES IN it_ausp WHERE a~matnr EQ it_ausp-matnr AND a~pkunag IN s_pkunag AND a~pkunre IN s_pkunre AND a~fkart IN s_fkart AND a~waerk EQ p_waers AND a~sptag IN s_sptag AND b~pstyv IN s_pstyv AND c~vkorg IN s_vkorg AND c~vtweg IN s_vtweg AND c~bukrs EQ p_bukrs. IF sy-subrc EQ 0. SORT it_s900 BY werks vkorg vtweg pkunag pkunre spmon matnr fkart pstyv. ENDIF. desde ya se los agradezco!!! Saludos! Úlima edición por mystic_soul fecha: 02/05/08 a las 13:10:55. |
#6
|
|||
|
|||
Desde la transaccion SE30 puedes hacer mediciones para ver que codigo es mas optimo
|
#7
|
|||
|
|||
si, eso es verdad, de la se30 puedo ver los resultados de que si uno es mas performante que otro, pero me pasa algo raro con esa transaccion.. cuando lo ejecuto la primera vez, por ejemplo, me dice que consume 65% base de datos; lo ejecuto por 2da vez, me dice 90%, por 3ra, 99%, por 4ta vez, 50%.. me vuelvo loco! me varia los porcentajes de forma brusca y sin modificar el programa! (los porcentajes tiro como ejemplo) y no se bien porque es y como solucionarlo!
saludos! |
#8
|
|||
|
|||
Que tal:
La variación que tienes en cuanto a tiempo en la transacción SE30 es por que también depende de los recursos del sistema, es decir, si alguien esta corriendo procesos en el mismo momento que tú, se va tardar más tu programa. por tal motivo no es una buena medición para un query, a menos que lo ejecutes en una hora en la que tu sabes que está libre el sistema, para que puedas tener un buen parámetro al determinar cuál de tus dos opciones usar.
En mi experiencia con los querys al hacer inner join es más rápido que cargar en varias tablas. He realizado muchas cargas batch de millones de registros o procesado información utilizando los inner y son realmente rápidos. Solo ten cuidado en hacer bien las relaciones, por que si no ligas bien las tablas, se te van a multiplicar los registros o incluso salir menos, esto debido a que al hacer los inner le indicas que todas las tablas están relacionadas y que no deseas información donde a una tabla le falte algún registro para hacer match con las otras. En su defecto si requieres toda la información de una tabla independiente de otra, puedes usar el left ó right join. Saludos, espero que sirva de algo estos comentarios.
__________________
I.S.C.T. Luis Armando Valdez Rodríguez
Consultor ABAP correo: cel: (045) 5537406023 "La vida premia la acción"
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|