¡Jueves de post! Hoy traigo un post un tanto diferente.. Y no es mĆ”s que la ponencia que dĆ­ el pasado sĆ”bado 29 en los Power BI Days de Bilbao. Una experiencia inolvidable y adictiva, ya que estoy deseando que llegue la siguiente... Agradecer a InĆ©s Pascual, Cristina Tabarabi-Castellani, Nagore Landa por la perfecta organización del evento y por haberme dado la oportunidad de estrenarme en el mundo speaker :). Fue un verdadero honor conocer en persona a Ana Maria BisbĆ©, Ricardo Ricon, Miguel Egea, Ruben Pertusa, Nelson Lopez, Diana Aguilera, Ivan Arribas, Alex Ayala, Jose Manuel Pomares... y muchĆ­simos mĆ”s profesionales del mundo de los datos. ¡GRACIAS!

Los siguientes Power BI Days son en Madrid los dƭas 25 y 26 de Noviembre y si podƩis ir, os recomiendo ir encarecidamente ya que participan los referentes de la comunidad tanto a nivel nacional como internacional. Os dejo aquƭ el link por si os animƔis.

Vamos los post.

Tip 1: Modelar, modelar, modelar...

En la imagen inferior, es uno de mis primeros “modelos” quĆ©
realicĆ© en Power BI harĆ” unos 5 aƱos… Es como esa foto de la adolescencia que
todos tenemos escondida en un cajón… pues aquĆ­ estĆ” la mĆ­a.

 

 

 



Es un informe completamente funcional, con datos vƔlidos,
correctos, y ademƔs ha estado en servicio hasta hace relativamente poco debido
a “Tengo que optimizarlo… pero ahora no tengo tiempo”.



Aunque como he dicho, es un informe funcional, tambiƩn es
una fantÔstica agrupación de todas las malas prÔcticas que uno debe evitar a la
hora de realizar un modelo y que va en contra de todo lo que os voy hablar
hoy... 

 





Como se puede ver, el tamaƱo del archivo pbix es de 341
Mb  y mientras que el tamaƱo del modelo llega
a 1,85 Gb… que necesito de memoria y que algo con una licencia Pro no puedo
subirlo. Su tiempo de actualización se iba a casi 45 minutos (y no, no es un
mega modelo).

 



Aunque no lo parezca, este esquema es el mismo informe que
el anterior, pero con un correcto modelado (y mÔs técnicas de optimización que
veremos mĆ”s adelante). 

 

 
 
Las diferencias son abismales entre ambos, ya no sólo a
nivel de rendimiento, que es lo que buscamos, sino que, a nivel de
interpretación, estÔn bien diferenciadas las tablas de dimensiones y las tablas
de hechos. Por quƩ creerme que me acordƩ en el Javi del pasado cuando me puse a
optimizar el modelo… 
 


Conseguimos pasar de un modelo que solamente el pbix ocupaba
341 Mb a 17 Mb



De 68 tablas y 1103 columnas a 11 tablas y 87 columnas…



¡Y de un tamaƱo de 1,85 Gb a 87 Mb!

 

 
 

Por lo que, una vez claro el impacto que tiene modelar,
saber que debemos definir
correctamente las tablas de dimensiones y las tablas de hechos. Para ello
voy a nombrar una frase del libro Fundamentos de modelado en estrella de
Toni Jurado:

 “Cualquier cosa
que queramos poner en una fila o columna de una tabla o en un eje de un grƔfico
DEBE SER un atributo de una dimensión y cualquier cosa que se deba representar
como valor, tanto en una tabla como un grƔfico, debe estar en una tabla de
hechos.”



¿Cómo llegamos a un resultado como este? De la siguiente
manera:



  1. Intentar
    llegar siempre que podamos a un modelo en estrella.
  2. Definir
    las relaciones correctamente entre tablas, es decir, la cardinalidad.
  3. Definir
    correctamente las granularidades, por ejemplo, si el anƔlisis del modelo
    va a ser semanal, la granularidad del modelo debe corresponderse con la
    misma y no ser diaria, o a nivel de segundos como era el caso del modelo
    ya que recogĆ­a las producciones de las plantas productivas. Este punto
    tambiƩn va muy de la mano con el tercer tip.
  4. Optimizar
    los tipos de datos de las columnas, es decir, una correcta identificación
    del tipo de dato ayudarÔ al motor VertiPaq a la compresión de las
    columnas.


Esta parte son los cimientos de nuestro modelo, de nuestra
casa, y es donde debemos dedicarle el mƔximo mimo y cuidado. Nos ahorrarƔ mucho
tiempo en el futuro…



Conclusión: No por traernos todas las tablas al modelo sin
modelar, este va a rendir mejor
.



 

Tip 2: Desactivar la inteligencia de tiempos automƔtica



¿Por quĆ© desactivar la inteligencia de tiempos automĆ”tica?
Por quĆ©  Power BI “Nos va a crear una tabla de fechas oculta en nuestro modelo
para cada CAMPO (Columna) que tenga un tipo de datos de fecha o fecha y hora.



¿De verdad que es necesario este ajuste para optimizar el
modelo? ¿Tanto ocupan esas tablas ocultas? VeĆ”moslo con un ejemplo. 

 

 

 

Podemos ver que dependiendo de la cantidad de históricos que
sean necesarios traernos, puede llegar a ocupar mƔs 50% del modelo, en este
caso, estamos hablando de casi un 40% de espacio. Y esto implica podemos
moverlo con un tipo de licencia u otro… Como se suele decir, cada mega, cuenta.



Para desactivar la inteligencia automƔtica para la fecha y
la hora en Opciones y Configuración – Opciones

 

 

Y lo podemos hacer tanto a nivel global:

 

 

o de proyecto: 

 

 

 



Conclusión: No por tener la fecha y hora automÔtica,
perdemos funcionalidades. DesactivƔndolas, nuestro modelo ocupa menos y puede
marcar la diferencia entre quƩ tipo de licencia tendremos que usa.

 

Tip 3: Eliminar columnas/filas innecesarias

Lanzo una pregunta, si en mi modelo no uso X columnas o
filas, ¿para quĆ© me las voy a traer a mi modelo? Sólo me van a ocupar espacio y
no aportan valor a mi modelo ni responden preguntas de negocio.

¿Cómo eliminamos o evitamos tener columnas o filas
innecesarias en nuestro modelo?

 

 



En nuestro proceso de extracción de la información, si
nuestro origen nos lo permite, trayéndonos la información ya filtrada mediante
sentencias SQL, DAX,.. Por ejemplo, si nuestro origen de datos es una base
de datos relacional en SQL Server, podemos escribir la consulta para que se
ejecute en origen y nos traiga las columnas que queremos, incluso, podemos
generar nuestras vistas si nuestro DBA no nos la genera en DWH.



 



Si nuestro origen no nos permite la opción de filtrado,
estas debemos eliminarlas mediante Power Query lo antes posible. Para ello, en
el menĆŗ de Power Query, disponemos de las opciones Elegir Columnas y Quitar
Columnas. Si hacemos click sobre “Elegir Columnas” se nos despliega un menĆŗ en
el que seleccionamos las columnas necesarias para nuestro modelo.



Nota: Como buena prƔctica se recomienda usar el paso de
“Elegir Columnas” ya que nos permite volver y reajustar las opciones de
filtrado cosa que si optamos por “Quitar Columna” no nos lo permite.

    

 

 

 



Si tenemos columnas que son el resultado de la combinación
de otras y que podemos calcularlas mediante mƩtricas, no nos aportan, por lo
que podemos prescindir de ellas. Por ejemplo, las columnas “TotalCost” y
“SalesAmount” son el resultado del producto UnitCost por Quantity y UnitPrice
por Quantity por lo que las podemos eliminar y calcularlas mediante iteradores.



La granularidad de la información. Otra técnica eficaz para
reducir el tamaƱo de nuestro modelo es la posibilidad de agrupar/resumir los datos
de nuestro modelo.  Si el requisito del
modelo es un anƔlisis por ejemplo semanal y los datos en nuestra tabla de
hechos esta con una granularidad de dĆ­a, podemos agruparlo por semana
reduciendo el nivel de detalle de la información y considerablemente el peso de
nuestro modelo.



Conclusión: No por traernos toda la información, nuestro
modelo va a ser menos funcional. 

 

Tip 4: MƩtricas VS Columnas Calculadas



Una columna calculada no estĆ” tan optimizada como una
columna nativa que nos traemos desde origen. Generalmente tienen una tasa de
compresión mÔs baja en comparación con las columnas nativas de la tabla porque
no participa en el algoritmo que usa VertiPaq para encontrar el orden de
clasificación óptimo de los datos en cada segmento.



Muy importante a tener en cuenta que si puede evitar una
columna calculada creando el mismo valor con una columna nativa en el origen de
datos al completar la tabla, por ejemplo, mediante una instrucción SQL o una
transformación de Power Query, debemos implementarlo.



Una vez dicho esto, las columnas calculadas se calculan en
tiempo de actualización, es decir, una vez terminado la carga de datos al
modelo y se almacena en el modelo de
datos en memoria mientras que las medidas o mƩtricas se calculan dinƔmicamente,
o lo que es lo mismo, no consumen casi casi memoria sino CPU.



 

 

 



Por ejemplo, en la imagen podemos ver nuestra tabla de
hechos con 2 mƩtricas y con 2 columnas calculadas, como podemos ver, el hecho
de disponer de 2 columnas calculadas el modelo ha aumentado en 10 MB en una
tabla de sólo 12 millones de registros.



Ojo, con esto no quiero demonizar a las columnas calculadas,
ya que, si por el hecho de hacer una columna calculada nos puede ahorrar una
métrica DAX súper compleja y laboriosa, la podemos hacer, pero a poder siempre
en el origen o en Power Query.



Las buenas prƔcticas para cuando las columnas calculadas
deben considerarse opciones viables generalmente en estas dos situaciones:



  1. Agrupar
    o filtrar datos: si una columna calculada devuelve un valor utilizado para
    agrupar o filtrar datos, no hay otra alternativa que crear el mismo valor
    antes de importar datos al modelo de datos.
  2. Precalcular
    fórmulas complejas: una columna calculada puede almacenar el resultado de
    un cƔlculo complejo que no es sensible a los filtros realizados en el
    momento de la consulta


Conclusión: Cuantas menos columnas calculadas con DAX en
nuestro modelo, mejor.

 

Tip 5:  Uso de Variables




Hasta ahora, casi todo lo que hemos visto estaba orientado a
la optimización de modelo en cuanto a espacio, ahora vamos a ver qué podemos
hacer para la experiencia del usuario con el informe sea completamente
satisfactoria. Y es el uso de variables.



Las variables tienen 4 objetivos, que son:



Rendimiento mejorado: las variables pueden hacer que
las medidas sean mĆ”s eficaces porque eliminan la necesidad de que Power BI
evalúe varias veces la misma expresión.



Mejora de la legibilidad: las variables tienen
nombres cortos y autodescriptivos (o deberĆ­an), y se usan en lugar de una
expresión ambigua de varias palabras. Al usar variables, es posible que le
resulte mÔs fÔcil leer y comprender las fórmulas.



Depuración simplificada: puede usar variables para
depurar una fórmula y probar expresiones, lo que puede resultar útil durante la
solución de problemas.



Complejidad reducida: las variables no requieren el
uso de las funciones DAX EARLIER o EARLIEST, que son difĆ­ciles de comprender.
Estas funciones eran necesarias antes de que se introdujeran las variables y se
escribieron en expresiones complejas que incorporaban nuevos contextos de
filtro. Ahora que puede usar variables en lugar de esas funciones, puede
escribir menos fórmulas complejas.



Vamos a verlo con un pequeƱo ejemplo:

 

  
 
 
 

En la primera medida que vemos, la medida  [Cantidad Productos] se  va a calcular 4 veces cada vez que queramos
obtener la Demanda de Productos, en cambio, si generamos una variable con la
cantidad, esta se va a calcular una Ćŗnica vez cada vez que queramos obtener la
Demanda de productos. ¿Y esto en que se traduce? Un diferencia en la duración
de la consulta, en este modelo de Contoso que he utilizado prƔcticamente no es
significativo, pero llevado a un modelo mucho mayor esto puede dar como
resultado una experiencia de usuario no óptima.

 

 



Conclusión: Cuantas menos veces anidemos una medida dentro
de otra… mejor serĆ” el rendimiento y por tanto la experiencia de usuario.

Y hasta aquí fue mi exposición del pasado sÔbado... espero que os sea útil.

¡Nos vemos en los datos!