Como optimizo una consulta con "SELECT SINGLE"

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • dmgman
    Senior Member
    • feb
    • 149

    #1

    Como optimizo una consulta con "SELECT SINGLE"

    Hola a todos,
    Me han encargado optimizar un report ya que el tiempo de ejecucion es demasiado elevado.
    Tras analizarlo encuentro que casi la mitad de la ejecucion se va en un "SELECT SINGLE" a la tabla BSAS que contiene 5 millones de registros.
    Esta es la famosa sentencia:

    Código:
        SELECT SINGLE bukrs belnr gjahr
          INTO (bsas-bukrs, bsas-belnr, bsas-gjahr)
            FROM bsas
            WHERE bukrs EQ bkpf-bukrs
              AND augdt IN r_budat
              AND augbl EQ bkpf-belnr
              AND blart NE 'ZI'.
    No llevo mucho tiempo en Sap y no se me ocurre q alternativa podria tomar.
    Gracias
    Carpe Diem !!
  • conrad10ar
    Banned
    • mar
    • 296

    #2
    Habría que ver bien como está el programa completo, pero lo primero que haría es cambiar el IN por un EQ.

    Espero te sea de ayuda.

    Comentario

    • maescobarl
      Member
      • abr
      • 60

      #3
      create un indice en la tabla o una vista con un indice y listo!!!!

      Espero te funcione

      Comentario

      • Jotabin
        Senior Member
        • may
        • 117

        #4
        Que haya un IN no hace diferencia con un EQ... en definitiva un IN son varios EQs. El problema son los índices.

        Para que un SELECT o SELECT SINGLE sea performante, el WHERE tiene que incluir todos los campos de la clave o todos los campos de alguno de los índices de la tabla.

        Como dijo maescobarl, podés crearle un nuevo índice a la tabla para mejorar la performance.

        Lo más recomendable suele ser buscar la forma de utilizar uno de los índices ya creados para la tabla, o en el mejor de los casos los campos clave, pero como esto no siempre es posible, como última opción podés crearle un nuevo índice que incluya los campos por los que accede tu select.
        resistance is futile

        Comentario

        • maescobarl
          Member
          • abr
          • 60

          #5
          Hola Jotabin, Gracias por reforzar mi comentario.

          Saludos a todos

          Comentario

          • conrad10ar
            Banned
            • mar
            • 296

            #6
            Tienes razón, esa es la manera correcta, igualmente prueba en la consulta usar todos EQ y cambiarlos por IN, y la performance baja.

            Saludos a todos!

            Comentario

            • maescobarl
              Member
              • abr
              • 60

              #7
              Compañeros,

              Creo que de lo anterior surge un nuevo tema, el cual yo no estoy muy adentrado... el uso del TRACE (ST05), alguno de ustedes nos puede dar una catedra de como usarlo y saber especificamente que INDICE se esta ocupando al momento de ejecucion???.

              Espero sus comentarios

              Saludos

              Comentario

              • jmadera
                Junior Member
                • sep
                • 6

                #8
                Abaperos

                según lei en unos datos que consegui por la internet una de las cosas principales que tenemos que hacer al momento de realizar un select es colocar las ? falsas delante y luegos las verdaderas, ademas creo que lo mejor es tratar de colocar la mayor cantidad de campos claves dentro del where es lo mejor.

                Comentario

                • Jotabin
                  Senior Member
                  • may
                  • 117

                  #9
                  Eso de las condiciones falsas por delante no lo conocía, pero sí tengo entendido que cuando la condición para uno de los campos del WHERE es negativa, ese campo no cuenta para el índice; es decir que, para asegurarte de que tu SELECT use un índice [que puede ser la clave principal] no sólo tenés que asegurarte de incluir todos los campos de ese índice, sino que además la condición con la cual los usás tiene que ser positiva.
                  resistance is futile

                  Comentario

                  • Jotabin
                    Senior Member
                    • may
                    • 117

                    #10
                    Ah, y sí... si alguien puede aportar una pequeña explicación o algún manual sobre el uso del TRACE, yo también lo agradecería mucho porque no tengo idea de ese tema.
                    resistance is futile

                    Comentario

                    • dmgman
                      Senior Member
                      • feb
                      • 149

                      #11
                      Hola, gracias a todos, por la ayuda.

                      No se como realizar el indice o no entiendo a que os referis... no llevo mucho tiempo en este mundillo. Me podriais explicar a que os referis con el indice, creo q un ejemplo me vendria de perlas. Gracias
                      Carpe Diem !!

                      Comentario

                      • Jotabin
                        Senior Member
                        • may
                        • 117

                        #12
                        A ver... Supongo que sabés que toda tabla del diccionario ABAP tiene campos clave, ¿cierto?

                        El motivo principal para que exista esta "propiedad" de los campos que diferencia a los clave de los no clave, es la creación de un índice para los campos clave de la tabla.

                        ¿Que qué es un índice? Es una especie de tablita, mucho más pequeña que la tabla a la cual "indexa", que contiene únicamente los campos clave de la tabla indexada y, por cada clave, un puntero que indica la posición del registro que corresponde a esa clave dentro de la tabla indexada.

                        O sea que termina siendo algo muy parecido al índice en un libro. Si uno quiere encontrar dónde empieza un determinado capítulo en un libro, es mucho más fácil ir al índice y fijarse el número de página que ir mirando una a una las páginas desde el principio.

                        Bueno, para la computadora es igual. Si tiene que recorrer la tabla registro a registro para encontrar el valor buscado, el trabajo realizado será mucho mayor que si hace una búsqueda binaria sobre el índice, y desde ahí accede directamente al registro buscado gracias al puntero que le indica dónde está almacenado.

                        Entonces, cuando un programa recupera datos de una tabla acotando la búsqueda a ciertos valores, la recuperación de datos será muchísimo más veloz si los campos por los que se acota la búsqueda son los campos clave de la tabla, ya que le permitiremos al sistema utilizar el índice creado.

                        Ahora, resulta que SAP, como toda base de datos decente, te permite crear también otros índices para la tabla aparte del índice principal, el de la clave. De esta manera, uno puede elegir los campos que se le ocurran (sean clave o no) y SAP solito se encarga de indexar la tabla según esos campos, es decir que crea una tablita ordenada por los campos indicados con referencias a la posición de cada registro dentro de la tabla principal. De esta manera, se pueden lograr velocidades de acceso similares a las que se consiguen accediendo por la clave principal de la tabla.

                        Espero que se haya entendido.
                        resistance is futile

                        Comentario

                        • Jotabin
                          Senior Member
                          • may
                          • 117

                          #13
                          btw, los índices para tablas son creados desde el diccionario de datos [Trx. SE11], con el botón "Índices".
                          Es bastante intuitivo, pero si llegás a tener algún problema consultá acá e intentaremos ayudarte.
                          resistance is futile

                          Comentario

                          • dmgman
                            Senior Member
                            • feb
                            • 149

                            #14
                            Hola a todos.
                            Si ya he entendido que son los indices, la verdad que pese a haber pasado por ahi 600 veces, no los habia usado hasta ahora...

                            He estado comentandolo por aqui con los compañeros, y me han dicho que al usarlo, simplemente es necesario que en el select se establezca el mismo orden que existe en uno de sus indices.

                            Es decir, ej:
                            si tengo el indice:
                            Código:
                                      mandt
                                      bukrs
                                      belnr
                                      gjahr
                                      prctr.
                            yo haria el siguiente select:
                            Código:
                            select bukrs budat hkont from bsas.
                                  SELECT DISTINCT bukrs belnr gjahr
                                      INTO CORRESPONDING FIELDS OF TABLE g_it_bsas
                                      FROM bsas
                                      WHERE augdt IN r_budat
                                        AND blart NE 'ZI'.
                                ENDIF.
                            Editado por última vez por dmgman; 26/09/2006, 06:45:54.
                            Carpe Diem !!

                            Comentario

                            • LouieBoy
                              Member
                              • ago
                              • 86

                              #15
                              Buenas, perdonad mi igonrancia, pero que ganais haciendo todo esto contra un select single con toda la clave y con la tabla indexada, micro segundos? nano segundos? vale la pena todo esto para ganar tan poco?

                              Saludos

                              LouieBoy

                              Comentario

                              Trabajando...