使用临时表的查询执行计划

时间:2012-01-11 16:29:00

标签: sql-server sql-server-2008-r2 sql-execution-plan

我有一个类似这样的存储过程:

SELECT Id
INTO #temp
FROM table
WHERE ...

DELETE FROM #temp
INNER JOIN table2 ON a=b
WHERE ...

但它运行缓慢。当我尝试查看执行计划时,我不能,因为SQL Server Management Studio说“消息208,级别16,状态0,行31无效对象名称'#temp'。”

有没有办法查看此类脚本的执行计划(或执行细节(而不是计划))?

5 个答案:

答案 0 :(得分:5)

SET SHOWPLAN_TEXT ON(或点击显示估计执行计划是SSMS)创建执行SQL的计划

因为这会创建#temp

SELECT Id
INTO #temp
FROM table
WHERE ...

这将失败

DELETE FROM #temp
INNER JOIN table2 ON a=b
WHERE ...

因此,解决方案是将其添加到顶部(或通过SSMS执行等效操作)

SET SHOWPLAN_TEXT OFF
GO

SET STATISTICS PROFILE ON
GO

答案 1 :(得分:2)

它应该让你看到第一个声明的估计执行计划。

对于第二个语句,您需要首先创建并填充#temp表(填充非常重要,以便它显示将用于正确行数的计划)。

(或者您当然可以在SSMS中打开“包含实际执行计划”选项并运行整个事情,如果您没有专门尝试查看估算的计划)

答案 2 :(得分:1)

优化器,用于生成估计执行计划,不执行T-SQL。它通过algebrizer运行语句,algebrizer是前面概述的负责验证数据库对象名称的过程。

由于尚未执行查询,因此临时表尚不存在。这是错误的原因。


解决此问题(并测试执行计划)的一种方法是先创建#temp表,然后在存储过程中创建insert into而不是select ... into

答案 3 :(得分:1)

您可以在运行查询之前使用此语句

   SET STATISTICS PROFILE ON
   SELECT Id
   INTO #temp
   FROM table
   WHERE ...

   DELETE FROM #temp
  INNER JOIN table2 ON a=b
  WHERE ...

答案 4 :(得分:0)

我只是简单地选择“ select into”子句,然后按F5执行它。这样就创建了tmp表。

然后,我选择了其余查询并单击“显示计划”(或按Ctrl + L)。