存储过程是否会导致内存泄漏?

Jam*_*orz 2 sql-server memory-leaks stored-procedures scheduled-tasks

我们有一个sql server 2008盒子.在此服务器上,我们有一个调度作业,它调用一个大型存储过程来打开xml文件并将它们加载到表中.

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

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

提前致谢!!

Mit*_*eat 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
Run Code Online (Sandbox Code Playgroud)

内存泄漏的另一种形式是忘记两者紧密和解除分配一个光标:

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

    ....

CLOSE c; 
DEALLOCATE c;
Run Code Online (Sandbox Code Playgroud)

[注意:我很少使用游标.在任何可能和适当的地方,我总是尝试以基于集合的方式做到这一点]

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

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