Close

enero 17, 2013

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.

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

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

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.