1. Faro

Nivel 2 · Arregla la medida lenta

La solicitud

De Victor Ramirez, Director de marketing

“La página del canal web va a paso de tortuga. Nuestro contratista lo rastreó hasta la medida Web Sales; los números son correctos, solo que es lenta. ¿Puedes reescribirla para que dé las mismas cifras sin el FILTER?”

Tu objetivo

La medida antigua está en el editor como comentario. Escribe una nueva medida Web Sales que devuelva los mismos números (pedidos web completados, suma de order_items[line_total]) en cada celda de la matriz de categorías, usando CALCULATE con filtros de columna y sin la función FILTER.

  • Llena [Web Sales] en cada fila del visualpendiente
  • También la fila Total correctapendiente

Tu medida

DAX
Visual
A matrix: rows = products[category]; values = [Web Sales]
Panel de datos: tablas y columnas
  • order_items order_item_id, order_id, product_id, quantity, unit_price, discount_pct, line_total
  • orders order_id, customer_id, order_date, status, channel, shipping_fee, coupon_code
  • products product_id, name, category, subcategory, unit_price, unit_cost, launched_on, is_active
  • customers customer_id, first_name, last_name, email, city, state, signup_date, segment, referral_source
  • returns return_id, order_item_id, returned_on, reason, refund_amount
  • Date Date, Year, Quarter, Month Number, Month, Year Month, Year Quarter, Day, Weekday Number, Weekday

Cargando el editor…

    Visual[Web Sales] fills in when you press Check
    El visual antes de tu respuesta
    categoryWeb Sales
    Decor
    Furniture
    Kitchen
    Lighting
    Outdoor
    Textiles
    Total

    Mote revisa tu resultado

    Presiona Comprobar. Mote completa tu respuesta y la compara con lo que necesita el informe.

    La lección

    La medida de Victor devuelve los números correctos. Por eso mismo sobreviven las medidas lentas: nadie las mira hasta que una página tarda diez segundos en responder a un clic.

    Dónde estás trabajando

    Esta página es un informe de práctica, no Power BI: una matriz con products[category] en las filas y un editor de DAX. Cuando pulsas Comprobar (Check), el motor evalúa tu medida en cada celda, compara cada una con los números esperados y comprueba también que FILTER ya no esté, porque la velocidad es el sentido del ticket. No puede cronometrar tu fórmula como lo hace Power BI.

    En Power BI Desktop, selecciona la medida en el panel Datos (Data), edítala en la barra de fórmulas y pulsa Enter. Luego Optimizar → Analizador de rendimiento → Iniciar grabación → Actualizar objetos visuales (Optimize → Performance analyzer → Start recording → Refresh visuals) y compara el tiempo de la consulta DAX antes y después.

    Qué hace la versión lenta

    Web Sales = SUMX(
        FILTER(order_items, RELATED(orders[channel]) = "web" && RELATED(orders[status]) = "completed"),
        order_items[line_total])

    FILTER recorre cada fila de order_items visible en la celda, sigue la relación hacia orders dos veces por fila con RELATED y construye una nueva tabla con las filas que pasan. SUMX recorre después esa tabla. Casi todo es trabajo fila por fila para el motor de fórmulas de un solo hilo, y crece con la tabla de hechos.

    Qué hace la versión rápida

    Web Sales = CALCULATE(
        SUM(order_items[line_total]),
        orders[channel] = "web",
        orders[status] = "completed")

    Cada condición es un filtro de columna: CALCULATE convierte orders[channel] = "web" en “la columna channel, valor web”. Los filtros sobre orders llegan a order_items por la relación, igual que una segmentación. Lo que queda es una simple SUM sobre una columna filtrada, que el motor de almacenamiento hace en un solo recorrido rápido. Dos argumentos de filtro se combinan con AND.

    Mismos números, cada celda

    Las filas de la matriz filtran products, que filtra order_items; los nuevos filtros sobre orders se suman a eso. Así cada fila de categoría obtiene sus ventas web completadas, y la fila Total obtiene todas. Un filtro de columna de CALCULATE reemplaza un filtro existente sobre la misma columna, así que si la página tuviera una segmentación de canal, esta medida la ignoraría y mostraría siempre web. Eso es lo que pidió Victor.

    Cuándo FILTER es la herramienta correcta

    Conserva FILTER cuando la condición no se pueda escribir como una prueba sobre una columna: comparar dos columnas (order_items[unit_price] > RELATED(products[unit_price])) o probar una medida. Incluso entonces, filtra la tabla más pequeña que sirva, como FILTER(VALUES(orders[order_id]), …), nunca toda la tabla de hechos.

    Errores comunes

    • Quitar la prueba de estado. Se cuelan pedidos web cancelados y reembolsados.
    • FILTER(ALL(orders), …) dentro de CALCULATE. Quita también los filtros de segmentación sobre orders.
    • Comillas alrededor de los nombres de columna. "orders[channel]" es texto, no una columna.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.