SQL内连接与临时表

时间:2016-09-01 16:47:37

标签: sql sql-server

我花了一些时间寻找这方面的答案但无济于事......如果之前有人问过道歉。

基本上我有一个查询聚合多个子查询/层上的数据,然后对联接服务器上的数据库进行交叉查询。它最简单的形式(无法真正披露代码)看起来像这样:

Select g.*, c.* from
  ( --query that only aggregates the next subquery and does a few case/when replacements
    select *, genericCaseStatementHere, sum(foo*moo) as value
    from
      ( --this is where I do most of the heavy lifting, joining several tables and there is grouping etc 
        Select * from table1 a
        inner join table2 b on a.id = b.id
        inner join table3 c on a.id = c.id
      ) f
  ) g
inner join (select * from OtherServer.database.dbo.table4 where blah = bleh) c
  on c.something = g.something

问题: 将查询分成两个并且加入(参考g和c),为每个段提供10秒内的预期数据。 g大约是3500行,c大概是60行(每行只有几列)。然而,当我加入他们时,如上所示查询运行超过20分钟(此时我杀了它,没有结果)。

认为跨服务器查询是导致问题的原因我将表c抽入临时表,然后尝试再次加入:

select g.*, c.* from 
     ( this whole chunk is the same so going to skip it) g
inner join #temptable c on c.something = g.something

再次工作。但是,如果我将它们都送入临时表并加入,它可以在几秒钟内完成:

  select g.* into #tempg from 
     ( this whole chunk is the same so going to skip it) g

  select g.* from #tempg g
  inner join #temptable c on c.something = g.something

虽然我可以使用它,但我宁愿使用单一查询,或者至少理解为什么查询没有完成。

我在网上看过一些帖子,提到引用每行的外部查询的子查询,但这些例子似乎与我自己的相同。我猜测这实际上是发生了什么,但我不明白它是怎么回事,或者如何防止它。任何可以分享的知识都会很棒!

0 个答案:

没有答案