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.