Analizar y probar el código
Uso correcto de tipos de datos y conversiones de tipos
Campos de caracteres de procesamiento
Uso de la transferencia de código en ABAP SQL
Mejora del rendimiento de la tabla interna
Implementar verificaciones de autorización
Diseño de código orientado a objetos efectivo
Definir y trabajar con clases de excepción
Añadir documentación al código ABAP

Análisis del acceso a la base de datos con trace SQL

Objectives

After completing this lesson, you will be able to:
  • Inicie el trace SQL.
  • Analizar los resultados del trace SQL.

El trace SQL

El trace SQL se utiliza para supervisar centralmente todo el tráfico entre el sistema ABAP y la base de datos. Puede activar y desactivar el trace desde dentro de las herramientas de desarrollo ABAP, pero para analizar los resultados del trace, debe iniciar el cockpit de monitor técnico, una aplicación basada en navegador.

El trace SQL no está restringido a un único usuario, cliente o instancia de servidor. Si hay más de una base de datos conectada al sistema, rastrea el tráfico de todas estas bases de datos.

En el Resultado de trace, puede visualizar información sobre sentencias SQL individuales, como el consumo de tiempo en la base de datos o el número de registros a los que se ha accedido. También puede analizar la sintaxis SQL nativa, es decir, la sentencia en la forma en la que ha llegado a la base de datos.

Se aplican algunas restricciones al trabajar con el trace SQL. Solo un usuario puede activar el trace al mismo tiempo. Y cuando activa el trace desde las herramientas de desarrollo ABAP, no hay forma de añadir filtros de grabación.

Resultados de trace SQL

En este vídeo verá cómo iniciar un trace SQL y analizar el resultado.

Trabajar con la herramienta de trace SQL

Al perfilar su código ABAP, descubrió que el acceso a la base de datos es un importante contribuyente al tiempo de ejecución general. Ahora utilizará la herramienta Trace SQL para analizar los accesos a la base de datos de su programa con más detalle y mejorar aún más el rendimiento de su código.

Modelo:

  • /LRN/CL_S4D401_ATS_PROFILING (clase global)

Solución:

  • /LRN/CL_S4D401_ATS_SQL_TRACE (clase global)

Tarea 1: Copiar plantilla (opcional)

Copie la clase de modelo /LRN/CL_S4D401_ATS_PROFILING. Si ha finalizado el ejercicio anterior, puede omitir esta tarea y continuar editando su clase ZCL_##_SOLUTION.

Pasos

  1. Copie la clase /LRN/CL_S4D401_ATS_PROFILING en una clase de su propio paquete (nombre sugerido: ZCL_##_SOLUTION, donde ## representa su número de grupo).

    1. En el Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D401_ATS_PROFILING para abrir el menú contextual.

    2. En el menú contextual, seleccione Duplicar....

    3. Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca ZCL_##_SOLUTION, donde ## representa su número de grupo.

    4. Seleccione Siguiente.

    5. Confirme la orden de transporte y seleccione Finalizar.

  2. Active la copia.

    1. Pulse Ctrl + F3 para activar la clase.

Tarea 2: Realizar un trace SQL

Para seguir analizando los problemas de rendimiento, active el trace SQL y ejecute su clase ABAP ZCL_##_SOLUTION como una aplicación de consola.

Dentro de la misma instancia ABAP, solo un usuario puede activar el trace SQL a la vez. Para dar una oportunidad a otros usuarios, desactive el trace SQL una vez que haya terminado de ejecutar la aplicación de consola.

Pasos

  1. Si no está abierta, abra su clase ABAP ZCL_##_SOLUTION en el editor.

    1. Pulse Ctrl + Mayús + A e introduzca el nombre de su clase ABAP.

    2. Seleccione OK.

  2. Abra el diálogo Estado de trace SQL para su proyecto ABAP Cloud.

    1. En el Explorador de proyectos de la izquierda, haga clic con el botón derecho en el proyecto para abrir el menú contextual.

    2. Seleccione trace SQL ....

  3. Verifique el estado de trace SQL actual. Si el trace está activado, cierre la ventana de diálogo y vuelva en unos minutos.

    1. Seleccione OK para cerrar la ventana de diálogo.

  4. Si el trace está desactivado actualmente, actívelo. A continuación, cierre la ventana de diálogo.

    1. Seleccione Activar para activar el trace SQL.

    2. Seleccione OK para cerrar la ventana de diálogo.

  5. Ejecute su clase global ZCL_##_SOLUTION como aplicación de consola.

    1. Pulse F9 para ejecutar la clase ABAP como aplicación de consola.

  6. En cuanto la aplicación haya finalizado, desactive el trace SQL y abra el directorio de trace.

    1. En cuanto desaparezca el indicador de progreso verde en la esquina inferior derecha, haga clic con el botón derecho en el proyecto en el Explorador de proyectos y seleccione SQL Trace ....

    2. Seleccione Desactivar para desactivar el trace SQL.

    3. Seleccione Ver directorio de traces para visualizar una lista de sus traces.

Tarea 3: Analizar el resultado del trace

Analice el resultado del trace SQL. Filtre los accesos a la base de datos que se originan a partir de su clase ABAP y averigüe a qué tablas de base de datos se ha accedido con qué frecuencia.

Pasos

  1. En el cockpit de supervisión técnica, visualice los registros de trace del trace más reciente.

    Consejo

    Por defecto, la lista de traces se clasifica de forma descendente por la columna Cronomarcador.
    1. Seleccione la entrada de la lista superior.

    2. Seleccione Registros de trace.

  2. Filtrar la lista de registros de trace. Visualice solo los registros que se originan a partir de su clase ABAP ZCL_##_SOLUTION.

    Consejo

    Le recomendamos que utilice la opción de filtro a la izquierda del botón Ir y no el filtro de visualización que puede fijar seleccionando la cabecera de columna Programa.

    1. En la barra de herramientas de la tabla, a la izquierda del botón Ir, seleccione la opción Filtro (...).

    2. Seleccione Programa de la lista desplegable en la parte superior de la ventana de diálogo.

    3. Asegúrese de que la opción Me gusta esté seleccionada.

    4. Sustituya la petición Introducir valor por el nombre de su clase ABAP (ZCL_##_SOLUTION).

    5. Seleccione OK.

    6. Seleccione Ir para actualizar las entradas de la tabla.

  3. Clasificar la lista de registros de trace. Busque las sentencias SQL que han accedido a la mayoría de los registros.

    Nota

    Por defecto, la lista de registros de trace se clasifica por la columna Cronomarcador. Para modificar la clasificación, primero se debe eliminar la clasificación existente.
    1. Seleccione los tres puntos horizontales a la derecha del botón Ir.

    2. Seleccione Reinicializar clasificación.

    3. En la barra de herramientas de la tabla, a la izquierda del botón Ir, seleccione la opción Clasificar (0).

    4. Busque la columna Registros a los que se ha accedido [#]. Marque la casilla de la izquierda y seleccione el botón Clasificar de forma descendente para esta columna.

    5. Seleccione OK para cerrar la ventana de diálogo.

    6. Seleccione Ir.

  4. Elimine la clasificación por la columna Registros a los que se ha accedido y clasifique la lista de forma descendente por la columna Duración.

    1. Seleccione los tres puntos horizontales a la derecha del botón Ir.

    2. Seleccione Reinicializar clasificación.

    3. En la barra de herramientas de la tabla, a la izquierda del botón Ir, seleccione la opción Clasificar (0).

    4. Busque la columna Duración [µs]. Marque la casilla de la izquierda y seleccione el botón Clasificar de forma descendente para esta columna.

    5. Seleccione OK para cerrar la ventana de diálogo.

    6. Seleccione Ir.

  5. Para la sentencia de registro individual más cara, vaya a la sección Sentencia SQL.

    1. Seleccione la fila con el valor 1 en la columna Registros a los que se ha accedido y el valor más grande en la columna Duración.

    2. Seleccione Sentencia SQL en el panel de navegación de la parte superior.

    3. Encontrará el nombre de tabla en la cláusula FROM.

  6. Abra la sentencia SELECT en las herramientas de desarrollo ABAP.

    1. Seleccione Mostrar fuente ABAP en ADT.

Tarea 4: Mejorar el código

Para mejorar aún más el rendimiento de su código, elimine el acceso repetido SELECT SINGLE a la tabla de base de datos /LRN/CONNECTION. Sabe que la tabla /LRN/CONNECTION contiene un número relativamente pequeño de registros. Por lo tanto, decide grabar en memoria intermedia todo el contenido de la tabla de base de datos en un atributo estático (nombre sugerido: connections_buffer). Rellene la memoria intermedia en el constructor estático (method class_constructor) y sustituya la sentencia SELECT SINGLE por un acceso de lectura a la memoria intermedia.

Consejo

El acceso SELECT SINGLE a la tabla de base de datos /LRN/CONNECTION se encuentra en el método constructor de la clase local lcl_passer_flight.

Pasos

  1. Navegue a la definición del atributo connection_details y, desde allí, a la definición del tipo de estructura st_connection_details.

    1. En la cláusula INTO de la sentencia SELECT SINGLE, sitúe el cursor en connection_details y pulse F3. Como alternativa, puede mantener pulsada la tecla Ctrl y hacer clic en connection_details.

    2. En la sentencia DATA, sitúe el cursor en st_connection_details y pulse F3. Como alternativa, puede mantener pulsada la tecla Ctrl y hacer clic en st_connection_details.

  2. Copie el tipo de estructura st_connection_details en un nuevo tipo de estructura privada (nombre sugerido: st_connections_buffer).

    1. Seleccione toda la sentencia TYPES (incluida la fila END OF st_connection_details.) y pulse Ctrl + C.

    2. Desplácese hacia abajo hasta la sección privada, coloque el cursor sobre la sentencia ENDCLASS y pulse Ctrl + V para insertar el código copiado.

    3. En el código insertado, sustituya st_connection_details por st_connections_buffer.

  3. Añada los campos clave carrier_id y connection_id de la tabla de base de datos /LRN/CONNECTION al principio de la lista de componentes de st_connections_buffer.

    1. Ajuste el código de la siguiente manera:

      ABAP
      123456789
      TYPES: BEGIN OF st_connections_buffer, carrier_id TYPE /dmo/carrier_id, connection_id TYPE /dmo/connection_id, airport_from_id TYPE /dmo/airport_from_id, airport_to_id TYPE /dmo/airport_to_id, departure_time TYPE /dmo/flight_departure_time, arrival_time TYPE /dmo/flight_arrival_time, END OF st_connections_buffer.
  4. Declare un atributo estático privado denominado connections_buffer como una tabla interna con st_connections_buffer como tipo de fila.

    1. Al final de la definición de clase, añada el siguiente código:

      ABAP
      1
      CLASS-DATA connections_buffer TYPE TABLE OF st_connections_buffer.
  5. Utilice una corrección rápida para generar un constructor estático (constructor de clase) para la clase lcl_passer_flight.

    1. Desplácese hacia arriba hasta la sentencia CLASS lcl_passenger_flight DEFINITION.

    2. Sitúe el cursor en lcl_passenger_flight y pulse Ctrl + 1 para visualizar una lista de correcciones rápidas disponibles.

    3. En la lista, seleccione Generar constructor de clase.

  6. Edite la implementación del método class_constructor. Implemente una sentencia SELECT que lea todos los registros de la tabla de base de datos /LRN/CONNECTION en el atributo connections_buffer.

    1. Ajuste el código de la siguiente manera:

      ABAP
      1234567
      METHOD class_constructor. SELECT FROM /lrn/connection FIELDS carrier_id, connection_id, airport_from_id, airport_to_id, departure_time, arrival_time INTO TABLE @connections_buffer. ENDMETHOD.
  7. En la implementación del constructor de método, sustituya la sentencia SELECT SINGLE por un acceso de lectura a connections_buffer.

    Nota

    Tenga en cuenta que el atributo connection_details tiene menos componentes que el tipo de fila del atributo connections_buffer.
    1. Seleccione toda la sentencia SELECT SINGLE y pulse Ctrl + < para añadir un signo de comentario delante de cada fila.

    2. Después de la sentencia SELECT SINGLE comentada, añada el siguiente código:

      ABAP
      12345678910111213
      * SELECT SINGLE * FROM /lrn/connection * FIELDS airport_from_id, airport_to_id, * departure_time, arrival_time * WHERE carrier_id = @carrier_id * AND connection_id = @connection_id * INTO @connection_details. connection_details = CORRESPONDING #( connections_buffer[ carrier_id = i_carrier_id connection_id = i_connection_id ] ).

Tarea 5: Volver a verificar el código

Active y pruebe su clase global. Ejecute la clase como aplicación de consola. Repita la creación de perfiles para medir la mejora del rendimiento.

Pasos

  1. Active su clase global y ejecútela como aplicación de consola.

    1. Pulse Ctrl + F3 para activar la clase.

    2. Pulse F9 para ejecutar la clase como aplicación de consola.

  2. Inicie la medición de tiempo de ejecución con el ABAP Profiler.

    1. Haga clic con el botón derecho en el editor y seleccione Perfil Comoaplicación ABAP (consola).

    2. En la ventana de diálogo Parámetros de trace, seleccione Finalizar sin modificar ninguna de las opciones.

  3. Cambie a la perspectiva Generador de perfiles y analice el resumen de trace.

    1. Seleccione VentanaPerspectivaAbrir perspectivaOtros... Seleccione ABAP Profiling y seleccione Abrir.

    2. En la vista Traces ABAP, seleccione Actualizar en el menú contextual de su proyecto ABAP. Como alternativa, puede colocar el cursor en cualquier lugar de la vista Traces ABAP y pulsar F5 para volver a cargar la lista de resultados de trace.

    3. Haga doble clic en el trace más reciente (esta es la entrada superior de su proyecto).

    4. El tiempo de ejecución total y la distribución entre ABAP y la base de datos se visualizan en la sección inferior del resumen.