W Pub: ABAP Curso Rendimiento

Rendimientos

Por Damià Gual

Para todas las SELECTs que se utilicen frecuentemente, se ha de intentar usar un ndice. Se utiliza un ndice si se especifica (una parte gen‚rica de) los campos del ndice concatenados con el operador lgico ANDs en la declaracin WHERE de la clausula SELECT. Teneis que observar que las clausulas complejas son "veneno" para el optimizador de sentencias de cualquier sistema de base de datos.

Por ello cuando se realiza un SELECT es muy importante que campos componen la sentencia WHERE, porque puede implicar realizar una lectura secuencial de la tabla (leyendo cada uno de los registros que componen la tabla) o una lectura directa (utilizando un ndice creado sobre esta tabla), con la implicacin que lleva esto respecto al rendimiento y consumo de recursos. El orden de los campos, no es tan importante, porque el optimizador de Base de Datos los reordena. (en las pruebas que he realizado en la comprobacin del tiempo de ejecucin, la duracin de las SELECTs cambiando nicamente el orden de los campos, tanto en DB2 como ORACLE, el tiempo de ejecucin es prcticamente el mismo).

Por ejemplo para la tabla BSEG, tabla cluster de documentos contable que tiene elndice primario compuesto por MANDT, BUKRS, BELNR, GJAHR, BUZEI y es el nico ndice que esta definido en esta tabla al ser una tabla cluster. Veremos como afecta en el tiempo de respuesta el realizar una SELECT de forma correcta.

Esta tabla en este momento tiene 1.778.859 entradas y esta asociada a la tabla cluster RFBLG que tiene un campo VARDATA de 3800 bytes (fsicamente el sistema accede a la tabla RFBLG).

Si realizamos la siguiente select con estos valores:

SELECT * FROM BSEG
  WHERE     BUKRS = 'DUNE'
	AND BELNR = '9900079182'
	AND GJAHR = 2001
	AND BUZEI = 002.
ENDSELECT.

Tarda 144 ms. en ejecutarse porque realiza una lectura directa al aprovechar el ndice creado; en cambio si realizamos la siguiente select (que obtendremos la misma informacin, porque nicamente hay una sociedad definida, si hubiera mas sociedades, con ms razn se tendra que incluir el campo BUKRS en la SELECT).

SELECT * FROM BSEG
  WHERE     BELNR = '9900079182'
	AND GJAHR = 2000 
	AND BUZEI = 002.
ENDSELECT.

Sin referencia al campo BUKRS, tarda 11.797 ms. en ejecutarse, un 8.192 % ms al tener que realizar una lectura secuencial de la tabla al no poder utilizar el ndice. Si esta SELECT se ejecutase en un bucle de 1.000 repeticiones o fuera una transaccin frecuentemente utilizada tendramos:

- 1.000 * 144 ms. = 144000 ms. ? 144 s. (2 minutos y 24 segundos)

- 1.000 * 11.797 ms. ? 11.797 s. (3 horas 16 minutos y 37 segundos)

Pasamos de un programa que se puede ejecutar en minutos a ejecutarse en horas, con la implicacin de consumo de CPU del sistema, ocupacin de procesos SAP (teniendo en cuenta que actualmente en nuestro sistema tiene 24 procesos de dilogo y 4 de fondo, si muchos usuarios utilizasen este programa podran bloquear el sistema SAP), muchos accesos a disco (costoso en tiempo), aumento de trfico de red (especialmente si el servidor de base de datos es distinto al de aplicacin), tiempo de ejecucin (produciendo descontento en el usuario final).

Tambin se ha de tener en cuenta que aunque ABAP, si la tabla es dependiente de mandante, implcitamente añade en la clusula WHERE del SELECT el campo MANDT, cuando se crea un nuevo ndice en una tabla dependiente de mandante, se tiene que añadir explcitamente el campo MANDT y no crear un nuevo ndice que sea un subconjunto en el mismo orden que un ndice creado. Ejemplo:

Tabla WITHITEM ndice primario: MANDT, BUKRS, BELNR, GJAHR, BUZEI, WITHT

Si creramos un ndice secundario con los campos: BUKRS, BELNR, GJAHR, BUZEI

Tendramos 2 errores:

  • No contiene el campo MANDT
  • Es un subconjunto en el mismo orden de campos. Sera distinto crear un ndice formado por los campos: MANDT, BELNR, BUZEI

Veamos dos herramientas proporcionadas por SAP que nos pueden servir para analizar y mejorar el rendimiento de nuestros programas.

La herramienta SQL TRACE

EI SQL trace es una herramienta que permite visualizar y analizar los contenidos de las llamadas de base de datos que son efectuadas por los informes y transacciones escritas en ABAP. Utilizando esta utilidad se pueden realizar las siguientes acciones:

  • Visualizar cada una de las instrucciones ABAP OPEN SQL cuyas sentencias de SQL embebido (DECLARE, PREPARE, OPEN, FETCH) hayan sido ejecutadas.
  • Analizar las consecuencias de la actuacin del sistema, por ejemplo, que valores utiliza el sistema para accesos y modificaciones a bases de datos especficas.
  • Identificar los accesos innecesarios a la base de datos y dnde son ejecutados los COMMIT.

Creacin de una traza SQL

Para crear una traza SQL, ejecutar los siguientes pasos:

  • Desde cualquier pantalla R/3, seleccionar la opcin de men Sistema->Utilidades ->Trace SQL o, como alternativa, introducir la transaccin ST05 en el campo de comandos.
  • Marcar la casilla de seleccin SQL trace, introducir la ruta del nombre del fichero en el que se va a guardar el log de la traza (no es necesario) y pulsar el botn Trace on.
  • Introducir el nombre de usuario para el usuario bajo cuyos privilegios el programa va a ser ejecutado y analizado. El campo status de traza cambiar a on.
  • Ejecutar el programa o la transaccin que se desea analizar con el usuario que hemos indicado. (es recomendable utilizar el usuario "desarrollador" para activar la traza y un usuario de "pruebas" para ejecutar el programa, de esta forma la traza ser limpia)
  • Retomar a la pantalla inicial del SQL trace (ST05) y pulsar el botn Trace off

Anlisis de una traza SQL

Para visualizar una traza SQL previamente creada, ejecutar los siguientes pasos:

Pulsar el botn Trace list. El sistema solicitar:

  • Nombre del fichero de SQL trace: donde la traza fue almacenada.
  • Modo de trace: traza a mostrar (SQL, Enqueue, RFC trace).
  • Nombre de usuario: usuario bajo el cual se cre la traza.
  • Perodo: perodo de tiempo a analizar.
  • Duracin: tiempo de operacin a considerar durante el anlisis.
  • Operacin: operacin SQL a analizar.
  • Despus, pulsar el botn OK.

El sistema presentar un listado con todas las llamadas de base de datos, indicando cundo fueron realizadas, el programa, la tabla accedida, as como las operaciones de SQL embebido.

Para conocer que sentencia ABAP fue el origen de la operacin SQL, posicionar el cursor en el campo de programa y hacer clic en el botn ABAP Display.

Para visualizar la informacin de la definicin del diccionario de la tabla accedida posicionar el cursor sobre el campo Table y pulsar el botn DDIC info.

El sistema tambin incluye una utilidad para proporcionar informacin detallada sobre la estrategia de operacin SQL seguida por el sistema de base de datos subyacente. Para visualizar esta informacin, posicionar el cursor sobre la lnea a analizar y pulsar el botn Explain SQL.

El sistema visualiza el plan de ejecucin para las sentencias SQL. Aqu, se pueden visualizar las sentencias SQL reales y descubrir si al acceso est siendo efectuado utilizando ndices o simplemente es secuencial. Esto puede ser bastante til para transacciones de larga ejecucin, especialmente cuando concierne a accesos de base de datos. En un sistema con base de datos DB2, tiene una opcin interesante que es la de ndice recomendado, especialmente cuando en la SELECT hay un "join" o una vista a dos o ms tablas, para saber que ndice se ha de crear, o si se puede cambiar la clausula WHERE para mejorar el acceso a las tablas.

Herramienta anlisis del tiempo de ejecucin.

El analizador del tiempo de ejecucin es una herramienta del ABAP workbench bastante til para analizar la ejecucin de un programa ABAP o una transaccin. Con esta herramienta, el sistema puede mostrar informacin sobre los siguientes aspectos:

  • Tiempo de ejecucin.
  • Instrucciones ejecutadas y jerarqua, ordenadas por tiempo de ejecucin o categora de las instrucciones.
  • Tablas accedidas y tipos de accesos.
  • Flujo cronolgico de ejecucin.

Esta herramienta puede ser til para identificar:

  • Qu partes de programas tienen una intensa carga de CPU.
  • Si partes de programas estn o no correctamente estructuradas.
  • La cantidad y el tipo de accesos de base de datos.

Creacin de un fichero de datos de rendimiento / (anlisis del tiempo de ejecucin)

Existen varios caminos de acceso para crear un fichero de datos de rendimiento en la herramienta de anlisis del tiempo de ejecucin:

  • Desde la pantalla inicial del ABAP workbench, seleccionar Test->Anlisis del tiempo de ejecucin.
  • Desde el editor de cdigo fuente ABAP, seleccionar Utilidades->Ms utilidades->Anlisis tmpo. ejec.
  • Desde la pantalla inicial del editor ABAP, seleccionar Programa->Ejecutar->Anlisis tmpo. ejec.
  • Desde cualquier pantalla R/3, seleccionar Sistema->Utilidades->Anlisis del tiempo de ejecucin->Ejecutar.
  • Introducir el cdigo de transaccin SE30 en el campo de comandos.
  • Desde el repository browser, seleccionar un programa o transaccin y entonces seleccionar Entorno->Desarrollo programas->Anlisis tmpo. Ejec.

Para ejecutar este anlisis, seguir los siguientes pasos en dicha pantalla:

  • Seleccionar el objeto que se quiere analizar, haciendo clic en el botn de seleccin correspondiente a Transaccin / Programa / Mdulo de funcin.
  • Introducir el nombre del objeto que va a ser analizado en el campo del botn de seleccin marcado.
  • Seleccionar las opciones y restricciones para el anlisis.
  • Pulsar en el icono Medir tiempo de ejecucin o men Anlisis tiempo ejecucin->Ejecutar. EL sistema ejecutar el objeto seleccionado (programa/transaccin/mdulo de funcin) y generar un fichero de traza (fichero de datos de rendimiento) que podr ser analizado cuando la ejecucin del objeto haya finalizado.

Opciones con la que se puede ejecutar

Opciones Descripcin

Con subrutinas Indica si estn o no incluidos los PERFORM en el anlisis. Por defecto estn incluidos. Si no se incluyen, el tiempo de ejecucin de cada PERFORM se asigna al programa que realiza la llamada.

Con tablas internas Incluye en el anlisis detallado, las instrucciones relacionadas con tablas internas (COLLECT, APPEND, etc.).

Con info tcn. BD Registra informacin t‚cnica sobre las operaciones de base de datos. Esta opcin consume muchos recursos, por lo que no es recomendable excepto para situaciones muy especficas.

Con gestin de memoria Registra informacin de la gestin de memoria para los procesos de trabajo.

Mdulo de funcin Slo registra las llamadas a un nico mdulo de funcin.

Unidades particulares

Slo registra la actividad de una parte del programa. Estas partes pueden ser definidas:

  • Estticamente: las sentencias SET RUN TIME ANALYZER ON y SET RUN TIME ANALYZER 0FF estn incluidas para marcar el rea a ser analizada.
  • Dinmicamente: en este caso, el comienzo y el final del anlisis se definen ejecutando, en el momento requerido, la opcin Sistema->Utilidades->Anlisis del tiempo de ejecucin->Activar, o Sistema->Utilidades->Anlisis del tiempo de ejecucin->Desactivar.

Todas Guardan un registro de todas las actividades del programa.

Los ficheros de rendimiento se crean a nivel de sistema operativo en el directorio de datos de la instancia. Estos ficheros podran ocupar mucho espacio de almacenamiento, por lo que se debe asegurar el borrado de los ficheros que ya no van a ser necesarios.

Anlisis de un fichero de datos de rendimiento

En la pantalla inicial de anlisis del tiempo de ejecucin de ABAP, seleccionar la opcin de men Anlisis del tiempo de ejecucin->Otro fichero... o simplemente pulsar el botn Ejecutar ficheros. El sistema mostrar una ventana de dilogo para seleccionar el usuario u objeto desde el que seleccionar la trace correspondiente al fichero de datos de ejecucin.

De acuerdo a la seleccin previa, el sistema visualiza una lista de los ficheros de traza existentes. Seleccionar un fichero marcando su casilla de seleccin y pulsar el botn Evaluar.

El sistema entonces muestra la pantalla de Evaluacin del anlisis del tiempo de ejecucin: resumen incluyendo unos grficos de barras con los tiempos totales de ejecucin y las estadsticas para la ejecucin de algunas acciones del programa.

Pulsando en los botones disponibles, se pueden analizar varias clases de informacin. A continuacin, se describe un resumen de estas funciones:

  • Lista Ranking Visualiza una lista con las instrucciones ms "caras" para el sistemas ordenadas por tiempo de ejecucin. La lista incluye el programa, nmero de ejecuciones y tipos de instrucciones (ABAP, base de dates o sistema R/3).
  • Lista de aciertos de tablas Visualiza las tablas ms importantes, el nmero de accesos y el tiempo necesario para esos accesos. Tambi‚n indica si la tabla est incluida en alguno de los buffers.
  • Lista de aciertos de grupos Muestra una lista con las instrucciones ejecutadas clasificadas por el tipo de instruccin: PERFORM, MODULE, CALL FUNCTION, etc.
  • Jerarqua de llamadas Presenta un listado cronolgico con el flujo de llamadas durante la ejecucin de un programa o transaccin.

Para una correcta comprensin de los resultados de un anlisis del tiempo de ejecucin, es importante conocer las diferencias entre los t‚rminos Tiempo bruto y Tiempo neto:

  • Tiempo bruto: es el tiempo total incluidos los tiempos de todos los subcomponentes (MODULE, PERFORM, CALL FUNCTION, CALL SCREEN, CALL TRANSACTION, CALL DIALOG, SUBMIT). *Tiempo neto: es el tiempo bruto menos los tiempos de los subcomponentes.

Es posible reducir el nmero de tipos de llamada que presenta el anlisis del tiempo de ejecucin en los listados de salida mediante el uso de filtros. Estos filtros pueden ser activados desde la pantalla inicial de anlisis del tiempo de ejecucin seleccionando la opcin de men Tratar->Filtro vis. o pulsando en el icono Filtro vis.

Dentro de esta transaccin, existe una opcin interesante que es la de Trips & Triks, que muestra ejemplos y comparaciones (podeis tambin ejecutar y comparar vuestros ejemplos) de tiempo de ejecucin de sentencias SQL, manipulacin de strings, tablas internas, tipo de variables, If / Case y conversin de campos.