Duda con select

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • mystic_soul
    Member
    • sep
    • 76

    #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!!
  • DavidXD_XD
    Moderator
    • ago
    • 1255

    #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

    Comentario

    • Rodolfo Montiel Rivera
      Member
      • oct
      • 92

      #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.

      Comentario

      • mystic_soul
        Member
        • sep
        • 76

        #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??
        Editado por última vez por mystic_soul; 11/04/2008, 18:17:45.

        Comentario

        • mystic_soul
          Member
          • sep
          • 76

          #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!
          Editado por última vez por mystic_soul; 02/05/2008, 13:10:55.

          Comentario

          • ballan
            Senior Member
            • oct
            • 671

            #6
            Desde la transaccion SE30 puedes hacer mediciones para ver que codigo es mas optimo

            Comentario

            • mystic_soul
              Member
              • sep
              • 76

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

              Comentario

              • larmadovr
                Member
                • ene
                • 77

                #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: larmandovr@hotmail.com
                cel: (045) 5537406023

                "La vida premia la acción"

                Comentario

                Trabajando...