我在这里有点谜题我希望你可以帮忙。考虑这两个问题:
select bd.*, hc.Household
into #BasketDetail
from BasketDetail bd
join #Product p on bd.Product = p.ProductId
join #HouseholdCard hc on hc.Card = bd.Card
where bd.TransactionDate between '2012-08-01' and '2012-08-31 23:59:59'
和
select bd.*, hc.Household
into #BasketDetail
from BasketDetail bd
join #HouseholdCard hc on hc.Card = bd.Card
where bd.TransactionDate between '2012-08-01' and '2012-08-31 23:59:59'
and bd.product in (select productID from #Product)
他们都试图创建一个包含事务的大表的临时提取。第一个跑了一个多小时才杀了它,第二个跑了大约一分钟。 BasketDetail表按月分区。查看查询计划,两者都在使用分区,但第一个计划似乎只需要1行,最终会使用一堆嵌套循环。
任何想法为什么从连接转换为IN语句会产生这种影响?当我不需要产品表中的值时,调整工作正常,但情况并非总是如此。在这种情况下,加入product表以及使用in子句可以解决问题,但它是重复的。