这是一个关于SQL Server 2008 R2的问题为什么临时表和子查询之间有巨大的性能差异
我不是DBA,到目前为止。我是一名Java开发人员,他不得不随时写SQL。 (主要嵌入代码中)。我想知道我在这里做错了什么,如果是的话,我可以做些什么来避免它再次发生。
Q1:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Q1特征14联接
Q2相同Q1,有一个例外。 (SELECT * FROM T1 WHERE condition1)之前执行,并存储在临时表中。
这不是一个相关的子查询。
Q2:
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
再次,14连结。
现在让我感到困惑的是Q1花费了2分钟(试了几次,以避免缓存发挥作用),而Q2(两个查询相结合)花了2秒!是什么赋予了?
我的猜测是'SELECT * FROM T1 WHERE condition1'的估计行数非常不准确。将它物化为'#tempTable'意味着SQL Server确切地知道将返回多少行。你能发布两种实际执行计划的XML版本吗? –