Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Hola, chicos
¿Hay una mejor manera de escribir esta consulta DAX?
Esta medida está tomando para siempre para rellenar datos ya que tengo más de 5 millones de registros, pero me da datos correctos.. Para los usuarios su tiempo de espera después de 30 min.
Totalmente Sra. se necesitó al consultar con el analizador de rendimiento - 250000ms
No conseguimos encontrar tu ubicación exacta.
Esta medida se desarrolla para calcular el porcentaje de margen bruto alcanzado para 4 escenarios diferentes.
Citado GM -Ve y Actual GM +Ve
Citado GM +Ve y Gm real -ve
Citado GM +Ve y Gm real +Ve
Modificado GM -Ve y GM Real +ve
datos de muestra:
QotedGM | ActualGM | GM attainment% - Valor correcto |
-4189 | -530 | 12.65% |
566 | 505 | 89.22% |
-129537 | -44370 | 34.25% |
744 | 340 | 45.70% |
-104 | 244 | 334.62% |
5695 | -629 | -111.04 |
Los sepequé como tres medidas diferentes y traté de sumarlas, todavía es lento.
El origen de datos es el modelo tabular del servidor de análisis y la conexión LIVE.
Pls help.thanks
Medida ?
CALCULAR (
DIVIDE (
SUM ( tabla[actual_margin] )
- SUM (tabla[[quoted_margin]] ),
SUM (tabla[[quoted_margin]] ),
0
) * -1,
FILTRO (
Mesa
SUM ( table[quoted_margin] ) < 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) <> BLANK())
, FILTRO(
Mesa
SUM ( table[actual_margin] ) > 0
))
+
CALCULAR (
DIVIDE (
SUM ( tabla[actual_margin] )
- SUM (tabla[quoted_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) > 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) < 0
)
)
+
CALCULAR (
DIVIDE (
SUM (tabla[actual_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) > 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) > 0
)
)
+
CALCULAR (
DIVIDE (
SUM (tabla[actual_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) < 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) < 0
)
)
Traté de usar variables e implementar la misma medida, aunque era muy rápido, pero el logro de margen se duplica y no es correcto.
A continuación se muestra la forma en que escribí la medida con la variable que se está duplicando.
Creo que estoy haciendo algo mal con la implementación de varialb.
Medida ?
var S_agm á sum(table[actual_margin])
var s_QGM á sum(table[quoted_margin)
CALCULAR (
DIVIDE (
S_AGM
- SUM (tabla[[quoted_margin]] ),
SUM (tabla[[quoted_margin]] ),
0
) * -1,
FILTRO (
Mesa
S_QGM < 0
),
FILTRO (
Mesa
S_AGM <> BLANK())
, FILTRO(
Mesa
S_AGM > 0
))
+
CALCULAR (
DIVIDE (
S_AGM
- S_QGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM > 0
),
FILTRO (
Mesa
S_AGM < 0
)
)
+
CALCULAR (
DIVIDE (
S_AGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM > 0
),
FILTRO (
Mesa
S_AGM > 0
)
)
+
CALCULAR (
DIVIDE (
S_AGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM < 0
),
FILTRO (
Mesa
S_AGM < 0
)
)
Gracias
Solved! Go to Solution.
Una medida en sí misma no ocupa espacio. El cálculo, por otro lado, puede necesitar mucho espacio si no está optimizado correctamente y es necesario materializar una gran cantidad de datos. Pero su fórmula es simple y debe ejecutarse muy rápidamente. Sospecho que no conozco todos los detalles porque no has revelado todo sobre tu modelo.
En primer lugar, debe asegurarse de que la tabla de hechos solo usa las columnas que realmente necesita y que tienen los tipos de datos correctos. Esto también significa que usted tiene que decidir si sus decimales deben tener el número de decimales que está teniendo en este momento o si se pueden redondear a, por ejemplo, 2 decimales. Esto tiene un gran impacto en la huella de memoria de la tabla.
Además, debe tener un diseño adecuado, que significa "esquema de estrella". Si no lo haces, será mejor que empieces a crearlo.
En segundo lugar, usted está diciendo que está utilizando una conexión en vivo. ¿Entiendo que se trata de una conexión a un cubo tabular? Si no es así, y simplemente está utilizando una base de datos sql, entonces será mejor que optimice sus estructuras. En primer lugar, debería tener índices en las tablas, lo más probable es que necesite un índice de almacén de columnas en la tabla de hechos. No sé cuál es su sistema, así que sólo puedo decirle acerca de SQL Server, ya que esto es lo que soy experto en.
Esta medida (que es su medida) debe ser ardientemente rápida:
[Measure] =
var __actualMargin = SUM ( table[actual_margin] )
var __quotedMargin = SUM ( table[quoted_margin] )
var __result =
switch( true(),
( __quotedMargin * __actualMargin ) < 0,
DIVIDE(
sign( __quotedMargin ) * ( __actualMargin - __quotedMargin ),
__quotedMargin
),
( __quotedMargin * __actualMargin ) > 0,
DIVIDE(
__actualMargin,
__quotedMargin
)
)
return
__result
Si no lo es, entonces algo está realmente mal con su modelo o su computadora es muy débil.
Mejor
D
hola @vishnuva
Puede intentar usar variables para mejorar sus fórmulas. Esto debería mejorar su perforencia:
https://docs.microsoft.com/en-us/power-bi/guidance/dax-variables#improve-performance
saludos
Lin
hola @v-lili6-msft ,
Estoy de acuerdo, pero no estoy seguro de dónde necesito poner las variables como cuando creé la medida con varibable, los valores se están duplicando.
Nopt seguro de cómo solucionarlo
Gracias
V
Por favor, tome un buen libro en DAX o inscríbase en un curso en línea y comience su viaje. Hay mucho que tienes que descubrir y aprender sobre el idioma, así que no pierdas el tiempo.
Y aquí hay algo que parece la formulación que desea:
[Measure] =
// This is the first part of your measure...
var __actualMargin = SUM ( table[actual_margin] )
var __quotedMargin = SUM ( table[quoted_margin] )
var __shouldCalc = __quotedMargin < 0 && __actualMargin > 0
return
if( __shouldCalc,
DIVIDE(
(-1) * ( __actualMargin - __quotedMargin ),
__quotedMargin
)
)
+
// Change the other parts accordingly.
...
Los filtros filtran la 'tabla' completa o devuelven una vacía porque cuando se calcula la SUMA debajo de ellos, no hay transición de contexto. Por lo tanto, eso significa que puede usar una expresión lógica simple como yo tengo arriba.
Mejor
D
Hola @darlove Disculpas por la confusión.
Estoy creando una medida y no una fórmula . Disculpa de nuevo si eso te confunde.
He utilizado la función IF ya que me respondió en su DAX con si la función .
Me pregunto si SWITCH funcionará en mi caso ... Dado que los datos de hecho tabla son enormes , Creo que puedo obtener "Sin error de memoria" también.
¿Cree que es una mejor idea escribir la lógica en la columna calculada en DB .
Tengo una memoria de 64gb en el servidor.
¿Puedo saber su sugerencia?
Mis filas totales en mi fáctil hasta ahora son 7607510 (7 millones)
Una medida en sí misma no ocupa espacio. El cálculo, por otro lado, puede necesitar mucho espacio si no está optimizado correctamente y es necesario materializar una gran cantidad de datos. Pero su fórmula es simple y debe ejecutarse muy rápidamente. Sospecho que no conozco todos los detalles porque no has revelado todo sobre tu modelo.
En primer lugar, debe asegurarse de que la tabla de hechos solo usa las columnas que realmente necesita y que tienen los tipos de datos correctos. Esto también significa que usted tiene que decidir si sus decimales deben tener el número de decimales que está teniendo en este momento o si se pueden redondear a, por ejemplo, 2 decimales. Esto tiene un gran impacto en la huella de memoria de la tabla.
Además, debe tener un diseño adecuado, que significa "esquema de estrella". Si no lo haces, será mejor que empieces a crearlo.
En segundo lugar, usted está diciendo que está utilizando una conexión en vivo. ¿Entiendo que se trata de una conexión a un cubo tabular? Si no es así, y simplemente está utilizando una base de datos sql, entonces será mejor que optimice sus estructuras. En primer lugar, debería tener índices en las tablas, lo más probable es que necesite un índice de almacén de columnas en la tabla de hechos. No sé cuál es su sistema, así que sólo puedo decirle acerca de SQL Server, ya que esto es lo que soy experto en.
Esta medida (que es su medida) debe ser ardientemente rápida:
[Measure] =
var __actualMargin = SUM ( table[actual_margin] )
var __quotedMargin = SUM ( table[quoted_margin] )
var __result =
switch( true(),
( __quotedMargin * __actualMargin ) < 0,
DIVIDE(
sign( __quotedMargin ) * ( __actualMargin - __quotedMargin ),
__quotedMargin
),
( __quotedMargin * __actualMargin ) > 0,
DIVIDE(
__actualMargin,
__quotedMargin
)
)
return
__result
Si no lo es, entonces algo está realmente mal con su modelo o su computadora es muy débil.
Mejor
D
Hola @darlove
No estoy seguro de lo que va mal.
Acabo de modificar la consulta que me mostraste e incluso eso es muy lento para mí.
No estoy seguro de cuál es la verdadera causa. Usted dijo que este meaure será tan rápido entonces supongo que podría ser . Puede ser que mi máquina esté exhasted después de que multtiples lo intente. Déjame intentarlo mañana y ver si funciona rápido
Tengo esquema de copo de nieve .
Traté de eliminar esta medida de la tabla en power bi y los datos se rellenan tan rápido . Cuando intento añadirlo agin , se vuelve tan lento.
Tengo una matriz visual grande con 10 columnas y 18 valores (o métricas). Puede ser que esto también pueda ser una razón. No sé.
. Permítanme también probar cualquier manera que viene a mi mente .
Hola @darlove ,
He encontrado el problema . El problema era que tenía alrededor de 12 filas y 12 valor creado en la matriz. También he añadido sub totales en pocos niveles como el nivel de cliente, nivel de región y nivel de ID. Puesto que tiene que calcular varios millones de reocrds se desaceleró ahora.
Me contraje las tablas de matriz, limité mis filtros y luego expandí VOILA fue tan rápido.
Muchas gracias por tu ayuda
All the Best
V
hola @Mariusz
Edité mi publicación e incluyé más información.
Datos de muestra demasiado proporcionados.
Gracias
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |