不准确的行数会导致错误的查询计划

时间:2014-03-26 04:37:29

标签: sql sql-server

我在这里有点谜题我希望你可以帮忙。考虑这两个问题:

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'

查询计划:http://imgur.com/0x5NB2I

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)

查询计划:http://imgur.com/jimkxLO

他们都试图创建一个包含事务的大表的临时提取。第一个跑了一个多小时才杀了它,第二个跑了大约一分钟。 BasketDetail表按月分区。查看查询计划,两者都在使用分区,但第一个计划似乎只需要1行,最终会使用一堆嵌套循环。

任何想法为什么从连接转换为IN语句会产生这种影响?当我不需要产品表中的值时,调整工作正常,但情况并非总是如此。在这种情况下,加入product表以及使用in子句可以解决问题,但它是重复的。

0 个答案:

没有答案