Si algo caracteriza el trabajo con el modelo de datos-DAX (bien en Power BI bien en Power Pivot) es la eterna cuestión de qué manera de trabajar es la recomendada: Columnas calculadas o Medidas.
La respuesta rápida, y habitual, es mejor las medidas... pero como todo en la vida, no hay certezas absolutas.
Si bien es cierto que las medidas , puesto que no se almacenan en memoria, generalmente son más rápidas, es importante conocer y evaluar el equilibrio entre utilizar el 'almacenamiento en memoria' o el motor de procesamiento' que consumimos al utilizar una medida o una columna calculada.
Estos dos conceptos son interesantes, y te recomendaría echaras un vistazo a este gran video.
Estos dos motores SE (motor de almacenamiento) y FE (motor de procesamiento o formulación), que se pueden analizar fácilmente con ese magnifico complemente DAX Studio (https://daxstudio.org/), serán la clave y la respuesta real, en cada caso concreto de qué es más óptimo.
No voy a intentar definir o profundizar por ahora más en este tema... Nos quedamos con la idea que existen dos motores, y cada uno sirve y se emplea para una cosa...
Grosso modo, las columnas calculadas son buenas porque exigen poca memoria (FE) cuando generamos nuestras consultas o informes. Sin embargo, por contra, ocupan más espacio de almacenamiento (SE) en la base de datos.
De otra parte, las medidas se crean, cada vez, en el instante que se ejecuta la consulta (más FE), por lo que no quedan almacenadas en la base de datos (menos SE).
La recomendación general sería por tanto:
Medidas - cuando necesitemos calcular agregados/acumulados, i.e., cálculos más complejos.
columnas calculadas - cuando tengamos que evaluar información por filas, i.e., procesos más rutinarios.
Veamos un ejemplo comparando un cálculo similar realizado en una columna calculada, y otro mediante una medida.
Disponemos de tres tablas en nuestra hoja de cálculo
Cargaremos directamente al Modelo de datos las tres tablas (podemos usar desde la ficha Power Pivot el botón Agregr al modelo de datos).
Una vez en el modelo procedemos, desde la vista de diagrama a relacionar la tabla principal (tabla de hechos), con la tabla auxiliar (o dimensiones) de precios mediante el campo común de 'artículo'
La tabla de categorías según el escalado de unidades vendidas NO la relacionaremos... optando por realizar una búsqueda por aproximación dentro del modelo
Para esto, siguiendo recomendaciones previas, y ya que requerimos evaluar fila a fila el número de unidades vendidas, crearemos una columna calculada con la siguiente fórmula:
con la fórmula recuperamos la categoría mínima (fíjate que están ordenadas en la TblCAT en descendente!!; si estuvieran en ascendente usaríamos MAX).
Recuperaremos la categoría mínima cuando se den al mismo tiempo las dos condiciones expresadas con la función FILTER. Lo que nos devuelve:
El siguiente cálculo lo haremos empleando una medida, ya que responderá a un agregado por suma del valor resultante de multiplicar unidades por precios. Nuestra fórmula:
clásica fórmula de SUMX que se apoya con RELATED en datos de otra tabla previamente relacionada!!
Con los cálculos y relaciones ya ejecutadas, llegamos al momento de comparación.
Vamos a realizar un cálculo con el que obtener, en nuestro informe de tabla dinámica, por cada categoría y producto el acumulado total de cada categoría... lo vemos en la imagen siguiente:
Veamos el cálculo correspondiente a la columna calculada, que llamaré 'Acum_Ventas_byCAT':
La fórmula opera sobre la medida anterior creada, obviando los posibles filtros aplicados a excepción de los aplicados sobre el campo CATEGORIA. Es decir, opera (suma agregada que nos devolvía la medida 'Valor_eur') fila por fila y retorna el dato acumulado correspondiente a la CATEGORIA de esa fila...
De otra parte replicamos el cálculo similar al anterior pero en forma de medida. La medida la llamaré: 'Suma_por_Categoria':
donde de forma similar trabajamos sobre aquellos elementos filtrados donde exista CATEGORIA, acumulando su 'Valor_eur', con la misma excepción de filtros... esto es manteniendo aplicado la CATEGORIA, para que precisamente acumule por ese concepto.
Podemos crear nuestro informe de tabla dinámica de acuerdo a la imagen siguiente:
Observamos como a nivel de combinación Artículo y Categoría obtenemos iguales resultados, pero a nivel de subtotal por categoría la cosa cambia.
La columna calculada acumula sus parciales, como cualquier Subtotal...
Mientras que la medida devuelve el mismo dato que sus parciales... como haría un campo calculado estándar.
No nos importa para el caso... si empleando DAX Studio realizaramos un análisis de rendimiento veríamos con sorpresa que en este caso es más eficiente la columna calculada!!
Ya veremos el proceso en otro artículo.
Esto es muy interesante por que demuestra que dependiendo de la tipología del cálculo a realizar es más óptimo un motor u otro (SE frente a FE), es decir, columnas calculadas versus medidas.
La respuesta rápida, y habitual, es mejor las medidas... pero como todo en la vida, no hay certezas absolutas.
Si bien es cierto que las medidas , puesto que no se almacenan en memoria, generalmente son más rápidas, es importante conocer y evaluar el equilibrio entre utilizar el 'almacenamiento en memoria' o el motor de procesamiento' que consumimos al utilizar una medida o una columna calculada.
Estos dos conceptos son interesantes, y te recomendaría echaras un vistazo a este gran video.
Estos dos motores SE (motor de almacenamiento) y FE (motor de procesamiento o formulación), que se pueden analizar fácilmente con ese magnifico complemente DAX Studio (https://daxstudio.org/), serán la clave y la respuesta real, en cada caso concreto de qué es más óptimo.
No voy a intentar definir o profundizar por ahora más en este tema... Nos quedamos con la idea que existen dos motores, y cada uno sirve y se emplea para una cosa...
Grosso modo, las columnas calculadas son buenas porque exigen poca memoria (FE) cuando generamos nuestras consultas o informes. Sin embargo, por contra, ocupan más espacio de almacenamiento (SE) en la base de datos.
De otra parte, las medidas se crean, cada vez, en el instante que se ejecuta la consulta (más FE), por lo que no quedan almacenadas en la base de datos (menos SE).
La recomendación general sería por tanto:
Medidas - cuando necesitemos calcular agregados/acumulados, i.e., cálculos más complejos.
columnas calculadas - cuando tengamos que evaluar información por filas, i.e., procesos más rutinarios.
Veamos un ejemplo comparando un cálculo similar realizado en una columna calculada, y otro mediante una medida.
Disponemos de tres tablas en nuestra hoja de cálculo
Cargaremos directamente al Modelo de datos las tres tablas (podemos usar desde la ficha Power Pivot el botón Agregr al modelo de datos).
Una vez en el modelo procedemos, desde la vista de diagrama a relacionar la tabla principal (tabla de hechos), con la tabla auxiliar (o dimensiones) de precios mediante el campo común de 'artículo'
La tabla de categorías según el escalado de unidades vendidas NO la relacionaremos... optando por realizar una búsqueda por aproximación dentro del modelo
Para esto, siguiendo recomendaciones previas, y ya que requerimos evaluar fila a fila el número de unidades vendidas, crearemos una columna calculada con la siguiente fórmula:
=CALCULATE(MIN(TblCAT[Categoría]);FILTER(TblCAT;TblCAT[de]<=TblDATOS[Ventas_Año(UDS)] && TblDATOS[VIP]=""))
con la fórmula recuperamos la categoría mínima (fíjate que están ordenadas en la TblCAT en descendente!!; si estuvieran en ascendente usaríamos MAX).
Recuperaremos la categoría mínima cuando se den al mismo tiempo las dos condiciones expresadas con la función FILTER. Lo que nos devuelve:
El siguiente cálculo lo haremos empleando una medida, ya que responderá a un agregado por suma del valor resultante de multiplicar unidades por precios. Nuestra fórmula:
Valor_Eur:=SUMX(TblDATOS;TblDATOS[Ventas_Año(UDS)]*RELATED(TblPRECIOS[precio]))
clásica fórmula de SUMX que se apoya con RELATED en datos de otra tabla previamente relacionada!!
Con los cálculos y relaciones ya ejecutadas, llegamos al momento de comparación.
Vamos a realizar un cálculo con el que obtener, en nuestro informe de tabla dinámica, por cada categoría y producto el acumulado total de cada categoría... lo vemos en la imagen siguiente:
Veamos el cálculo correspondiente a la columna calculada, que llamaré 'Acum_Ventas_byCAT':
=VAR ventas=CALCULATE([Valor_Eur];ALLEXCEPT(TblDATOS;TblDATOS[Categoría])) RETURN IF(TblDATOS[Categoría]="";0;ventas)
La fórmula opera sobre la medida anterior creada, obviando los posibles filtros aplicados a excepción de los aplicados sobre el campo CATEGORIA. Es decir, opera (suma agregada que nos devolvía la medida 'Valor_eur') fila por fila y retorna el dato acumulado correspondiente a la CATEGORIA de esa fila...
De otra parte replicamos el cálculo similar al anterior pero en forma de medida. La medida la llamaré: 'Suma_por_Categoria':
Suma_por_Categoria:=CALCULATE( SUMX( FILTER(TblDATOS;[Categoría]<>"");[Valor_Eur]); ALLEXCEPT( TblDATOS;TblDATOS[Categoría] ) )
donde de forma similar trabajamos sobre aquellos elementos filtrados donde exista CATEGORIA, acumulando su 'Valor_eur', con la misma excepción de filtros... esto es manteniendo aplicado la CATEGORIA, para que precisamente acumule por ese concepto.
Podemos crear nuestro informe de tabla dinámica de acuerdo a la imagen siguiente:
Observamos como a nivel de combinación Artículo y Categoría obtenemos iguales resultados, pero a nivel de subtotal por categoría la cosa cambia.
La columna calculada acumula sus parciales, como cualquier Subtotal...
Mientras que la medida devuelve el mismo dato que sus parciales... como haría un campo calculado estándar.
No nos importa para el caso... si empleando DAX Studio realizaramos un análisis de rendimiento veríamos con sorpresa que en este caso es más eficiente la columna calculada!!
Ya veremos el proceso en otro artículo.
Esto es muy interesante por que demuestra que dependiendo de la tipología del cálculo a realizar es más óptimo un motor u otro (SE frente a FE), es decir, columnas calculadas versus medidas.
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.