我已经遇到这个问题很多次了,但一直无法找到一个完全满足我的答案。通常,大多数人和书籍都会说:“虽然临时表在超出范围时被删除,但当它们不再需要时,应该显式地删除它们,以减少服务器上的资源需求”。
对我来说很清楚,在Management Studio中创建表时,您将使用该表的某些资源,直到关闭窗口或断开连接为止。因此,当表不再需要时删除表是合乎逻辑的。
但是,当您使用存储过程时,如果您想要清理表格,则最有可能在过程结束时执行(我不是在谈论您在过程中不再需要即删除表的情况)。因此,工作流程如下:
当您在存储过程中删除时:
- 开始执行存储过程
- 完成一些工作
- 删除表
- 执行结束
据我所知,如果不删除,它怎么可能正常工作:
- 开始执行存储过程
- 完成一些工作
- 执行结束
- 删除表
这里有什么区别? 我只能想象需要某些资源来识别临时表。 您有其他想法吗?
更新:
我进行了一个简单的测试,使用了两个存储过程:
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删除存储过程中的表,试验4-6不删除它):
正如图片所示,如果我不删除临时表,则所有统计数据都相同或略有下降。
更新2:
我进行了第二次测试,调用次数为100,000次,并添加了SET NOCOUNT ON。这些是结果:
正如第二次运行所证实的那样,如果您不在存储过程中删除表,则实际上可以节省一些用户时间,因为这是由用户时间之外的某个其他内部进程完成的。
DROP
语句可以很有用 - 但当在存储过程的上下文中运行时,它将自动清理(删除或缓存)。 - Martin SmithDROP
操作必须等待 drop/cache 操作完成 (尽管对于大表格可以进行延迟删除),而在隐式情况下,清理操作可以在过程执行完毕后进行... - Martin Smith