¿por qué los cubos se tardan cada día más y más en procesarse?

5 11 2008

Tortuga

Es un comentario frecuente “hace un año se tomaba una hora, hoy se tardan 2″ ¿Qué es lo que ha ocurrido? ¿Se puede optimizar?¿se puede bajar el tiempo?

Respuestas hay varias pero creo que las mas importantes son:

El volumen de información ha crecido y no tenemos una estrategia adecuada para refrescar el cubo. He visto MUCHAS veces cubos que se reprocesan completamente en su historia, así que cada mes el volumen a procesar se incrementa… Esto quiere decir que se borran todos los datos y se generan desde cero. Hay una gran oportunidad aquí. Los cubos o las herramientas no necesitan reprocesarse completamente, solo necesitan refrescar aquella parte que ya cambió. Si por ejemplo, las ventas solo están cambiando este mes entonces reprocesemos y refresquemos la información de únicamente este mes. Para esto se pueden usar varias estrategias como las particiones o manipulación de información en el ETL.

…y a veces hasta los 5 años de historia del data warehouse se generan de nuevo Hypnotized

Otra pudiera ser que está procesando únicamente el mes o día actual pero ahora hay mas transacciones. Pareciera obvio pero hay que decirlo. Hace dos años había información de 10 tiendas y ahora tenemos 20, hará una año se vendían 1000 dlls ahora se venden 2000. Mayor volumen implica mas trabajo, mas acceso a disco, etc. A veces sucede que el ancho de banda de la red no es suficiente para transferir la información a buen ritmo. Ha sucedido que existe un superserver, con un super site, pero el socket para el cable de red junto al servidor tiene 10 años y es de 10 MBITs.

Sucede.

About these ads




Creando mejores agregados para optimizar el performance de un cubo (o el Data Warehouse)

19 09 2008

image

Muchas veces he visto cubos saturados de agregados. Los agregados son totales pre-calculados de la información y sirven para acelerar el tiempo de respuesta de las consultas.

Un agregado:

  • Ocupa espacio
  • Toma tiempo de procesamiento el llenarlo.

Lo anterior quiere decir que los agregados no son gratis.

Puede ser que un mes de información en la tabla de hechos ocupe 100 megas y los agregados para ese mes 50 megas. Tal vez llenar la tabla de hechos tome 10 minutos pero calcular los agregados tome una hora.

Así que no hay que crear agregados por crearlos, hay que analizar y poner en la balanza cuales realmente traerán beneficios y el costo que implicarán mantenerlos.

Los motores de cubos normalmente tienen un "query advisor" o parecido que pueden ayudar a sugerir los agregados. Hagamos de cuenta que esto no existe ¿cuáles pueden ser buenos agregados?

Pensemos:

Un agregado es un total de la información, si tengo un cubo, estrella o copo de nieve de ventas con 540 millones de registros y mi compañía se divide en 4 regiones (Norteamérica, América Latina, Europa y Asia) y quiero un agregado por región lo que obtendremos es una tabla con 4 registros. 1 registro con el total para la zona norte, uno para la zona sur, uno para la zona este y otro para la oeste.

Norteamérica $2,345,000
América Latina $1,934,567
Europa $2,567,000
Asian $2,200,000

Si quiero saber cuánto vendió la zona norte solo se barren únicamente 4 registros y no los 54 millones. Ahora, normalmente las regiones agrupan paises. Si quiero saber cuánto vendimos se vendió en la Canadá que pertenece a la zona norte no podemos usar el agregado anterior.

Lo que necesitamos es un agregado por Ciudad.

EUA $1,250,000
Canada $1,095,000
Inglaterra $1,490,000
España $1,077,000
China $989,000
Japon $1,211,000

Suponiendo que tenemos ventas en 20 países nos quedaría una tabla con 20 registros. Pero ahora el problema es que tengo 2 agregados, uno para resolver las consultas por ciudad y uno para las de región.

La mayoría de las herramientas OLAP pueden deducir un total a partir de su nivel inmediato inferior de granularidad. Esto es, debiera ser posible calcular el total por región a partir de las ciudades lo cual implicaría que no sería necesario tener los 2 agregados si no solamente uno. El de menor nivel. Las herramientas OLAP resuelven esto usando las jerarquías de las dimensiones, esa es una de las razones de establecer las jerarquías en Oracle o Analysis Services por ejemplo.

Cuando me ahorro agregados me estoy ahorrando espacio y tiempo de procesamiento del agregado.

Regresando al ejemplo anterior que pasaría si en cada ciudad tengo 3 tiendas, ¿no sería conveniente mejor realizar el agregado a nivel tienda (ya que tendríamos 20 x 3 = 60 registros) y ahorrarnos 2 agregados para matar 3 consultas diferentes? 60 registros para una tabla aun es nada

Bueno, la cosa no es tan fácil, tener un agregado sin incluir la dimensión tiempo no sirve de nada. Si queremos un total por mes necesitamos multiplicar por 12 la cantidad de registros, pero si nuestros usuarios consultan el detalle a nivel diario entonces tal vez nos interese el detalle mensual, entonces necesitaríamos multiplicar por 365 los registros.

Usted tiene que poner en la balanza que cantidad de registros es el máximo óptimo en un agregado.

Cosas que nunca haga, (ok, tips):

  • Si tiene una tabla de hechos cuyo menor nivel de detalle es cliente, producto entonces no haga un agregado x la combinación de cliente + producto por que estaría obteniendo un agregado con la misma cantidad de registros que la tabla de hechos Doh
  • Nunca haga un agregado con todas las dimensiones. Obtendría una tabla más grande que la tabla de hechos.
  • Incluya en el agregado todos los campos de la tabla de hechos así cuando esté realizando una consulta no planeada el usuario tendrá el mismo performance al incluir en la consulta los diferentes indicadores que el cubo tiene.
  • Normalmente no se requieren agregados a nivel muy granular, a nadie le sirve para un análisis saber cuánto vendí en $ de cada uno de los 158 mil 289 productos en el catálogo. Es muy importante saber el detalle de algunos de ellos (los de mayor venta). Bastará hacer agregados a los niveles superiores. Al hacer dril down en alguna tienda, alguna familia de productos, alguna categoría, la consulta se irá acotando. Bastará con algunos índices adecuados en la tabla de hechos para saber cuánto se ha vendido en la tienda 25 de algún producto.
  • A veces se requieren agregados exactos.
  • No olvide que los agregados siguen siendo tablas por lo que también es válido indexarlas.

PD: Si el motor OLAP que está usando no soporta jerarquías puede usar entonces un agregado compuesto: Región+Ciudad+Tienda; el efecto es el mismo ya que de un agregado se puede calcular el total de ventas por cualquiera combinación de las 3 dimensiones.





Llaves surrogadas o sustitutas.

12 06 2008

image

Esta es una de las buenas prácticas que a mi juicio muchas veces se omiten en el diseño de un data warehouse. Las llaves surrogadas o sustitutas son una llave generada artificialmente y que viene a sustituir el campo llave de la dimensión.

Para ponerlo en bits y bytes, lo que hacemos es diseñamos la tabla de tal forma que la llave primara sea un campo con un tipo de dato entero y que además tenga la propiedad “autoincrement” ( o identity, o lo que sea, todo depende de la base de datos utilizada). En la tabla existe un campo que servirá para almacenar la llave original. Al llenar la tabla se generarán valores numéricos que usaremos en vez del campo clave original.

Las ventajas son muchas. Para mí la principal es mejorar el tiempo de respuesta de la base de datos ya que buscar entre números enteros es lo que menos trabajo le cuesta a la base de datos; pero también hay otras, por ejemplo, si estamos juntando en un data warehouse información de sistemas transaccionales diferentes y cada uno de ellos tienen llaves que no se parecen en nada la una de la otro, las llaves surrogadas o sustitutas nos permitirán tener una llave homogénea para ambos sistemas.

Nos permite también resolver cosas como por ejemplo mantener la historia en el tiempo y a la vez separarla. Por ejemplo si queremos que un vendedor que ahora pertenece a otra región, su historia se conserve en el data warehouse en la región original, lo que hacemos es crear un nuevo registro en la tabla de vendedores con una nueva llave sustituta para ese vendedor y usamos esa nueva llave para almacenar las ventas de ese cliente a partir de la fecha que el movimiento ocurre. De esta forma en el data warehouse tendremos las 2 cosas.

IdVendedor CveVendedor Vendedor Región
2345 A00X456 Miguel Gutierrez Norte
 
5467 A00X456 Miguel Gutierrez Centro

Si queremos la historia del vendedor podemos hacer la consulta por el # de Vendedor lo cual abarcará a las 2 llaves (la nueva y la antigua).

select sum(ventas)
from HechosVentas A
join DimVendedores B on a.idVendedor = b.IdVendedor
where b.CveVendedor = ‘A00X456′

Si queremos las ventas de cada región:

select region, sum(ventas)
from HechosVentas A
join DimVendedores B on a.idVendedor = b.IdVendedor
group by region

El modelo por sí solo lo resolverá.

Surrogadas

Por cierto, en el modelo arriba mostrado (que no tiene nada que ver con el ejemplo de regiones y vendedores que les daba) pueden ver que yo por ejemplo a todas las llaves usrrogadas las identifico por el sufijo “ID” y para los campos llaves originales reservo todos los campos con el sufijo “cve”.

¿implica más trabajo? Si, así es. Muchas veces por falta de tiempo yo en mi caso las omito. También en cierto que hay diferentes maneras de generarlas por ejemplo con algún ETL. Los beneficios son muchos así que cada vez que diseñe un modelo, ponga en la balanza los beneficios que le pueda traer el incluir dichas llaves.

Por cierto, si vá a utilizar el “count distinct” estas llaves sustitutas les vienen como anillo al dedo.





Agregados

25 10 2007

sumas

En una empresa con 10,000 empleados si el Director de la empresa desea saber a cuanto asciende la nómina en su empresa ¿Cómo es más rápido obtener ese total?

  1. A cada uno de los 10000 empleados les pregunta cuanto gana, cuantas prestaciones tiene y toma nota. Cuando haya tomado nota de cada uno de ellos calcula el total.
  2. Levanta el teléfono, marca la extensión del departamento de recursos humanos y nómina y les pregunta que cuál es el total de la nómina, que seguramente ya lo tienen a la mano y siempre actualizado.

Obviamente es mucho más rápido el segundo método.

Este es el concepto de agregados (aggregates por su nombre en inglés) o agregaciones. En vez de recorrer el detalle me voy sobre un total yá calculado.

En los data warehouses y cubos este es un concepto importantísimo. Para que su herramienta de BI no tenga que hacer los cálculos de los totales a nivel registros se usan agregados.

Todas las herramientas y motores OLAP manejan o usan el concepto de agregados. Analysis Services (7, 2000, y 2005), Oracle 8 o mayor, Redbrick, DB2, SAP BW, Teradata, HP NeoViews, Artus, Pentaho, Cognos…y ahora sí que etc. Ciertamente Oracle y HP NeoViews les llaman vistas materializadas o materialized views pero el concepto es el mismo.

El administrador es el que define que agregados desea calcular y cuando se deben de recalcular. Lo normal es que se recalculen en la carga del cubo o datawarehose. Los usuarios de la información no se enteran si existen agregados, ellos lanzan la consulta sobre el cubo o la estrella principal y el motor de cubos o base de datos detecta que para resolver la consulta puede usar un agregado, toma la información de ahí y se la regresa al usuario.

Tome en cuenta que los agregados toman tiempo y espacio. Así que tampoco llene su servidor con todos los agregados posibles. Cree solo aquellos que ocupa y créelos en base a elementos que reduzcan el # de registros a recorrer. Por ejemplo, si tiene 100 tiendas, cree un agregado o total por tienda ya que serán 100 registros por día o por mes. Si tiene 17 millones 244 mil facturas NO cree un agregado a nivel factura ya que se está haciendo harakiri.

Todas los motores olap y herramientas tienen query advisors que monitorean los querys y le sugieren que agregados crear además de índices. Solo tiene que activar esos servicios. Por ejemplo en Microsoft Analysis Services puede usar la “optimización basada en uso”.

En otras palabras, si el tiempo de respuesta de sus consultas es lentísimo y desesperante, el foquito del disco duro siempre está encendido o el procesador está al 100% durante las búsquedas, no sea sádico, use agregados.Nerd

Technorati tags: ,




¿Estrella o Copo de Nieve?

22 10 2007

Plato

Cada vez que comenzamos un proyecto nuevo siempre es lo mismo ¿Estrellas o copos de nieve?¿que es mejor? Es una decisión dificil de tomar.

A mi me gusta trabajar más con estrellas. El tiempo de respuesta del servidor es más rápido debido a que se involucran menos tablas en los querys. Sin embargo tienen la desventaja que hay que programar más. Los programas que se encargarán de estar manteniendo los catálogos (o puntas de la estrella) al día son más complejos.

La ventaja que yó le veo a los copos de nieve es que la información se puede pasar casi siempre tal cual viene. O sea que en un 2×3 podemos tener lista la parte del modelo referente a los catálogos.

Respecto al trabajo que se requiere para llenar la tabla de hechos no hay diferencia entre un modelo y el otro.

No son verdades absolutas. En un modelo estrella, cuando el catálogo que representa una dimensión que tiene demasiados registros, involucrar esta tabla no es tán eficiente. No se requiere ser un genio para darse cuenta que si tengo una estrella donde se usa la dimensión cliente con 500,000 registros y si el sexo de nuestro cliente es una columna más de la tabla de clientes, entonces hacer un query que nos dé las compras por el sexo del cliente (¿quién compra más, las mujeres o los hombres?) hará que la base de datos recorra 500,000 registros del catálogo para sacar los valores diferentes de sexo. Esto hará que el servidor trabaje más; aquí el modelo copo de nieve sería más eficiente.

Si usted tiene Redbrick, entonces no se preocupe, puede hacer todo como una estrella perfecta y crearle agregados a los catálogos. Sí, Redbrick recorre las tablas de la estrella y coloca en una tabla de agregados los valores diferentes de las dimensiones (sexo) dentro de la grán dimension (clientes). Si no estoy mal, lo mismo debe suceder con Oracle.

Lo siento, no he tenido la oportunidad de verificar si otras marcas de base de datos tienen esta capacidad.

Si usted tiene el tiempo suficiente para hacer todo como debe de ser digamos que la regla sería: 

Si los valores de las dimensiones son pocos (los catálogos) use el modelo estrella. Para dimensiones gigantescas use el modelo copo de nieve.

¿qué es gigantesco y qué no lo es? La experiencia y el hardware de su servidor lo dirán.

Como vé, en muchos proyectos no se pueden tener estrellas ó copos de nieve. A veces lo que se requieren son híbridos, mitad y mitad.





¿Qué es un cubo?

14 09 2007

 

Si alguna vez les ha tocado programar un reporte o informe que tome la información de una base de datos sabrán que es un dolor de cabeza. Para hacerlo hay que definir de que tabla, de qué campo y con qué condiciones se saca cada cosa que muestra el reporte. Ahora piense que ese reporte que tanto trabajo le costó en vez de tener cortes o subtotales por cliente ahora lo quieren por tienda o producto, el de al lado lo quiere por familia y el departamento de compras lo quiere por proveedor con el añadido que lo quiere en dólares o Euros y con información de Costos y Margen.

Usted tendría prácticamente que hacer un nuevo reporte para cada caso, esto debido a la complejidad (que es normal) en las bases de datos transaccionales. Así es como nació la necesidad de las herramientas donde la información mostrada en el informe o reporte fuera manipulada dinámicamente.

Eso es lo que es OLAP.

No era fácil hacer que el reporte fuera manipulado dinámicamente debido a la complejidad de donde se sacaban los datos. Hacer un cambio de variables implicaba en vez de 1 tabla acceder a 4 o más. Para resolver esta situación los fabricantes de este tipo de software idearon extraer la información de la base de datos transaccional y colocarla en una base de datos que tuviera una estructura estándar para almacenar las diferentes variables de la información. De esta forma el reporte podía ser cambiante debido a que la estructura donde se almacenaba el dato siempre era conocida.

Como en el fútbol, se pusieron los datos “de pechito”.

Esto es lo que son los cubos. No son otra cosa que esas “bases de datos” de donde las herramientas OLAP toman la información que muestran; bases de datos que están diseñadas especialmente para que las herramientas puedan hacer esos cruces espectaculares de información en su pantalla.

Note que hacer cubos tiene un costo. Hay que tomar los datos de los sistemas transaccionales y llevarlos a esa base de datos. Esto se hace a lo mejor una vez al día, una vez cada hora o a lo mejor una vez al mes. Todo depende de la frecuencia con la que quiere que la información esté actualizada.

Es debido a esto que los cubos se procesan.

Hay muchas herramientas para hacer cubos y explotarlos, yo uso las herramientas de BITAM, uso Artus.

¿Todavía quedaron dudas, verdad? Hay más cosas que saber de un cubo…¿cuales son las que estarían interesados en conocer?

Technorati tags:




¿qué es un data warehouse?

23 08 2007

almacen

Para aquellos que les haya tocado la época en donde todas las consultas se resolvían con reportes o queries se acordarán de los problemas más comunes de aquellos tiempos.

  • Cientos de tablas de donde sacar la información ¿cuál era la buena?
  • El reporte solo se podía ejecutar por las noches o los fines de semana
  • 20 sistemas diferentes en diferentes lenguajes y diferentes bases de datos
  • la información estaba en 20 servidores distintos
  • varias versiones de la verdad
  • mil problemas más

Ahora cuando recuerdo las petición “necesito un reporte consolidado de las operaciones de la empresa” puedo entender mi stress.

Debo corregir el texto. Esos problemas no forman parte del pasado. Como consultor de BI me los encuentro cada día en cada una de las empresas que visito.

Alguien sugirió para resolver todos esos problemas relacionados con la consulta y análisis de información crear una base de datos que contuviera toda la información histórica de la compañía. De esta forma si necesitaba un dato, ese dato estaría ahí. En un solo lugar. En un solo sistema. En una sola marca de base de datos. En un solo lenguaje de consulta y con una sola verdad.

Regresando a la pregunta ¿qué es un data warehouse o bodega de información? Pues es eso, una base de datos o bodega e información que almacena los datos históricos de los diferentes sistemas en un solo lugar. Y sirve, están diseñado y está hecho para ser consultado y para analizar información. Todo esto de una manera fácil.

—¿base de datos histórica?¿ Entonces si levanto un respaldo de mi sistema en otro servidor es un data warehouse?

No se emocione Nerd. Si usted levanta el respaldo de los 5 años anteriores del sistema de facturación en otro servidor eso NO es un datawarehouse.

Así como en las bodegas tradicionales se utilizan tarimas de varios niveles, carritos y grúas para acomodar grandes cantidades de artículos, en un data warehouse las tablas que almacenan información se diseñan de una manera especial pensando en que almacenarán cantidades gigantescas de información.

Esas maneras especiales o modelos son el copo de nieve y estrella. Cada uno tiene sus ventajas y desventajas.

He visto data warehouses diseñados como si fueran el sistema de facturación o el de producción. Desde mi punto de vista son inservibles todos ellos. Hay un excelente documento llamado Drawing the line between Dimensional Modeling and ER Modeling Techiques by Ralph Kimball que pinta la línea perfectamente.

¿y los cubos? Eso es punto y aparte. No són la misma cosa, se complementan y a menudo se traslapan. He estado en empresas con data warehouses explotados con SQL y Excel, sin cubos. Lo platicamos después.

Otro punto que debe de considerar es que la información que contiene por lo general debe estar trasformada y limpia ( usted no tiene una columna total_documentos; en el DWH tiene métricas que se llaman Ventas, Ventas en dólares, Devoluciones, mermas, etc.).

Todavía hay más cosas como los agregados, pero creo que con todo lo anterior queda un poco más claro qué es un data warehouse.

Technorati tags:




El modelo estrella

1 08 2007

Hay 2 modelos para crear un Data Warehouse, el modelo estrella o el copo de nieve. Yo prefiero el modelo estrella, ya que el tiempo de respuesta que provee es más rápido y hace que el servidor trabaje menos.

El concepto de Estrella es bastante sencillo. Hay que diseñar las tablas usando una tabla central para los hechos, tablas para los los catálogos y una tabla de tiempo.

ModeloEstrellaSales

El meollo del diseño de las tablas en el modelo estrella está en los catálogos. Tiene que poner en una sola tabla todo aquello que se pueda deducir del elemento más granular de la tabla y que está más abajo en la jerarquía.

Por ejemplo, si usted tiene un catálogo de productos, el elemento más granular es el producto ¿qué se puede deducir del producto? Pues la marca, el empaque, la presentacion (botella de cristal, PET no retornable, aluminio, etc.), la familia (bebidas), la subfamilia, la categoría, la subcategoria, el color, la talla si aplica, etc.

Bueno pues todo esto se coloca en la misma tabla.

El campo llave de esa tabla es el product_id (la llave de producto) por que producto (product) es el elemento más abajo en la jerarquía o más granular. Vealo de esta forma: una marca tiene productos, la familia agrupa productos, la subfamilia igual, la categoría igual, el color igual. El producto es el único que no agrupa a nadie, entonces esa es la la llave.

Si usted le hiciera un select a ese catálogo de productos el resultado sería el siguiente.

ResultSetEstrella

Puede ver que en el mismo registro se almacena el producto, la marca, la subcategoria, el departamento, la familia, la categoria. Todo lo que se puede deducir del producto está ahí.

Lo mismo pasa con las tiendas. De la tabla de tiendas (ver tabla Stores en el diagrama) se puede deducir la region y el pais al que pertenece. Entonces pais y región los pongo en la misma tabla que tienda.

Para mejorar todavía más el tiempo de respuesta coloque en la tabla el campo llave y el descriptor como se muestra en la siguiente imagen.

ResultSetEstrella1

Si hace esto en el query SQL que escriba para obtener datos de la estrella podrá usar:

where
   IdBrand = 15

en véz de:

where
   Brand = ‘Washington’

Tendrá un mejor tiempo de respuesta si usa llaves. Entonces siempre en los catálogos ponga además de los descriptores el campo llave de cada descriptor.

TIP: Si está pensando crear un cubo con los Analysis Services de Microsoft usando esta estrella, el poner la llave en la estrella hace que el cubo se reduzca de tamaño y el tiempo de respuesta se acelere. Solo tenga cuidado de que al crear la dimensión, en propiedades de la dimensión ubique y use la propiedad “llave de la dimensión”.

TIP: Para las llaves trate de que siempre sean numéricas y de no usar llaves compuestas.

TIP: Si va a seguir el tip anterior, puede ayudarse poniendo en los catálogos además de la nueva llave inventada por usted, la llave original para la dimensión. Yo siempre las identifico con Id y Cve, la que termina en ID es inventada por mí y la que termina o comienza en CVE es la original.

¿A partir del producto yo puedo deducir en que tienda se vendió? Suponiendo que hablamos de supermercados y en cada tienda se pueden vender los mismos productos entonces la respuesta es NO, no se puede deducir qué tienda vendió qué producto. Esto se resuelve en la tabla de hechos poniendo ahí que producto se vendio (producto_id), en que tienda (store_id) y en que día (time_id).

Esto es el modelo estrella.

IMPORTANTE: No se quede con la idea que al hacer los catálogos redundantes va a desperdiciar todo el disco duro. La redundancia es solo en los catálogos no en los hechos, usted puede tener un catálogo de 100,000 productos pero millones y millones de transacciones. Lo que hace que un datawarehouse crezca normalmente es la tabla de hechos. Si todavía está renuente y saca a relucir las reglas de Codd de normalizacion, para no entrar en polémica digamos que este es uno de los extraños casos donde lo que aprendió en la universidad lo puede tirar a la basura Big Grin.

Para complentar esto puede consultar los posts La tabla de hechos y Algunas recomendaciones para la tabla de hechos. Respecto a la tabla de tiempo (TimeDim) puede leer La dimensión tiempo y los otros campos de la tabla de tiempo.

Si quiere ver como convertir una estrella a un cubo puede consultar como hacer un cubo con Artus.








Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 29 seguidores