Rendimiento del FILTRO en modelo compuesto con Aggs muy lento

Un usuario Pregunto ✅

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 …

2020-10-20_10-59-35.png

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

SU18_powerbi_badge

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.

2020-10-20_12-47-24.png

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

SU18_powerbi_badge

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *