A la hora de administrar nuestro data warehouse nos puede ser muy útil saber qué patrón de consultas sigue Microsoft SQL Server Analysis Services (SSAS) al realizar sus operaciones tanto de consulta como de procesado.Microsoft SQL Server Analysis Services nos permite asignar diferentes modos de almacenamiento a las dimensiones y grupos de medidas de nuestros cubos OLAP de tal forma que seleccionemos el más adecuado según nuestros requisitos de espacio y latencia del dato.
Aunque el objetivo de este post no es entrar en detalle en los modos de almacenamiento, vamos a nombrar y resumir brevemente los diferentes tipos que hay:
- MOLAP (Multidimensional OLAP)
- ROLAP (Relational OLAP)
- HOLAP (Hybrid OLAP)
Según el modo de almacenamiento que seleccionemos para nuestras dimensiones o hechos y dependiendo de nuestro modelo, SSAS utilizará diferentes patrones de consulta que vamos ver a continuación:
Dimensiones
Almacenamiento MOLAP
- Procesamiento
Para cada atributo de cada dimensión se lanza una consulta con el siguiente patrón:
Att_keycolumn, Att_namecolumn: Son las columnas especificadas como clave o como representación del atributo. Pueden ser una columna directa de una tabla, o una columna calculada con código T-SQL ( ej: “CY “ + [CalendarYear])
Att_rel_keycolumns: Son las columnas relacionadas directamente con el atributo que se esta procesando en ese momento. Puede ser directa o calculada también.
- Consulta MDX
No hay consultas a SQL Server. Está todo almacenado en el motor OLAP y se resuelve desde allí.
Almacenamiento ROLAP
- Procesamiento
No hay consultas a SQL Server. Como no hace falta guardar nada en OLAP, no se lanzan consultas.
- Consulta MDX
Diferenciamos dos tipos. Si están consultando la metadata de la dimensión (ej: Cuando en Excel en el panel lateral despliegas la dimensión para ver qué atributos tiene). En este caso se lanza un “DISCOVER”, que es una consulta plana por dimensión con este patrón
Si por el contrario estás mostrando los miembros que tiene un atributo de una dimensión en los ejes filas/columnas (ej: que se muestren los valores de los años de la dimensión tiempo) se lanza una consulta por atributo que estas mostrando con este patrón:
La diferencia con la imagen de arriba es el DISTINCT.
Almacenamiento HOLAP
No se puede utilizar este modo de almacenamiento en dimensiones.
Hechos
Almacenamiento MOLAP
- Procesamiento
Con medidas que tienen funciones de agregación diferentes a DistinctCount (interno de SSAS) se lanza una consulta por partición con este patrón:
En este caso es opcional que exista un WHERE con una condición de partición. Si existe suele ser del tipo “WHERE fecha between X and Y”, “WHERE año=2010”, “WHERE departamento=’IT’ “, etc.
Si por el contrario, existe alguna medida que tiene la función de agregación como DistinctCount se lanza una consulta por partición con este patrón:
La diferencia ahora es el ORDER BY del final. Ocurre de nuevo lo del WHERE opcional con la condición de partición.
- Consulta MDX
No hay consultas a SQL Server. Está todo en el motor OLAP y se resuelve desde allí
Almacenamiento ROLAP
- Procesamiento
No hay consultas a SQL Server. Como no hace falta guardar nada en OLAP, no se consulta.
- Consulta MDX
De nuevo tenemos dos casos. Si estamos consultando una medida de un grupo de medidas que no tiene ninguna medida con una función de agregación DistinctCount, se lanza una consulta por partición necesaria para lectura (aquí no es por todas las particiones) que sigue este patrón:
Agg_function(measure): Serían las funciones de agregación para cada medida. (Ej: SUM(VENTAS), MIN(Precio),MAX(Tasa))
Rows/Columns_attributes: Son los atributos de las dimensiones por las cuales estamos analizando y hemos puesto en los ejes de filas o columnas. (Ej: Semestre, Pais de usuario)
Además de la subconsulta con la información de la partición (y su where opcional), ésta se cruza con las dimensiones cuyos atributos estamos utilizando. Este cruce se hace mediante “WHERE hecho.key = dim.key” para cada una de las dimensiones.
Por último se hace un GROUP BY por los atributos de las dimensiones por las cuales estamos analizando.
Si por el contrario, estamos consultando una medida de un grupo de medidas que tiene alguna medida con la función de agregación como DistinctCount, se lanza una consulta por partición necesaria de lectura con este patrón:
La estructura es casi idéntica a la imagen superior, lo que cambia ahora es que la medida del DistinctCount es la única que no lleva función de agregación en el SELECT.
Además, el GROUP BY se hace tanto por la medida del DistinctCount como por los atributos de las dimensiones por las cuales estamos analizando y por último se termina con un ORDER BY de la medida del DistinctCount.
Almacenamiento HOLAP
- Comportamiento General
Si existe una agregación procesada que puede solucionar la consulta, se comporta como el almacenamiento MOLAP para Hechos
Si no existe una agregación procesada que puede solucionar la consulta, se comporta como el almacenamiento ROLAP para Hechos
Si queremos profundizar en el tema, podemos encontrar más información sobre cómo capturar las consultas o las ventajas y desventajas de los diferentes modos de almacenamiento de SSAS en varios enlaces:
Tipos de almacenamiento en Analysis Services (SSAS) por MSDN
Utilizando SQL Server Profiler para monitorizar SSAS por MSDN
Rubén Pertusa, Twitter: @rpertusa