我有一个类似这样的存储过程:
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'。”
有没有办法查看此类脚本的执行计划(或执行细节(而不是计划))?
答案 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)。