jueves, 6 de noviembre de 2014

Ayuda en version de una Base de Datos Oracle

Para ser un buen administrador de Bases de Datos, se debe conocer todos los tips que la literatura nos brinda. Una de ellas son los manuales técnicos y gracias a la gente de muchas editoras de libros digitales tenemos muchos. Un día me preguntaron como saber la version de Oracle se estaba usando en una empresa de telecomunaciones. Les indique que veriquen los instaladores :P, pero no sabian quien los había instalado. 

Pero bueno, para todo hay solución. La respuesta, Oracle usa vistas del sistema q nos dá a los administradores de Bases de Datos (o bueno a los que accedemos a bases de datos Oracle también) y ahí entra en accion  SYS.V_$VERSION.

Esta vista da información sobre la instalación que actualmente corre sobre su sistema de Bases de Datos Oracle. Lo único que se necesita es tener acceso a una base de datos (TNS name, user password) y un cliente de bases de datos (slq* plus, toad, sqldeveloper) y realizar un 

select * from SYS.V_$VERSION.

Bueno, no creo q sea problema publicar la version de base de datos que actualemente uso, pero les adjunto la información para que tengan conocimiento lo que se usa en un ambiente de producción

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE 11.2.0.2.0 Production"

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.