删除或不删除存储过程中的临时表

时间:2017-09-20 06:42:37

标签: sql-server stored-procedures temp-tables

我多次看到这个问题,但我无法得到满足我的答案。基本上人们和书籍所说的是" 虽然临时表在超出范围时被删除,但是当不再需要它们时,应该明确删除它们以减少服务器上的资源需求&# 34。

我很清楚,当你在管理工作室工作并创建表格时,那么在关闭窗口或断开连接之前,你将使用该表的一些资源,从逻辑上讲,最好放弃它们。

但是当你使用程序时,那么如果你想清理表,那么你很可能会在它真正结束时这样做(我不是在谈论你在不需要的时候立即放下桌子的情况在程序中)。所以工作流程是这样的:

当您进入SP时:

  • 开始执行SP
  • 做一些事情
  • 删除表
  • 执行结束

据我所知,当你不放弃时它怎么可能有效:

  • 开始执行SP
  • 做一些事情
  • 执行结束
  • 删除表

这里的区别是什么?我只能想象需要一些资源来识别临时表。还有其他想法吗?

更新:

我用2 SP进行简单测试:

create procedure test  as
begin
create table #temp (a int)
insert into #temp values (1);
drop table #temp;
end

另一个没有drop语句。我已启用用户统计信息并运行测试:

declare @i int = 0;
 while @i < 10000
 begin
 exec test;
 SET @i= @i + 1;
 end

这就是我所得到的(试验1-3在SP中丢弃表,4-6不丢弃) enter image description here

如图所示,当我不删除临时表时,所有统计数据都相同或略有下降。

UPDATE2:

我第二次运行此测试但现在有100k调用并且还添加了SET NOCOUNT ON。这些是结果: enter image description here

第二次运行确认如果你不删除SP中的表,那么你实际上节省了一些用户时间,因为这是由一些其他内部进程完成的,但超出了用户时间。

2 个答案:

答案 0 :(得分:2)

您可以在这篇Paul White的文章中详细了解:Temporary Tables in Stored Procedures

  

创建和删除,不要

     

我将在下一篇文章中更详细地讨论这个问题,但是   关键点是CREATE TABLE和DROP TABLE不会创建和删除   存储过程中的临时表,如果临时对象可以   缓存。临时对象在DROP时重命名为内部表单   执行TABLE,并在重命名时重命名为相同的用户可见名称   下次执行时遇到CREATE TABLE。另外,任何   在临时表上自动创建的统计信息也是   缓存。这意味着前一次执行的统计数据仍然存在   下次调用该程序时。

答案 1 :(得分:0)

从技术上讲,在SPID关闭后,本地范围的临时表(前面有一个标签)会自动退出范围。有一些非常奇怪的情况,你得到一个临时表定义缓存在某处,然后没有真正的方法来删除它。通常,当您有一个嵌套的存储过程调用并且包含一个名称相同的临时表时会发生这种情况。

当你完成这些工作后,放弃你的桌子是个好习惯,但除非出现意外情况,否则一旦处理结束,它们应该被取消。