2

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

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

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

提前致谢!!

4

1 回答 1

7

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

已分析的文档存储在 SQL Server 的内部缓存中。MSXML 解析器 (Msxmlsql.dll) 使用 SQL Server 可用总内存的八分之一。为避免内存不足,请运行 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

另一种形式的内存泄漏是忘记关闭释放游标

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

    ....

CLOSE c; 
DEALLOCATE c;

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

只是为了记录,即使我总是喜欢看到一个明确的CLOSEDEALLOCATE用于游标:

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

于 2012-11-16T01:13:30.027 回答