Anónimo
Hola … Tengo un modelo compuesto, con 2 niveles de tablas agregadas. tengo un medida que parece bastante simple, pero que tarda unos 10 segundos en devolver los resultados. Aquí está el segmento relevante del modelo con el que estoy trabajando. Es un tipo de modelo «Salesy» bastante estándar …
Tablas de hechos:
1) Sales Agg Date Store – Modo de importación – 4 millones de filas – Tabla agregada
2) Ventas agregadas extendidas – Modo de importación – 20 millones de filas – Tabla agregada
3) Ticket de venta – Modo de consulta directa – 600 millones de filas – Detalle del nivel de transacción
Esta medida de DAX está tardando unos 10 segundos en volver cuando agrego la cláusula FILTER:
CALCULATE (
SUM ( 'Sales Ticket'[Ticket_Count] ),
FILTER (
'Sales Agg Date Store',
'Sales Agg Date Store'[Sales Above Threshold Flag]
)
)
La idea básica es que quiero obtener una suma de Ticket_Count para los días y las tiendas donde se alcanzó el umbral de ventas. (no contamos los días con poca actividad). Ese ventas por encima de la bandera de umbral está solo en la tabla agregada de nivel más alto.
Veo en DAX Studio que la medida está mapeando la agregación con éxito desde el [Sales Ticket] tabla hasta el [Sales Agg Date Store] tabla. Entonces debería ser bastante rápido. Pero no lo es.
Intenté reemplazar el FILTRO con CALCULATETABLE. Sin suerte. ¿Alguien puede pensar en algo que me falta para ayudar con el desempeño de esta medida? Tal vez el diseño de mi modelo necesite ser ampliado. Eso también podría serlo.
¡Gracias por mirar!
daxer
Hay una regla de oro en la programación DAX: NUNCA USE UNA TABLA CUANDO PUEDA USAR UNA COLUMNA. Estás violando esta regla. Nunca debe filtrar por tablas completas, ya que esto SIEMPRE será lento y, de hecho, peligroso. En segundo lugar, no debe utilizar las tablas agregadas en sus fórmulas. Simplemente no cree dependencia de algo que podría no estar allí en absoluto. Las tablas agregadas deben ser invisible para ti. Es solo una maquinaria para acelerar consultas / medidas y está diseñada únicamente para el motor SSAS. Por lo tanto, cambie la medida y asegúrese de que cuando crea que se utilizan agregaciones, realmente lo son.
wdx223_Daniel
¿Qué tal usar TREATAS para crear una relación virtual?
CALCULATE (
SUM ( 'Sales Ticket'[Ticket_Count] ),
TREATAS(CALCULATETABLE(VALUES('Sales Agg Date Store'[STORE_KEY]),
'Sales Agg Date Store'[Sales Above Threshold Flag]
),'Sales Ticket'[STORE_KEY])
)
Alba
Hola @Anónimo
No veo ninguna relación entre ‘Sales Agg Date Store’ y ‘Sales Ticket’. ¿Lo veo incorrectamente? Si no hay relación, ¿cuál es el objetivo del filtro?
Marque la pregunta resuelta cuando haya terminado y considere dar felicitaciones si las publicaciones son útiles.
Comuníquese conmigo en privado para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.
Salud
Anónimo
En respuesta a Alba
Hola @AlB .. gracias por tu respuesta!
La idea es tirar del [Sales Above Threshold Flag] desde el [Sales Agg Date Store] tabla y aplicarlo a la jerarquía agregada (es decir, cualquiera de las tres tablas de hechos) en función de sus relaciones mutuas con el [Calendar] y [Store] mesas.
El filtro proporciona combinaciones únicas de [STORE_KEY] y [Ticket_Created_date] que necesito incluir para las ventas en los días en que el total de la tienda alcanzó el umbral mínimo diario.
Hasta donde yo sé, las relaciones entre tablas de hechos no son una buena práctica, pero tal vez ayudaría aquí. Lo intenté hace un tiempo, pero la cardinalidad de las relaciones era tan alta que se convirtió en una carga actualizar el modelo con frecuencia.
Alba
En respuesta a Anónimo
@Anónimo
Intente quizás usar solo la columna relevante en lugar de toda la tabla como base para el filtro:
CALCULATE (
SUM ( 'Sales Ticket'[Ticket_Count] ),
FILTER (
ALL('Sales Agg Date Store'[Sales Above Threshold Flag]),
'Sales Agg Date Store'[Sales Above Threshold Flag]
)
)
o
CALCULATE (
SUM ( 'Sales Ticket'[Ticket_Count] ),
FILTER (
DISTINCT('Sales Agg Date Store'[Sales Above Threshold Flag]),
'Sales Agg Date Store'[Sales Above Threshold Flag]
)
)
que sería en realidad el equivalente de lo que tenía (ya que no estaba usando TODO en toda la tabla)
Marque la pregunta resuelta cuando haya terminado y considere dando un pulgar hacia arriba si las publicaciones son útiles.
Comuníquese conmigo en privado para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.
Salud
Anónimo
En respuesta a Alba
Gracias de nuevo por echar un vistazo. ¡Realmente lo aprecio! El DAX propuesto no funcionó. Creo que es mejor que propague la columna de filtro en todos los niveles de mi agregación. Así que lo agregué en la fuente para las 3 tablas de hechos, ahora puedo escribirlo realmente fácil así …
"Ticket_Count_Above_Threshold", CALCULATE ( [Ticket Count], 'Sales Ticket'[Sales Above Threshold Flag] )
… y la magia de la agregación en Power BI lo enrolla tanto como sea posible. Cosas asombrosas.