Forum Discussion
Help with Optimizing Measure
- 4 years ago
Hi Anonymous
You'll need a couple of extra columns to do this. One to hold days with "10+" for results > 10, and a second column to hold the sort order for the first column.
They're both very similar to your existing Job to Accep Working Days column, just altering the RETURN part.
Job to Accep Working Days (10max) = var _d_jbook = DATEVALUE( [JOB_BOOKING_DATETIME]) var _d_accept = if ( [ACCEPTANCE_DATETIME] = blank(), blank(), DATEVALUE( [ACCEPTANCE_DATETIME] )) var _d_end = if (ISBLANK(_d_accept) || _d_jbook > _d_accept, _d_jbook, _d_accept) var _workdays = CALCULATE( countrows( 'Calendar Job Booking'), DATESBETWEEN('Calendar Job Booking'[Date], _d_jbook, _d_end), FILTER('Calendar Job Booking', 'Calendar Job Booking'[WorkingDay] = "yes") ) RETURN if (ISBLANK(_d_accept), blank(), IF(_workdays -1 >=10, "10+", FORMAT(_workdays -1, "#") ) )Job to Accep Working Days (10max) Order = var _d_jbook = DATEVALUE( [JOB_BOOKING_DATETIME]) var _d_accept = if ( [ACCEPTANCE_DATETIME] = blank(), blank(), DATEVALUE( [ACCEPTANCE_DATETIME] )) var _d_end = if (ISBLANK(_d_accept) || _d_jbook > _d_accept, _d_jbook, _d_accept) var _workdays = CALCULATE( countrows( 'Calendar Job Booking'), DATESBETWEEN('Calendar Job Booking'[Date], _d_jbook, _d_end), FILTER('Calendar Job Booking', 'Calendar Job Booking'[WorkingDay] = "yes") ) RETURN if (ISBLANK(_d_accept), blank(), IF(_workdays -1 >=10, 10, _workdays -1 ) )You then set the sort order for the Job to Accep Working Days (10max) column in the Data view.
Final result:
Hi VahidDM , here is sample file with reduced dataset - 1month only
https://drive.google.com/drive/folders/1dmmbhdbzySZBr8oTxj9CWsmztwFQ3f8A?usp=sharing
Hi Anonymous
Here's the baseline performance of your measure:
5.8s to run, but more importantly 5 SE (Storage Engine) queries of which 3 are tables with a large number of rows. Reducing the number of queries and/or their size should be the aim as that's what will improve performance.
That leads to the first thing you can do - split your datetime fields into a date field and a time field. The SE queries with 300k rows are because you're using datetime fields in your visual, but the time has no bearing on this calculation.
If you were to use the same measure on a visual with JOB_BOOKING_DATE and ACCEPTANCE_DATE (new date fields) then you'd get this performance:
Down to 42ms. Same number of SE Queries but they're much smaller.
A second thing that occurs to me is does this need to be a measure or could it be a calculated column? Having the working days pre-calculated is always going to be quicker than a measure.