I have a very slow running query, and I've isolated the problem down to the following SQL. SELECT ... FROM TableA a(nolock) inner join TableB b with(nolock) on (b.Id = a.Id AND b.Date>= isnull(@timestamp_start, '17530101') AND b.Date < isnull(@timestamp_end, '99991231')) - a = 2million+ rows - b = 2million+ rows - b.Id => Index, unique, non-clustered - a.Id => Index, unique, non-clustered - b.Date => Index, non-unique, non-clustered This takes several minutes without returning a result even for a single day date range. **UPDATE:** The *estimated* execution plan on the production server is showing me this, which shows that a complete scan of a huge table (TableA) is occurring near the beginning of the query, rather than the TableB.date range being used to filter in the WHERE. Why is this happening and how can I force the query to filter first on my date range? [![enter image description here][2]][2] The plan relates to this query, which in detail is: SELECT ... FROM TableA a(nolock) inner join TableB b with(nolock) on (b.Id = a.Id AND b.Date>= isnull(@timestamp_start, '17530101') AND b.Date < isnull(@timestamp_end, '99991231')) inner join TableC c with(nolock) on c.Id2 = s.Id2 and c.Id3 = a.Id3 and c.Id = b.Id inner join TableD d with(nolock) on (a.DealId = d.Id and d.Id3 = s.Id3 AND (@myparam is null OR d.ProviderName = @myparam)) inner join TableE e with(nolock) on (e.Id = d.Id AND (@myparam2 is null OR e.Id = @myparam2)) [1]: https://i.sstatic.net/79IOn.jpg [2]: https://i.sstatic.net/CSBiC.png