Если у вас есть индекс для products.productClass, это может повысить производительность.
select * from products where productClass = 547 -- includes productid
select productHistory.*
from productHistory
join products
on products.productid = productHistory.productid
and products,productClass = 547;
...
Если productID является кластеризованным индексом, то, вероятно, вы получите лучшую производительность с
CREATE TABLE #Temp (productid INT PRIMARY KEY CLUSTERED);
insert into #temp
select productid from products where productClass = 547
order by productid;
go
select productHistory.*
from productHistory
join #Temp
on #Temp.productid = productHistory.productid;
Объединение в кластеризованном индексе, кажется, дает лучшую производительность.
Подумайте об этом - SQL может соответствовать первому и знать, что он может забыть об остальных, а затем перейти ко второму, зная, что он может двигаться вперед (не возвращаться к вершине).
С помощью оператора where in (select ..) SQL не может использовать порядок.
Чем больше таблиц вам нужно присоединить, тем больше причин для #temp, поскольку при заполнении #temp у вас уходит около 1/2 секунды.
Если вы собираетесь использовать #temp, вы также можете сделать его временным.