¿Columnas calculadas? NO, GRACIAS

¿Columnas calculadas? NO, GRACIAS

Cuantas veces no te has preguntado qué es mejor, si crear una columna calculada con DAX o hacerla con Power Query.

Bueno, me consta que muchos ni se lo plantean, sobre todo en una fase de aprendizaje inicial de Power BI donde Power Query queda relegado a un tercer o cuarto plano.

Pero conforme se avanza en el aprendizaje de Power BI, es una pregunta habitual.

¿Qué es mejor crear una columna calculada en DAX o crearla en power query?

La respuesta es tajante:

Siempre que se pueda: Power Query.

Para ello utilizamos siempre diversos chascarrillos como por ejemplo que cuanto más cerca del origen que mejor, pero vamos a intentar explicar y demostrar por qué es así.

En primer lugar, es imposible crear un post sobre este tema y no referenciar al genio Marco Russo, que en octubre de 2019 escribió este post relativo a este tema:

Comparing DAX calculated columns with Power Query computed columns – SQLBI

Siguiendo ese artículo voy a establecer en primer lugar las diferencias principales entre crear una columna calculada o crear la misma columna en Power Query:

1º Una columna calculada en DAX no va a requerir el refresco de la tabla al añadirla al modelo, mientras que si la creamos en Power Query si necesitaremos refrescar la tabla para importarla al modelo.

Esto podría ser un punto de ventaja a favor de las columnas calculadas.

2º Cuando refrescamos la tabla el motor proceda las columnas calculadas después de que los datos de todas las particiones se hayan cargado y comprimido en memoria, mientras que la columna creada en Power Query se procesa como cualquier otra columna procedente del origen de datos.

Punto para Power Query.

3º En caso de que utilicemos refresco incremental, la columna creada en Power Query sólo se va a necesitar actualizar los datos de las filas que estén dentro de la partición que se va a actualizar (los últimos días) mientras que cuando la columna es calculada, se actualizará para todas y cada una de las filas de la tabla

Otro punto muy importante para Power Query

 4º Esto es fundamental:

Una columna calculada en DAX no participa de la evaluación de la columna base para ordenar por lo que la compresión puede no ser la adecuada (algo que demostraré a continuación) mientras que una columna en power query se comprimirá como cualquier otra columna de manera mucho más óptima.

Es en este punto ya donde Power Query gana por goleada y posteriormente veremos como dos columnas calculadas pueden casi duplicar el volumen de una tabla.

5º El coste de procesamiento a la hora de actualizar en la columna calculada de DAX corresponderá a la evaluación secuencial para cada fila incluida en la operación de actualización y si tienes varias columnas calculadas se procesan secuencialmente una tras otra aumentando por tanto el tiempo de actualización. Sin embargo, el coste de procesar la columna calculada en Power Query dependerá mucho del tipo de origen de datos sobre todo cuando la expresión pueda ser optimizada utilizando el plegado de consulta.

Por otro lado y muy importante como veremos en el ejemplo, la mejora de la compresión de una columna puede afectar negativamente a la compresión de otras columnas del modelo

6º Una columna con mejor compresión es más pequeña en memoria y suele ofrecer mejores niveles de rendimiento. Esto es importante en las operaciones de filtrado, agrupación y agregación que implican a la columna.

La compresión de una columna calculada en DAX será menor que la de una columna calculada en Power Query.

En resumen, gana por goleada la no utilización de columnas calculadas en DAX siempre que sea posible la utilización de columnas en Power Query.

Pero para sostener esto vamos a verlo con un ejemplo:

He creado dos tablas completamente iguales en dos pbix diferentes para analizarlas con Dax Studio.

La tabla contiene 12.627.608 Registros, la fact sales online de Contoso y me he quedado sólo con los campos que podéis ver en la imagen:

DateKey

SalesQuantity

ReturnQuantity

ReturnAmount

DiscountQuantity

DiscountAmount

UnitPrice

SalesAmount

Categoria

Sales Amount y Categoría son campos calculados en un PBIX con  DAX y en el otro con Power Query.

En Power Query Sales Amount = ([SalesQuantity]*[UnitPrice]) + ([ReturnQuantity]*-1*[ReturnAmount]) – [DiscountQuantity]*[DiscountAmount]) en una columna personalizada

Y Categoria otra:  if [UnitPrice]<10 then «C»

else if [UnitPrice]>100 then «A»

else «B», type text)

En DAX las columnas calculadas idénticas:

Sales Amount Calculada = (FactOnlineSales_Calculada[UnitPrice]*FactOnlineSales_Calculada[SalesQuantity]) + (FactOnlineSales_Calculada[ReturnQuantity]*-1*FactOnlineSales_Calculada[ReturnAmount])-(FactOnlineSales_Calculada[DiscountQuantity]*FactOnlineSales_Calculada[DiscountAmount])

Categoria Calculada = SWITCH( TRUE(),

FactOnlineSales_Calculada[UnitPrice]<10, «C»,

FactOnlineSales_Calculada[UnitPrice]>100, «A»,

«B»)

Si utilizamos el analizador de Vertipaq en ambos Pbix, el asombroso resultado es el siguiente:

Como podemos observar el tamaño de la FactSalesOnline_Calculada, la que tiene las columnas calculadas casi duplica al de la FactSalesOnline que viene íntegramente de PQ.

Si observamos las columnas cardinalidad, Dictionary y Hier Size son idénticas en ambos modelos. Sin embargo, la compresión del dato es muchísimo mayor en el caso de las columnas que vienen definidas en Power Query.

Además, en el ejemplo podemos advertir lo que decíamos antes de que la compresión de una columna afecta a la compresión de las demás. Como podemos observar, La columna DateKey se comprime mucho peor en el modelo que viene íntegro de Power Query, a pesar de ello, la peor compresión de las columnas Unit Price y DiscountAmount y, sobre todo la muy peor compresión de las columnas calculadas en DAX hacen que simplemente por razones de volumen sea infinitamente más efectiva la creación de las columnas en Power Query.

Espero que a partir de ahora os penséis muchísimo el crear o no una columna calculada.

Por último recordad que hemos introducido un nuevo curso imprescindible para empezar a trabajar con Power BI del MVP de Microsoft Salvador Ramos en nuestra academia. 100% recomendado

Power BI: Modelado de Datos Esencial – (powerbisp.com)

Francisco Mullor Cabrera

4 comentarios

Santi Galán Publicado el1:22 pm - 08/03/2021

Buenas…. A lo mejor soy un poco raro.. pero me gustaria achacarlo a las enseñanzas del gran Salvador Ramos ya que nunca me he planteado crear una columna calculada con DAX y siempre que he necesitado una lo he hecho en la fase de modelado de datos en Power Query.

Saludos!

Santi

Anto Publicado el12:58 am - 12/07/2023

Hola! Quiero hacer una columna Calculada en Power bi con un if donde el resultado sea la columna A si es mayor a cero y sino que traiga la columna B. Se puede construir una columna cuyo resultado sea una u otra columna?

    Francisco Mullor Cabrerea Publicado el4:46 am - 12/07/2023

    jajajaja preguntas como hacer una columna calculada en un post que habla de la falta de idoneidad de las columnas calculadas. Eres un crack.

Alejandro Montilva Publicado el7:35 am - 07/10/2023

Buen artículo Francisco! Gracias

Deja una respuesta