【发布时间】:2011-04-06 16:02:32
【问题描述】:
假设我们有一些写得不好的 SQL,它们在完成后不会释放临时表,或者写得好的 SQL 在创建临时表之后被杀死,但 在它删除它们之前.
这是否会导致 SQL Server 实例占用大量内存而不释放它?我将如何回收这段记忆?
【问题讨论】:
标签: sql-server sql-server-2008
假设我们有一些写得不好的 SQL,它们在完成后不会释放临时表,或者写得好的 SQL 在创建临时表之后被杀死,但 在它删除它们之前.
这是否会导致 SQL Server 实例占用大量内存而不释放它?我将如何回收这段记忆?
【问题讨论】:
标签: sql-server sql-server-2008
一个临时表将在超出范围后被删除......我在这里谈论的是一个本地临时表而不是一个全局临时表(带有 2 磅符号)
SQL Server 总是会占用大量内存,它会尽可能多地将数据放入缓存中,从 RAM 获取数据比从磁盘获取数据快 1000 倍
在 SSMS 中运行它
CREATE TABLE #MyTemp(id INT)
GO
SELECT * FROM tempdb.sys.tables
WHERE name LIKE '#MyTemp%'
现在在 SSMS 中关闭该窗口
在另一个窗口中运行它
SELECT * FROM tempdb.sys.tables
WHERE name LIKE '#MyTemp%'
桌子还在吗?
如果表是在 proc 中创建的,则在 proc 完成时它不存在
CREATE PROCEDURE prtestTemp
AS
CREATE TABLE #temp(id INT)
SELECT * FROM tempdb.sys.tables
WHERE name LIKE '#Temp%'
GO
运行过程
EXEC prtestTemp
现在运行这个,表不存在
SELECT * FROM #temp
SELECT * FROM tempdb.sys.tables
WHERE name LIKE '#Temp%'
【讨论】:
## 表有任何想法吗?我知道文档是怎么说的 Global temporary tables are visible to any user and any connection after they are created, and are deleted when all users that are referencing the table disconnect from the instance of SQL Server. 但是当 I've tested this before 时这似乎是错误的
SELECT * FROM ##temp 并得到了这个..Msg 208, Level 16, State 0, Line 1 Invalid object name '##temp'. 不记得这个过去就是这样