DAX — IF vs IF.EAGER

Michal Molka
2 min readJul 9, 2021

In March 2021 Power BI got a new IF.EAGER DAX function. What is the difference between the “new” and an “old” IF?

The IF function is strict evaluated which computes TRUE or FALSE result only when a condition is met.

For instance: IF (5<2, 5+2, 7+1). An engine computes only the second part of T/F section (7+1), (5+2) isn’t computed.

The IF.EAGER function is eager evaluated. Computes TRUE and FALSE results regardless the condition is met or not.

An example: IF(5<2, 5+2, 7+1). The engine computes the first and the second part of T/F section (5+2), (7+1).

Now, you can ask a question. Why we should use the second one?

In some cases it provides a better performance. E.g. when T/F values are computed values (like measures - for example).

Our example is an Iowa Liquor Sales dataset. It contains 21 million rows.

We have three measures: SUM, AVERAGE, COUNT, which are used in the IF function.

DEFINE
MEASURE Iowa_Liquor_Sales[SalesSum] =
CALCULATE ( SUM ( Iowa_Liquor_Sales[Volume Sold (Liters)] ) )
MEASURE Iowa_Liquor_Sales[SalesAverage] =
CALCULATE ( AVERAGE ( Iowa_Liquor_Sales[Volume Sold (Liters)] ) )
MEASURE Iowa_Liquor_Sales[SalesCount] =
CALCULATE ( COUNTROWS ( Iowa_Liquor_Sales ) )
EVALUATE
SUMMARIZE (
Iowa_Liquor_Sales,
Iowa_Liquor_Sales[Category Name],
"IF", IF ( [SalesCount] < 100000, [SalesSum], [SalesAverage] )
)

Code for the IF.EAGER is almost identical besides the IF is changed to the IF.EAGER function.

DEFINE
MEASURE Iowa_Liquor_Sales[SalesSum] =
CALCULATE ( SUM ( Iowa_Liquor_Sales[Volume Sold (Liters)] ) )
MEASURE Iowa_Liquor_Sales[SalesAverage] =
CALCULATE ( AVERAGE ( Iowa_Liquor_Sales[Volume Sold (Liters)] ) )
MEASURE Iowa_Liquor_Sales[SalesCount] =
CALCULATE ( COUNTROWS ( Iowa_Liquor_Sales ) )
EVALUATE
SUMMARIZE (
Iowa_Liquor_Sales,
Iowa_Liquor_Sales[Category Name],
"IF", IF.EAGER ( [SalesCount] < 100000, [SalesSum], [SalesAverage] )
)

As you noticed, the difference is evident.

Total: 94ms compared to 39ms. Scans: 4 compared to 2

In most cases when a dataset is small or there is no calculation in a TRUE/FALSE section the difference is invisible. When you face with conditions as an above, you can take an advantage of using the IF.EAGER function.

--

--