The answer is that it usually depends on a set of attributes.
- 40 million rows with 100 columns isn't excessive if it's done right
- what is your backend database for the dashboard that take 25 to 30 seconds?
- have you checked to see where the bottleneck in performance may be? If you append ?:record_performance=yes onto the URL making the request and you see that the green bars (queries) are the majority of the rendering time, then you need to make an adjustment to the way that you are querying. Create a Performance Recording
- do you have fast disk throughput available on your TS? If so, then extract could be an option