Vamos a analizar algo interesante sobre Power BI y medidas cuando son usadas como dimensión
El modelo dimensional y poder crear un esquema de estrella son aspectos muy importantes en Power BI. En un esquema de estrella tendremos al menos una tabla de fact, y en esa tabla de hechos tendremos dos tipos principales de columna:
- Claves dimensionales, las cuales vinculan la tabla de hechos a las tablas de dimensiones;
- Medidas, las cuales almacenan los datos que queremos agregar y analizar.
Los tipos de modelos.
Aquí tenemos un ejemplo simple de una tabla de hechos llamada «Ventas» con tres columnas clave de tres dimensiones (Producto, Pais y Descuento) y tres columnas de medidas (Ventas, Utilidad y Volumen Vendido):
Aunque muy seguido podemos ver gente usando un método distinto a la hora de modelar sus tablas de datos, pues en lugar de tener columnas separadas por cada medida prefieren desviar sus datos. Crear una fila en su tabla fact por cada valor de medida:
- Usar una sola columna para almacenar todos los valores de medidas y
- Crear una nueva dimensión que permite al usuario seleccionar qué valores de medida quieren.
Aquí tenemos otro ejemplo de tabla, llamada «salesUnpivot», que muestra cómo los datos de la tabla de Ventas pueden ser remodelados usando esta técnica:
En esta tabla la clave dimensional permanece igual, pero la columna de Valor ahora almacena todos los datos de las medidas de Ventas, Margen y Volumen Vendido en la tabla original y la columna Nombre de Medida nos dice qué tipo de valor de medida es almacenado en cada columna. A este método podemos llamarlo «Measures Dimension».
Existen algunas ventajas si hacemos tablas usando esta forma, como por ejemplo:
- Usar separadores en un reporte para seleccionar las medidas que aparecen en un visual
- Añadir fácilmente nuevas medidas sin tener que añadir nuevas columnas a la tabla de hechos
- Podemos usar seguridad a nivel de fila para controlar las medidas a las cuales el usuario tiene acceso
Cada vez que nos desviamos de un modelo de dimensión convencional nos arriesgamos a encontrar problemas con el paso del tiempo y este caso no es la excepción, por lo que ahora veremos las desventajas de modelar usando este método:
FORMATO
Notemos que las columnas de medida para Ventas y Utilidad de la tabla Ventas son valores de moneda con decimales y que Volumen Vendido son números enteros. Es bastante fácil establecer diferentes formatos para diferentes medidas cuando cada medida es una columna separada:
Pero cuando todos los valores están almacenados en una columna, como pasa en el ejemplo de Measures Dimension, el formateo ya no es tan directo. Puede que podamos resolverlo si usamos un formato genérico para todos nuestros datos:
Pero esto no es ideal. También podemos crear medidas DAX y formatearlas de manera adecuada, pero entonces perdemos algo de la flexibilidad de este método. También podemos usar un grupo de cálculo y secuencias de formato dinámico.
COMPRESIÓN
Power BI es mucho más eficiente a la hora de almacenar y comprimir datos en una tabla de datos convencional comparado a cuando el método de Measures Dimension es usado y esto tiene consecuencias para el desempeño de queries. Usando el botón de Ver Métricas en DAX Studio nos revela un par de cosas como podemos ver a continuación:
Primero que nada, notaremos que la tabla de Sales Unpivot (la cual usa el método de Measures Dimension) es 35% más larga que la tabla de Ventas. Notaremos también que en la tabla de Ventas las columnas de medida Ventas y Margen, que contienen valores de moneda, pueden usar el tipo de datos Moneda (el cual nos muestra Decimal aquí), lo que significa que usan la codificación Valor; solo la columna Volumen Vendido necesita ser guardada usando el tipo de datos Número entero (el cual se muestra como Int64). En la tabla de Sales Unpivot (ya que todos los valores de medida son guardados en la columna Valor) esta columna tiene que usar el tipo de datos Número Decimal y codificación Hash. La codificación Value puede darnos bastantes beneficios de desempeño.
COMPLEJIDAD DE CÁLCULO
Cuando empezamos a crear cálculos DAX más complejos entonces las desventajas del método de Measures Dimension se hacen más aparentes. Digamos que queremos un visual en nuestro reporte que muestre Ventas, Margen y una medida que sustraiga Margen de Ventas llamado «Costo de ventas»:
Este es el DAX requerido para este visual:
Ventas Totales = SUM('Sales'[Gross Sales]) Utilidad Total = SUM('Sales'[Profit]) Costo Total = [Ventas Totales] - [Utilidad Total]
Para lograr el mismo resultado con el método de Measures Dimension necesitaremos saber cómo usar la función DAX CALCULATE() de la siguiente forma:
Ventas Totales 2 = CALCULATE ( SUM ( 'salesUnpivot'[Value] ), KEEPFILTERS ( 'salesUnpivot'[Attribute] = "Gross Sales" ) ) Utilidad Total 2 = CALCULATE ( SUM ( 'salesUnpivot'[Value] ), KEEPFILTERS ( 'salesUnpivot'[Attribute] = "Profit" ) ) Sales After Tax 2 = [Ventas Totales 2] - [Utilidad Total 2]
Si esperamos que otras personas creen medidas en nuestro conjunto de datos, entonces este grado de complejidad adicional puede ser una barrera considerable. La función CALCULATE() no es fácil de usar adecuadamente.
DESEMPEÑO DE CÁLCULO
Por último tenemos un problema de desempeño que debemos tomar en cuenta si usamos Measures Dimension. Aquí tenemos lo que la pestaña Server Timings en DAX Studio nos muestra:
Cabe destacar que solo hay un query Storage Engine: DAX fusion se ha activado, por lo que los valores de Venta y Utilidad requeridos pueden ser recuperados en el mismo análisis. Aquí tenemos lo que la pestaña Server Timings nos muestra para el mismo visual usando el método de Measures Dimension:
No solo es este query más lento, sino que ahora tenemos dos queries Storage Engine: uno para obtener los datos de Ventas y otro para obtener los datos de Utilidad. Dado que análisis por separado son necesarios para obtener cada valor de medida, entre más medidas tengamos en visual o más medidas necesitemos para nuestros cálculos, más análisis serán necesarios. Esto puede convertirse en un problema de desempeño rápidamente, en especial si cada análisis es relativamente lento. El método de Measures Dimension significa que Power BI es incapaz de comprimir datos de manera efectiva.
En Power BI, las medidas como dimensión tiene algunas ventajas, pero de igual manera sus desventajas se hacen presentes con el tiempo y pueden incluso no valer la pena.
Cualquier duda, nos leemos abajo.