Forum Discussion
Report is too slow
Oh yeah, nesting multiple SUMXs inside a SUMMARIZE will definitely slow things way down, especially if there are a lot of rows in whatever you're SUMXing. As a first step, I would recommend installing DAX Studio and learning how to use that. You can run test queries to find out how quickly or slowly a particular measure will run, which will help you find the major sources of slowdown. Then you can focus on those measures and see if there is a more efficient way to write them. I'll play around with your example measures to see if I can come up with any better methods.
God help us you have a SUMX with an ALL filter nested inside another SUMX with an ALL filter. I'm not trying to be mean but that's the DAX equivalent of replacing your car's oil with 5-minute epoxy. On every row of your table, your formula evaluates a formula on every row of the table. Inside that formula, on every row of the table, it evaluates another formula on every row of the table. It then uses these results to generate a summary table that includes every row of the table. You see the problem right?
It gets even worse when you put this into a visual. If you're putting this measure next to a column from the table, it must do all those steps a separate time for each member of that column in the visual.
It would help to see some sample data so I can get an idea of what kind of tables this is operating on. You can make something fake at mockaroo.com if your real data cannot be shared. How many rows are in this performance snapshot table? Also you're referencing several other measures inside this measure, so it would also be helpful to see the formulas for those measures.
Right off the bat I can tell you that the general pattern you're using is not as efficient as it could be, aside from the nested SUMX issue. Written generically, your measure follows this pattern:
SUMMARIZE( TableName, TableName[Column1], TableName[Column2], "MeasureName", SUMX( FILTER( TableName, TableName[Column3] = "examplevalue" ), CALCULATE(SUM(TableName[Column4])) ) )
That is almost always less efficient than this pattern:
ADDCOLUMNS( SUMMARIZE( TableName, TableName[Column1], TableName[Column2] ), "MeasureName", SUMX( FILTER( TableName, TableName[Column3] = "examplevalue" ), CALCULATE(SUM(TableName[Column4])) ) )
In your case the speed gain will be pretty minor right now, because the rest of the formula is slowing everything down so much. Still, the final form of this measure should still be switched to this pattern because hopefully we'll find a way to rewrite those nested SUMXs so they're not such a problem. I'll get back to you on the rest of it once I have a little more info from you about how it all works.
- Matthias939 years agoHelper III
Hi thank you for your fast answer. I did not know my DAX measures were the root of all evil. It was suggested to me on this very forum when I asked on some help on making it. Being a novice I did not think to think about the performance of it all.
So what I have is a table with one line for each performance snapshot. Each line contains information of the employee it's connected to as well as values for 4 different questions (question 1 and 2 have values between 1 and 5 and questions 3 and 4 are binary. A final column it contains is the number of hours related to the performance snapshot. Each question has a different 'weighted score' table where it has a column with the name of the employee and the weighted score for a question. This wieghted score is calculated the same way for each question. See the pictures below for more information. The first one shows what I want to achieve with the weighted questions. The second one shows how it's being done at the moment.
Thanks a lot already for your help, really appreaciate it
- Matthias939 years agoHelper III
This measure does not use any other measures, all the calculations are made in one measure. Currently the Snapshot table consists of 4 lines, but in the future it will consists of several thousands of lines (5000-10000).
- Anonymous9 years agoNot applicable
Hi Matthias93,
It seems like I provide a low performance method, you can try to use below method if it has better performance.
1. Add calculate column and measure to get the current value.
Measure: calculagte the total hours.
Total =
var temp= LASTNONBLANK(Table1[Team Member],[Team Member])
Return
SUMX(FILTER(ALL(Table1),Table1[Team Member]=temp),[Number of hours])Calculate column:
Current Value =
[Number of hours]*[Question 1 Value]/[Total]2. Summary the table.
Summary table= SUMMARIZE(Table1,[Team Member],"Result",SUM(Table1[Current Value]))
Regards,
Xiaoxin Sheng
- Matthias939 years agoHelper III
Hi,
I tried this and it seems to be working nicely. I have the impression performance has improved, but it can still be quite slow. This could indeed be due to the slicers I have on each page.
Thanks for helping me out!
Kind regards,
Matt
- Matthias939 years agoHelper III
Anonymous Hi,
Sorry to bother you, but have you had some time yet to review my response?
Kind regards,
Matt
- Ermin9 years agoAdvocate II
Hi Anonymous,
Did you already resolve the problem?
I have impression that the reason for the performance issues may be he number of slicers (or filters) being used. I have a power Bi Desktop report with a bunch of filters ad dependencies (interactions) between the different visualisation and somehow the performance has dropped "proportionally" to the number of slicers and interactions being used.
Did you investigate anything in that direction?