存储过程结束时显式删除本地临时表有什么好处吗?

18

考虑以下伪 T-SQL 代码(由存储过程执行):

CREATE TABLE #localTable ...

<do something with the temporary table here>

DROP TABLE #localTable;

DROP TABLE语句是存储过程执行的最后一个语句 - 它有什么好处吗?请注意,我不是在询问在存储过程中间(即在表不再需要但存储过程代码结束之前)删除临时表(本地或非本地) - 这似乎会由于减少继续执行存储过程所需的内存而产生重要的好处。我想知道明确删除表与在存储过程完成执行时“让”SQL Server这样做之间是否有任何好处(或任何实际上的积极或消极影响)。

3个回答

8

这里有一篇详细的文章,点击这里

当执行 DROP TABLE 时,临时对象会被重命名为内部形式,并在下次执行时遇到 CREATE TABLE 时重新命名回相同的用户可见名称。此外,任何自动创建在临时表上的统计信息也会被缓存。这意味着,当下次调用该过程时,之前执行的统计数据将保留。


那篇由Paul White撰写的帖子非常棒! - Kenny Evitt
哇,那篇文章真是太棒了,我从未想到临时表会以那种方式被缓存,而我已经编写 SQL 代码将近三年了。 - ConstantineK

7

这样做不会有害,但当连接断开时,表格将被删除。我个人认为这是一个好习惯。这也让那些可能需要在此上工作的开发人员知道,你并没有简单地忘记这样做。


存储过程完成时,表不会被删除? - Kenny Evitt
1
@Kenny - 我认为临时表是与连接相关联的。因此,当连接断开时,临时表也会被删除。 - Randy Minder
5
只有在顶层作用域创建时才需要手动清除表格变量。如果在子作用域中创建(比如过程调用),变量会在该作用域退出时自动清除。对于过程,如果表格没有被缓存,清理将会被删除,否则按照rageit的答案进行。 - Martin Smith

0
删除临时表是一个好习惯,否则会在我们的操作后占用 TEMP DB 中的空间。
这将导致空间问题。只有在收缩 TEMP DB 或重新启动服务器后才能清除此问题。

2
但是在存储过程中创建的临时表会在存储过程执行完成并关闭相关连接时自动删除。删除在存储过程中创建的临时表只应影响回收其使用的任何空间的时间,而在大多数情况下,可能影响不大。 - Kenny Evitt
但是连接已正确关闭,那么呢? - Samith C Valsalan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接