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