Forum Discussion

mkinde's avatar
mkinde
Frequent Visitor
1 year ago
Solved

DAX for evaluating flags in large table

I have a dashboard with the following limitations:   Over 40 million rows in the main fact table. The dashboard compares two time periods that are selected by the user. The time periods are inter...
  • v-hashadapu's avatar
    1 year ago

    Hi mkinde , Thank you for reaching out to the Microsoft Community Forum.

     

    We find the answer posted by lbendlin appropriate for your issue. Making it more detailed, the issue you're facing arises from the cost of evaluating conditional logic per row in visuals, especially when you're stacking multiple measures and using filtering patterns like IN. This causes performance degradation at scale. To solve this without compromising performance or exportability, follow one of these structures based on your scenario:

     

    If the flag logic can be applied before user interaction (for example, if time periods are fixed or predictable), push it into Power Query. This approach is fully exportable and incurs no runtime cost:

    if [Current Capacity] = null and [Prior Capacity] <> null then "Deleted"

    else if [Current Capacity] <> null and [Prior Capacity] = null then "Added"

    else "Maintained"

     

    If the logic depends on slicers and must be calculated live, use TREATAS instead of IN. This efficiently passes filter context and avoids nested IFs:

    Flag =
    VAR Period1 = VALUES(compare_case_1[resettimingdesc])
    VAR Period2 = VALUES(compare_case_2[resettimingdesc])
    VAR Current = CALCULATE(SUM(fact_performancesummary[unitcapacitycnt]), TREATAS(Period1, fact_performancesummary[resettimingdesc]))
    VAR Prior = CALCULATE(SUM(fact_performancesummary[unitcapacitycnt]), TREATAS(Period2, dim_same_store_status[resettimingdesc_2]))
    RETURN
    SWITCH
    ( TRUE(),
    ISBLANK(Current) && NOT ISBLANK(Prior), "Deleted",
    NOT ISBLANK(Current) && ISBLANK(Prior), "Added",
    "Maintained"
    )

     

    If you're already using a performant _flag = DIVIDE([measure_1], [measure_2], -1) pattern to drive icons and just need an exportable version, avoid reintroducing complex logic. Simply map the _flag value to a text column or measure:
    ExportFlag =
     SWITCH(
    TRUE(), [_flag] = -1, "Deleted",
    [_flag] > 0, "Maintained",
    ISBLANK([_flag]) || [_flag] = 0, "Added"
    )

     

    This keeps performance intact and provides the user with a clean, exportable text-based flag.

     

    If this helped solve the issue, please consider marking it “Accept as Solution” so others with similar queries may find it more easily. If not, please share the details, always happy to help.
    Thank you.