存储过程会导致内存泄漏吗?
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;
[注意:我很少使用游标。在可能和适当的情况下,我总是尝试以基于集合的方式进行]
仅作记录,尽管我总是希望看到明确的 CLOSE
和 DEALLOCATE
用于游标:
LOCAL 游标在存储过程中被隐式释放, 触发器或创建它们的批处理终止,除非 游标已作为参数传回。 LOCAL 光标将 当参数或变量引用时被隐式释放 调用该过程的代码中的光标超出范围。 Ref.
【讨论】:
+1 米奇。有趣的。谢天谢地,我不必在 sql server 中处理太多的 xml。还推荐 Aaron Bertrand 的 SQL memory use by db and object query 来检查内存中的对象:mssqltips.com/sqlservertip/2393/… 谢谢大家!原来这不是我们的存储过程,但这很有启发性。 SSIS 包呢?以上是关于存储过程会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章