【发布时间】:2018-03-01 02:20:31
【问题描述】:
我多次看到这个问题,但我无法得到令我满意的答案。基本上人们和书籍所说的是“虽然临时表在超出范围时会被删除,但您应该在不再需要它们时显式删除它们以减少服务器上的资源需求”。
我很清楚,当您在管理工作室工作并创建表时,在您关闭窗口或断开连接之前,您将为该表使用一些资源,从逻辑上讲,最好删除它们。
但是当您使用过程时,如果您想清理表格,很可能您会在它的真正结束时这样做(我不是在谈论当您真的不需要时立即丢弃表格的情况程序中的那个)。所以工作流程是这样的:
当你加入 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 不丢弃)
如图所示,当我不删除临时表时,所有统计数据都相同或略有下降。
更新2:
我第二次运行此测试,但现在调用了 100k,并且还添加了 SET NOCOUNT ON。这些是结果:
第二次运行确认,如果您不在 SP 中删除表,那么您实际上节省了一些用户时间,因为这是由其他一些内部进程完成的,但在用户时间之外。
【问题讨论】:
-
你考虑过表变量吗? odetocode.com/articles/365.aspx有了这些你就不用担心丢了
-
你也不需要需要来删除临时表。在正常情况下,两者都被取消范围(尽管临时表在语句级别,而临时表与当前 SPID 相关联)。不过,表变量还有其他一整套利弊清单。
-
我的问题不是关于“打扰”,我的问题是关于将它们放入 SP 的好处,正如 MSDN 和其他书籍所建议的那样。 @user193655 我说的是#temp 表
-
我从未见过有人建议在存储过程中显式删除它们。你有链接到 MSDN 上建议的位置吗?
-
您的测试结果很有意义 - 显式
DROP必须等待删除/缓存操作完成。 (尽管大型表可能会发生延迟删除)而在隐式情况下,proc 完成执行后可能会发生清理......
标签: sql-server stored-procedures temp-tables