存储过程会导致内存泄漏吗?

Posted

技术标签:

【中文标题】存储过程会导致内存泄漏吗?【英文标题】:Can a stored procedure cause a memory leak? 【发布时间】:2012-11-04 17:27:07 【问题描述】:

我们有一个 sql server 2008 盒子。 在这台服务器上,我们有一个计划的作业,它调用一个打开 xml 文件并将它们加载到表中的大型存储过程。

经过一段较​​长的正常运行时间后,SQL 服务器实际上会消耗所有可用内存。 (实际上页面文件几乎占用了所有磁盘空间)

存储过程是否有可能泄漏内存? SSIS 包是否有可能泄漏内存?

提前致谢!!

【问题讨论】:

【参考方案1】:

是的,如果您忘记调用sp_xml_removedocument(对于每个匹配的sp_xml_preparedocument),可能会发生内存泄漏:

已分析的文档存储在 SQL Server 的内部缓存中。这 MSXML 解析器 (Msxmlsql.dll) 使用八分之一的总可用内存 对于 SQL 服务器。为避免内存不足,请运行 sp_xml_removedocument 释放内存。

示例用法:

DECLARE @xml_text VARCHAR(4000), @i INT

SELECT @xml_text = '<root>
                      ... some valid xml ... 
                    </root>'

EXEC sp_xml_preparedocument @i OUTPUT, @xml_text

....

EXEC sp_xml_removedocument @i

另一种形式的内存泄漏是忘记关闭和释放cursor:

DECLARE c CURSOR   
  LOCAL STATIC FORWARD_ONLY READ_ONLY   
  FOR SELECT ...

    ....

CLOSE c; 
DEALLOCATE c;

[注意:我很少使用游标。在可能和适当的情况下,我总是尝试以基于集合的方式进行]

仅作记录,尽管我总是希望看到明确的 CLOSEDEALLOCATE 用于游标:

LOCAL 游标在存储过程中被隐式释放, 触发器或创建它们的批处理终止,除非 游标已作为参数传回。 LOCAL 光标将 当参数或变量引用时被隐式释放 调用该过程的代码中的光标超出范围。 Ref.

【讨论】:

+1 米奇。有趣的。谢天谢地,我不必在 sql server 中处理太多的 xml。还推荐 Aaron Bertrand 的 SQL memory use by db and object query 来检查内存中的对象:mssqltips.com/sqlservertip/2393/… 谢谢大家!原来这不是我们的存储过程,但这很有启发性。 SSIS 包呢?

以上是关于存储过程会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

自动释放的 NSArray 会导致内存泄漏吗?

内存泄漏会导致我的进程被杀死吗?

Flutter - 关闭小部件时 BLoC 流实例会导致内存泄漏吗?

这样的存储过程会导致死锁吗?

通过 callproc 调用存储过程会导致缓存膨胀吗?

为啥lua语言中使用全局变量就会造成内存泄漏