我花了一些时间寻找这方面的答案但无济于事......如果之前有人问过道歉。
基本上我有一个查询聚合多个子查询/层上的数据,然后对联接服务器上的数据库进行交叉查询。它最简单的形式(无法真正披露代码)看起来像这样:
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
虽然我可以使用它,但我宁愿使用单一查询,或者至少理解为什么查询没有完成。
我在网上看过一些帖子,提到引用每行的外部查询的子查询,但这些例子似乎与我自己的相同。我猜测这实际上是发生了什么,但我不明白它是怎么回事,或者如何防止它。任何可以分享的知识都会很棒!