【问题标题】:Can un-dropped temp tables cause run away memory consumption in SQL Server?未删除的临时表会导致 SQL Server 中的内存消耗失控吗?
【发布时间】:2011-04-06 16:02:32
【问题描述】:

假设我们有一些写得不好的 SQL,它们在完成后不会释放临时表,或者写得好的 SQL 在创建临时表之后被杀死,但 它删除它们之前.

这是否会导致 SQL Server 实例占用大量内存而不释放它?我将如何回收这段记忆?

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    一个临时表将在超出范围后被删除......我在这里谈论的是一个本地临时表而不是一个全局临时表(带有 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 时这似乎是错误的
    • AFAIK(我并没有真正使用全局临时表)它们将一直存在,直到您重新启动或表被删除
    • Martin,我刚刚测试过,我在一个窗口中创建了一个##temp 表,关闭窗口,打开另一个窗口,做了SELECT * FROM ##temp 并得到了这个..Msg 208, Level 16, State 0, Line 1 Invalid object name '##temp'. 不记得这个过去就是这样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2016-08-15
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多