Este es el primero de una serie de temas enfocados a explicar las mejores practicas a la hora de hacer consultas a la base de datos en ABAP. Hacer esto mal, resulta en un problema en el futuro, ya que a medida que los registros en la base de datos van creciendo, los programas comienzan a sentirse más y más lentos. En esta ocasión veremos las mejores practicas para hacer consultas a una sola tabla.
Limitar la cantidad de datos a leer.
El primer paso para mejorar el rendimiento de un programa (y uno muy importante) es reducir la cantidad de datos a leer (esto ayuda también a no saturar mucho la red). Para lograr esto siempre debemos especificar una lista de campos en lugar de hacer un select * y especificar siempre una condición where adecuada.
También es recomendable reducir la cantidad de consultas, por ejemplo si queremos leer las descripciones de 5 centros, en lugar de hacer 5 lecturas, hacemos una sola lectura para los 5 centros y los colocamos en una tabla interna.
En el siguiente ejemplo se aplican las siguientes buenas practicas:
- Se indican únicamente los campos que se necesitan en lugar de recuperarlos todos indicando.
- Se usa INTO TABLE, en lugar de INTO CORRESPONDING FIELDS OF TABLE (esto requiere un poco más de procesamiento para calcular el campo adecuado en donde se coloca el dato)
- Se limita la cantidad de registros a leer, mediante la clausula WHERE.
SELECT werks name1 "Limitar campos INTO TABLE it_centros "Evitar into corresponding FROM t001w WHERE werks IN so_werks. "Limitar registros
La clausula WHERE
Seleccionar los campos que utilizaremos en la clausula where es muy importante en tablas con muchos registros, por lo general debemos indicar aquellos que correspondan a un indice (Transacción SE11 para consultar los campos que pertenecen a un indice).
Siempre que sea posible debemos indicar un conjunto de campos que se encuentren en un mismo indice, si esto no es posible y la tabla no tiene ya muchos indices (más de 7), podemos crear un nuevo indice si nuestra lectura es demasiado lenta.
Tambien debes evitar el uso de negaciones, por ejemplo
WHERE werks NOT IN so_werks. "Evitar uso de negaciones
Existe una opción llamada for all entries, esta sirve para recuperar datos en base a las entradas en una tabla interna. En el siguiente ejemplo se recuperan todos los registros de la tabla t001w para todos los centros que esten en la tabla interna it_werks
SELECT werks name1 INTO TABLE it_centros FROM t001w for all entries in it_werks WHERE werks = it_werks-werks.
Sin embargo, esto puede traer problemas de rendimiento ya que si la tabla interna it_werks esta vacía ABAP ignora toda la clausula where y recupera la tabla completa, por esto es recomendable siempre hacer una validación antes para ver si la tabla interna no esta vacía.
DATA: cantidad_lineas TYPE i. "Verificar que la tabla interna no esta vacia DESCRIBE TABLE it_werks LINES cantidad_lineas. IF cantidad_lineas > 0. SELECT werks name1 INTO TABLE it_centros FROM t001w FOR ALL ENTRIES IN it_werks WHERE werks = it_werks-werks. ENDIF.
Estimados tengo una presentación mañana temprano y deseo comunicarle al cliente del xq no es bueno darle acceso de usuario a la base de datos pero con un sustento de buenas prácticas de SAP o notas SAP relacionadas.
Gracias
Hola, no tengo documentos de SAP a la mano para sustentarlo, pero en la practica se hace muy facil intentar corregir algo directamente en la base de datos, pero resulta en un problema aun mayor. Al editar tablas que no conocemos podemos dejar inconsistencias e incluso arruinar por completo transacciones de SAP. Lo mejor es hacer siempre todo desde SAP, lo unico que se puede editar son tablas Z