Filtros simples y azúcar de sintaxis en DAX

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Nivel: intermedio

Existe un concepto en el lenguaje DAX llamado «Syntax Sugar». En pocas palabras, los desarrolladores han creado versiones simplificadas de fórmulas más complejas para facilitar que las personas aprendan y utilicen el lenguaje DAX. Aquí hay un par de ejemplos

Total Sales Syntax Sugar = SUM(Sales[ExtendedAmount])
Total Sales Full Syntax = SUMX(Sales, Sales[ExtendedAmount])
Total Sales Prior Year Syntax Sugar =
      CALCULATE(
          [Total Sales],
          SAMEPERIODLASTYEAR('Calendar'[Date]
      )
Total Sales Prior Year Full Syntax =
      CALCULATE(
          [Total Sales],
          DATEADD('Calendar'[Date], -1, YEAR)
      )

Sintaxis simple en CALCULATE

Otro ejemplo de azúcar de sintaxis es la sintaxis simple dentro de CALCULATE. Hay 2 formas diferentes de aplicar un filtro dentro de CALCULATE

= CALCULATE(<expression>, Table[Column] compared to a scalar value, ...)
= CALCULATE(<expression>, TableFunction(),. ..)

Considere el siguiente ejemplo usando la sintaxis simple.

Total Sales of Bikes Simple =
     CALCULATE(
         [Total Sales],
         Product[Category] = "Bikes"
     )

La fórmula anterior es azúcar de sintaxis para la siguiente fórmula completa.

Total Sales of Bikes Full Version =
     CALCULATE(
         [Total Sales],
         FILTER(
              ALL(Product[Category]),
              Product[Category] = "Bikes"
         )
     )

Como puede ver, la versión simple es claramente más fácil de aprender y comprender para un principiante. Bajo el capó, la versión simple se convierte a la versión completa antes de su ejecución.

Pero, ¿por qué usar TODOS (Tabla[Column])?

Una cosa en la que una mente curiosa puede estar interesada es «¿por qué la versión completa usa TODOS (Tabla[Column]) y no TODOS (Tabla) ”? Antes de responder a esa pregunta, permítanme hablar primero sobre la compresión. El motor Vertipaq (utilizado en Power BI y Power Pivot) es una base de datos de almacén de columnas. Las bases de datos tradicionales (por ejemplo, SQL Server) utilizan la tecnología de almacenamiento de filas: cada fila se almacena una fila completa a la vez. Una base de datos de almacén de columnas almacena los datos de una columna a la vez. Algunas de las consecuencias (beneficios) de una base de datos de almacenamiento de columnas son que es muy eficiente para filtrar, iterar y operar sobre columnas enteras de datos en una tabla.

Explicación de la compresión

Hay algunos tipos diferentes de compresión que se usan en la base de datos de Vertipaq, y solo voy a discutir uno de ellos aquí. Supongamos que tiene una tabla de datos con 6 columnas y 100 millones de filas, y una de las columnas es «Cantidad». El objetivo es sumar la cantidad y obtener un total. Una base de datos de almacenamiento de filas (sin un índice) necesitaría recuperar los 100 millones de filas de datos, incluidas las columnas que no son necesarias en el cálculo, para obtener la respuesta. Una base de datos de almacén de columnas puede acceder directamente a la columna única para obtener la respuesta. Además, el motor Vertipaq puede comprimir las columnas antes de almacenarlas y acceder a ellas. Un método de compresión se llama codificación de longitud de ejecución (RLE).

En la imagen a continuación, la columna de datos original contiene varios valores (en este caso, los números del 1 al 5). La forma en que funciona RLE es que primero ordena la columna y luego crea una versión comprimida de la columna, similar a la que se muestra a continuación (ilustrativa).

image_thumb-5571816

Como puede ver arriba, la versión comprimida de la columna es pequeña en comparación con la original. En mi ejemplo, la columna / tabla original tiene solo 18 filas, pero si la tabla original tuviera 100 millones de filas con valores de 1 a 5, todavía se comprimiría exactamente a la misma versión comprimida que se muestra arriba. Por lo tanto, el cálculo para sumar las columnas en mi muestra anterior se vería así (pseudocódigo).

Value 1 exists 3 times (starting row 4 minus 1). Multiply 1 * 3
Value 2 exists 3 times (starting row 7 minus 4). Multiply 2 * 3
Value 3 exists 4 times (starting row 11 minus 7). Multiply 3 * 4
Value 4 exists 3 times (starting row 14 minus 11). Multiply 4 * 3
Value 5 exists 5 times (starting row 19 minus 14). Multiply 5 * 5
Add up all the totals

Como sin duda podrá comprender, el proceso anterior es idéntico para una columna de 18 filas y una columna de 100 millones de filas. Además, el motor Vertipaq tiene varios subprocesos. Si tiene 4 núcleos en su máquina, los cálculos se pueden compartir entre los núcleos y completar en paralelo antes de finalmente combinarse para devolver el resultado final.

La singularidad es tu enemigo

De ello se deduce que cuanto más valores únicos en una columna, menor es la compresión. También llega un punto de inflexión en el que es mejor almacenar la columna sin comprimir que intentar comprimir los datos. Por eso es mejor eliminar la precisión y la unicidad innecesarias de una columna antes de cargarla. Los ejemplos incluyen redondear a 2 lugares decimales en lugar de mantener números decimales sin redondear, separar la fecha y la hora en 2 columnas y redondear el tiempo a minutos en lugar de mantener los segundos (si no se necesitan segundos), etc.

Volver a TODOS (Tabla[Column])

Ahora, volvamos al azúcar de sintaxis. La razón por la que es más eficiente filtrar, iterar y operar sobre una columna que sobre una tabla es porque el motor puede iterar sobre la versión comprimida de la columna. la función ALL () devuelve una tabla que contiene todos los valores distintos en una columna. Esto es exactamente lo que contiene la columna «Valor» en la tabla comprimida en la imagen de arriba (excepto la fila en blanco en la parte inferior). Así que esa es la razón por la que el azúcar de sintaxis está escrito de la forma en que está: es para aprovechar las eficiencias del motor Vertipaq.

Asesoramiento final

En las sabias palabras de Alberto Farrari, “Nunca filtre una tabla si en su lugar puede filtrar una columna”. Ahora sabes por qué.

!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window,document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘639916389503636’);
fbq(‘track’, ‘PageView’);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.