Consejos para optimizar las consultas la base de datos en ABAP (una tabla)

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:

  1. Se indican únicamente los campos que se necesitan en lugar de recuperarlos todos indicando.
  2. 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)
  3. 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).

Consulta de indice en transaccion se11

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.
Consejos para optimizar las consultas la base de datos en ABAP (una tabla)

2 comentarios en «Consejos para optimizar las consultas la base de datos en ABAP (una tabla)»

  1. 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

    1. 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

Responder a Joseph Pérez Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll hacia arriba