Hace tiempo que doy soporte y asistencia en correcciones DAX en distintos lugares. Algo que sigo viendo con mucha frecuencia son funciones DAX en largas lineas de oración muy complicadas para seguirle el hilo. Normalmente estos problemas llegan cuando la performance de una medida empieza a afectar y los involucrados piden ayuda para mejorarla.
En este artículo vamos a ver la importancia de las variables en nuestro código DAX. Siempre deberíamos considerarlas porque son un beneficio doble entre claridad para nuestro código y performance. Muchos pueden menos preciar la calidad de un código legible pero dejenme decirles que es muy importante en el mantenimiento de un modelo.
Caso de ejemplo
Primero lo primero. Las variables almacenan el resultado de una expresión con nombre que después se puede pasar como argumento a otras expresiones de medida. Una vez que se han calculado los valores resultantes de una expresión variable, esos valores no cambian, aunque se haga referencia a la variable en otra expresión. ¿Qué significa esto? ¿Qué sucede cuando creamos una variable? ¿Cómo se evaluan las variables en nuestro código? Las variables se evalúan una vez y para siempre durante el cálculo. Esto quiere decir que el resultado de la variable no cambiará cuando cambiemos el contexto de filtros de una expresión determinada.
Para explicar mejor esto, veamos un ejemplo:


Supongamos que tenemos una medida de "proyección". Se que es una terrible forma de calcular la proyección pero sirve de ejemplo. En el gráfico de lineas podemos apreciar la proyección para el año siguiente junto con el desarrollo del año seleccionado. Se habrán dado cuenta que la medida contiene repeticiones de código. SUM(InternetSales[Quantity]) sale tres veces en nuestro código.
Como sabemos que las variables tienen muchos beneficios, queremos aplicarlas. Entonces pensamos, vamos a poner esa función repetida en una variable para reducir el código que aparece muchas veces formando la siguiente medida:

Podemos pensar que así hemos ahorrado 3 cálculos en nuestra ejecución pero sin pensar en la forma en la que las variables se evalúan. El resultado de nuestra medida estará muy fuera de lugar:

Si nos detenemos un momento podremos entender lo que mencionabamos antes. La variable __cantidad se ejecuta una vez y luego no es afectada de igual manera que antes por el contexto de ALLEXCEPT y por lo tanto de los filtros posteriores. Ya existe un resultado al momento de intentar aplicarle la lógica del denominador de mantener los valores anuales.
Si quisieramos que la variable evalúe dicho contexto, necesitamos ejecutar ese bloque como parte de una variable propia. Pensar que ese SUM dentro del CALCULATE necesita su propio contexto. Entonces deberíamos crear una segunda variable que repita esa porción de expresión para que la evalúe en el lugar correcto:

De este modo llegamos al resultado apropiado en el que coinciden los resultados:

Gracias a las variables podemos apreciar de muy rápida forma de que se trata la medida. Antes teníamos que leerla todo para entender que hacía. Ahora simplemente leyendo el return, tenemos una idea sobre el objetivo de la medida. Habiendo separado las variables también podríamos debugear nuestra DAX. ¿Cómo? ejecutando en el RETURN cada una de las variables para poder ver su resultado. Así sabríamos en que parte de la expresión matemática esta el error en caso que el resultado final esté mal.
Beneficios de variables
Ahora que entendemos como funcionan su evaluación podemos hablar de beneficios. Las variables pueden mejorar el rendimiento, la confiabilidad y la legibilidad, y reducir la complejidad.
- Rendimiento: ejecutar bloques de código repetitivos una única vez fortalece la performance de nuestra ejecución.
- Confiabilidad: la distribución en variables nos ayuda a debugear puesto que podemos retornar distintos bloques de código para comprender los resultados de cada variable dentro de nuestras fórmulas.
- Legibilidad: un código legible se vuelve mantenible, puesto que podemos interpretarlo con mayor facilidad.
- Reduce complejidad: al reducir y hacer más legible el código, logramos que sea más sencillo de comprenderlo para poder determinar el sentido de la ejecución.
Espero que esto los ayude a escribir mejor DAX en el futuro.
¿Y vos? ¿Ya usabas variables para mejorar performance o debugear?