Mejoras en nuestras consultas

Esto además de ser una reflexión acerca de nuestras consultas, también lo que va a intentar es dar algunos tips de consultas que pueden servir para todos los que trabajan en BI.

Volviendo un poco al pasado, me acuerdo que cuando comencé a trabajar en BI, me toco comenzar a aprender mucho acerca de consultas porque para ese entonces estaba en la moda de ser un programador de java y estaba dando mis primeros pinos en PDH. La primeras consultas que hice fue con mucho miedo porque no quería realizar consultas que fueran a tumbar la base de datos pero la verdad es que trabajaba en una multinacional y por ende tenían una gran máquina, adicional a esto me daba mucho miedo enfrentarme a un súper modelo que me intentaron explicar en dos días y tengo que admitir que dormí en varios momentos de la reunión en la que me estaban explicando el modelo (Modelo de Industria de Teradata para Seguros).

Comencé con consultas pequeñas y las iba guardando para cogerme confianza y a partir de allí iba metiéndoles joins y demás. Sin embargo por el constante pedido de información de los usuarios de áreas como mercadeo comencé a coger más cancha y me puse a hacer consultas de toda índole creyendo que ya sabía de esto.

Después de esto me llego una excelente charla en la que me dijeron ¿Hey cuando tiras un query miras como se hace la consulta? Eso fue como quebrar algo en mi mente y me di cuenta que la mayoría de las BD's (Oracle, Teradata, SQL Server, etc) te dan el chance de mirar el comportamiento de las consultas.

Con ese nuevo conocimiento me fui corriendo a hacer puros explain plan de mis consultas y cuando lo hice me di cuenta de algo, no entendía absolutamente nada de lo que decía allí la base de datos. Fue entonces cuando comencé a leer de índices, primero en Teradata y luego en Oracle que eran los motores de Bases de datos en los que trabajaba por ese entonces.

En Teradata la cogí de una y me di cuenta de varias verdades de Teradata:

1. No existen PK's, todo lo que existen son los índices: Esto es muy potencial si el desarrollador es bueno, pero puede ser perjudicial para una persona que no esté preparada.
2. Lo más importante es el Primary Index (Para Teradata esto es como una PK): Esto porque por medio de esta Teradata hace sus reparticiones en los AMP's (Para mayor información ver la nota LINK DE ARTICULO TERADATA).
3. Los Secundary Index sirven muy poco en Teradata pero pueden mejorar el performance: Esto me dio risa cuando me di cuenta de esto porque yo dije, entonces ¿Cuál es el motivo de que existan? Pues básicamente porque es importante porque pueden ayudar, pero no es garantía porque lo que hace el motor es crear una tabla adicional para guardar donde existe el registro que se refiere a ese valor, pero físicamente la BD no hace más que esto.

Con estos tres tips me fui a leer explain plan, convencido de que los iba a entender y me di cuenta que si los estaba entendiendo mejor porque me estaba dando cuenta en el explain si mi query se iba por un índice primario o secundario. Adicional a esto me daba un estimado del tiempo que se demoraba en cada paso por lo que lograba identificar donde era más costoso hacer el query.

Lo que paso después fue algo sorprendente ¿Me iba a poner a hacer explains y analizar tantas cosas luego de construir mis consultas? Algo mucho pero ¿Iba a Cuestionar a Microstrategy en la construcción de los querys que hace la herramienta para las consultas de la Bodega de Datos?

Muchos me podrán tildar de obvio pero créame que yo en esa época parecía niño estrenando juguete. Adicional esta actitud me ayudo a encontrarme con algo importante y es ¿que tips adicionales puedo tener al momento de crear las consultas?

Me encontré con cosas muy interesantes que me ayudaron mucho:

1. Trate de filtrar las consultas por los índices creados en las tablas para que sean más rápido las consultas.
2. Los joins también en la medida de lo posible, debo hacerlos por los índices de las tablas.
3. Cuando haga un count, hágalo así Select Count(1) from {tabla} en vez de Count(*) from {tabla}, esto a cuenta de que al poner el * hacemos que la base de datos tenga que pasar por todas las columnas de las filas para poder contar el registro, en cambio si lo hago con la constante lo que hace es ver la fila, sin recorrer todas las columnas.
4. La precedencia de los operadores: Esto sí que me ha ayudado porque en la BD se hace más rápido la consulta dependiendo del operador usado en las condiciones (WHERE):
         a. Con un operador como = en vez de poner cualquier otro operador, se hacen las consultas óptimas.

         b. Si se usa el operador Like con %, entonces hágalo así: Select * From {Tabla} Where {Campo} like 'Dieguinho%'; en vez de Select * From {Tabla} Where {Campo} like '%Dieguinho%'; o Select * From {Tabla} Where {Campo} like '%Dieguinho%';, esto a causa de que si lo hacemos de la manera correcta cuando el motor busque se va para todos los valores que tengan Dieguinho al inicio y de ahí devuelve la data más rápido que si lo hace del otro modo, la BD llega la tabla y la recorre toda, haciendo más esfuerzo.
         c. si tiene una consulta de > o < haga lo siguiente: Select * From {tabla} Where {campo1} <= 3; en vez de Select * From {tabla} Where {campo1} < 2; esto a cuenta de cómo operan las BD's porque si se pone de la primera, el busca el igual al tres y de ahí para arriba los devuelve, en cambio sin el igual lo que hace es mirar los datos y comparar si es mayo a dos o no.
         d. No use el NOT por lo mismo, es más fácil para la BD buscar el = o el Like o el Exist que la negación de algo porque debe recorrer toda la tabla.
         e. Use Union en vez de hacer OR en un mismo query.
         f. Ojo con los subquerys, en caso de ser necesario y posible, es mejor hacer esto: Select * From {tabla1} a, (Select * From {Tabla 2} Where {campo1} = 'X') tmp Where a.{campo_join} = b.{campo_join}; en vez de Select * From {tabla1} a where a.{campo_join} in (Select {campo_join} From {Tabla 2} Where {campo1} = 'X');

Luego de esto no me puse a ver explain de todos mis querys, solo de los necesarios y comencé a construir consultas más eficientes y para mis usuarios expertos que hacían sus propios querys, me ayudó a mejorarles sus consultas y esto me ayudó mucho.

En alguna entrada posterior, voy a seguir con esta historia que continua pero con la creación de tablas y todo lo que se debe crear para su optimización porque cronológicamente cuando me vieron hacer consultas eficientes, pase de ser creador de consultas a ser creador de modelos.


:D

Comentarios

Entradas populares de este blog

Como Construir la dimension tiempo en SQL SERVER

Reiniciar el Intelligence Server de Microstrategy

Extraccion, Transformación y Carga