Tablas Hashed y un poco de performance

En estos últimos meses he estado trabajando en reportes que consultan varias tablas y con ello forman un super reporte (por eso comprenderan mis escasas publicaciones), y dentro de las mejoras a realizar se encontraba el ahorro de tiempo en ejecución. Dentro de estos puntos pude aprender más acerca de las tablas HASHED y los beneficios que estas tienen al hacer consultas con el comando READ, por otro lado se debe examinar bien su uso, para ello dare mi punto de vista en cuanto a sus ventajas y desventajas y luego su respectivo ejemplo para que pueda ser usado en código.

 

Ventajas: 

– Su principal aprovechamiento es al hacer consultas con el comando READ, ya que lo normal que hace el código cuando usamos una tabla estándar es recorrer toda la tabla interna hasta encontrar la primera coincidencia con el campo buscado. Al usar una tabla hashed la búsqueda se hace con algoritmos internos que hacen la búsqueda directa y el tiempo de espera es microsegundos.

– Otra ventaja es que se evita la duplicidad de datos, ya que trabaja de acuerdo a sus llaves declaradas. OJO esto es ventaja cuando se tiene claro el panorama a trabajar, pero sino se convierte en desventaja como comentare abajo.

 

Desventajas:

– Si no se tiene claro cuales serán los campos clave, no se recomienda su uso. Al emplear llaves estos datos nunca deben repetirse, sino ocasionan dump y obviamente un dolor de cabeza si es que no se sabe como ordenar la información adecuadamente.

– No es adecuada para obtener el indice en loops indexados. Yo lo quise intentar para obtener la posición de lectura inicial, pero como menciono en la primera desventaja, la tabla no acepta duplicado de campos llave, por lo tanto la cantidad de información que tengo en mi tabla hashed es mucho menor a la que tendría en mi tabla estandar, a la cual quiero hacer loop, y por ende esto no me traería correctamente el indice.

– Si la tabla a consultar cuenta con varios campos repetidos por el campo llave,  al intentar insertar directo en la tabla HASHED me da un dump de duplicidad de llave (ITAB_DUPLICATED_KEY en inglés). Por ende cualquier lectura que se quiera hacer en un SELECT y se va a pasar a una tabla HASHED verificar que los campos llaves nunca se van a ver duplicados. Caso contrario, evaluas si puedes hacer un filtro inicial o en su defecto utilizas una tabla STANDAR pero luego en un LOOP le insertas los valores a la tabla HASHED.

– No puedo hacer una copia de tabla haciendo lo siguiente: GT_TABLA1[] = GT_TABLA2[] o usar el comando APPEND. Lo que he podido hacer en estos casos es:

LOOP AT GT_TABLA2.

  GT_TABLA1 = GT_TABLA2. “Tambien se puede usar MOVE-CORRESPONDIG

  INSERT TABLE GT_TABLA1.

ENDLOOP.

*Donde las tablas tienen cabecera (WITH HEADER LINE). 

 

Quizás ustedes estimados lectores pueden poner en los comentarios más ventajas o desventajas de usar este tipo de tabla y sería enriquecedor que hagan ello.

Si bien en lo anterior tengo mayores desventajas, al momento de hacer lecturas en tablas identificadas con claves principales si facilita mucho en tiempo, por lo general este tipo de lectura lo he usado en tablas conocidas con llaves ya definidas como por ejemplo BKPF (Cabecera de documentos financieros) o tablas de texto como la MAKT (texto de materiales), allí obviamente se identifica que campos son claves y según ello hago mi código. En otras tablas si pueden haber algunas redundancias pero lo que realizo es el código colocado en las desventajas, donde primero lo obtengo en una tabla STANDAR y luego ello lo inserto en la tabla HASHED y ya hago mis lecturas.

 

Ejemplo de uso en código:

En el siguiente ejemplo vamos a Imprimir un reporte que usa datos de la tabla BSIS y BKPF, para ello como parámetro de entrada solo tenemos el número de cuenta contable (HKONT).

 

REPORT ZLI_PRUEBA1.

TYPES: BEGIN OF TY_BSIK,
BUKRS TYPE BSIS-BUKRS,
BELNR TYPE BSIS-BELNR,
GJAHR TYPE BSIS-GJAHR,
BUDAT TYPE BSIS-BUDAT,
HKONT TYPE BSIS-HKONT.
TYPES: END OF TY_BSIK.

TYPES: BEGIN OF TY_BKPF,
BUKRS TYPE BKPF-BUKRS,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF-GJAHR,
AWKEY TYPE BKPF-AWKEY.
TYPES: END OF TY_BKPF.

DATA: GT_BSIK TYPE TABLE OF TY_BSIK WITH HEADER LINE,
GT_BKPF TYPE HASHED TABLE OF TY_BKPF WITH UNIQUE KEY BUKRS BELNR GJAHR WITH HEADER LINE.

*Como se puede ver declaramos la tabla HASHED indicandole que campos son llave

 

PARAMETERS: P_HKONT TYPE BSIS-HKONT.

 

START-OF-SELECTION.

SELECT BUKRS BELNR GJAHR BUDAT HKONT INTO TABLE GT_BSIK FROM BSIS
WHERE HKONT = P_HKONT.

SELECT BUKRS BELNR GJAHR AWKEY INTO TABLE GT_BKPF FROM BKPF
FOR ALL ENTRIES IN GT_BSIK
WHERE BUKRS = GT_BSIK-BUKRS
AND BELNR = GT_BSIK-BELNR
AND GJAHR = GT_BSIK-GJAHR.

*En este caso el reporte no nos dará dump pues los campos llaves nunca se deberían repetir.

*Otro punto importante aprovechando el ejemplo es la forma en hacer el SELECT, muchas veces colocan 

*el comando * INTO CORRESPONDING FIELDS OF TABLE, si estamos viendo un tema de performance

*lo aconsejable será que en toda consulta SELECT se le indique que valores deseamos obtener y acomodarlos

*según tenemos nuestra tabla declarada, ello mejorara también el tiempo de respuesta de la consulta.

 

*Impresión del reporte

LOOP AT GT_BSIK.
READ TABLE GT_BKPF WITH TABLE KEY BUKRS = GT_BSIK-BUKRS
BELNR = GT_BSIK-BELNR
GJAHR = GT_BSIK-GJAHR.
IF SY-SUBRC = 0.
WRITE:/1 GT_BKPF-BELNR.
WRITE GT_BKPF-GJAHR.
WRITE: GT_BKPF-AWKEY.
WRITE: GT_BSIK-BUDAT DD/MM/YYYY.
WRITE: GT_BSIK-HKONT.
ENDIF.
ENDLOOP.

 

*Salida del programa:

10-03-2015 05-19-14 p-m-

 

*Pantalla de Selección

10-03-2015 05-18-56 p-m-

 

*Mensaje de DUMP por duplicado de llave:

10-03-2015 05-25-51 p-m-

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s