 <p>Your performance is pretty good. Your problem is that you're being abused by, what sounds like poor coding, in the sproc you mentioned. So, let's say you manage to improve the performance of your query by 90% and soon after the sproc starts calling your query 20,000 times... you're back where you started. </p> <p>I would begin by investigating the problem sproc to see if there's a better solution than thousands of calls in a short period of time. Could be a simple fix of not calling a query from a loop, as a simple example. The client code could also use caching instead of calling a query repeatedly for data that doesn't change much.</p> <p>If you want to follow the performance route then I would suggest denormalizing. Since your query results are boxed by week, denormalizing is actually a good solution. You would create another table and populate it with results from your query... You would also not be calling tour subqueries all the time. SQL Server usually optimizes for that but it's definitely something worth trying. </p> <p>Good luck. </p>