PDA

Ver la Versión Completa : Duda con select


mystic_soul
10/04/08, 15:08:13
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!!

DavidXD_XD
10/04/08, 15:29:07
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

Rodolfo Montiel Rivera
10/04/08, 22:07:09
Es correcto lo mejor opcion lo que tratas de hacer ya que estas ahorrandote el barrido de la tabla interna.

mystic_soul
11/04/08, 18:15:36
joya! voy en buen camino entonces!! :D

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

mystic_soul
02/05/08, 13:05:51
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!

ballan
05/05/08, 10:23:56
Desde la transaccion SE30 puedes hacer mediciones para ver que codigo es mas optimo

mystic_soul
09/05/08, 19:53:35
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!

larmadovr
09/05/08, 20:58:43
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.