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:
Veamos dos herramientas proporcionadas por SAP que nos pueden servir para analizar y mejorar el rendimiento de nuestros programas.
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:
Para crear una traza SQL, ejecutar los siguientes pasos:
Para visualizar una traza SQL previamente creada, ejecutar los siguientes pasos:
Pulsar el botn Trace list. El sistema solicitar: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.
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:
Esta herramienta puede ser til para identificar:
Existen varios caminos de acceso para crear un fichero de datos de rendimiento en la herramienta de anlisis del tiempo de ejecucin:
Para ejecutar este anlisis, seguir los siguientes pasos en dicha pantalla:
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.
Slo registra la actividad de una parte del programa. Estas partes pueden ser definidas:
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.
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:
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:
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.