jueves, 6 de noviembre de 2014

Experiencia con Tablas Indexadas

Bueno, hace ya 10 meses comencé trabajando como Analista en Inteligencia de Negocios (Business Intelligence o BI) ,y parte del trabajo es realizar los ETL (Extraction Transform Load) que practicamente lo realizamos en paquetes PL/SQL de Oracle. Y como se maneja mucha información (millones de registros) por el tráfico que se analiza ( ya que trabajo con una telefónica) una de las tareas era integrar los procesos de un area fuera de BI. Bueno, se integraron los procesos PL/SQL y se mejoraron los paquetes, pero tal fue mi sorpresa que los queries tardaban una eternidad.

Empece a realizar un traceo de estos, llegando a observar que la mayor carga se realizada en los queries anidados. Un query anidado es una consulta q esta dentro de otra consulta pongo un ejemplo

SELECT columna1, (select otra_columna from una_tabla where t1.llave = llave ) columna_2 FROM tabla_principal t1

aqui, obtengo los valores de columna_2 por medio de una consulta basado en un criterio de búsqueda.

Bueno, mi problema radicó que cuando se realizaban consultas desde mi tabla_principal para obtener los valores de columna_2, tardaba como 20 minutos con solo 100 mil registros (claro obviamente el ejemplo anterior es muy simple a lo que realmente estaba realizando, pero se puede llegar a utilizar ese tiempo) . Lo primero que hice fue identificar el porqué.

Revisando la estructura de una_tabla, verifiqué que tenia campos indexados, y las búsquedas las hacia por un campo que no estaba indexado. Y justo ese día estaba conversando sobre optimización (SQL tunning) de consultas SQL con un colega, y le recomendé utilizar indexación por el motivo del uso de arboles B en Oracle para la inserción de registros. Y bueno, use esos conceptos de indexación de en la tabla sobre el campo que se utiliza en la búsqueda. Tal fue mi sorpresa , que cuando ejecuté nuevamente mis procesos, el ETL tardo absurdamente 3 segundos para los 100 mil registros.

Muchas veces obviamos los conceptos que la literatura nos dá para poder aplicarlos, gracias a la conversacion de SQL Tunning y a mi previa lectura de un buen manual de Oracle pude aplicar este concepto.

No hay comentarios: