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

时间:2012-11-16 01:09:06

标签: sql-server stored-procedures memory-leaks scheduled-tasks

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

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

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

提前致谢!!

1 个答案:

答案 0 :(得分: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

另一种形式的内存泄漏是忘记两者关闭并解除分配cursor

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

    ....

CLOSE c; 
DEALLOCATE c;

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

仅仅是为了记录,即使我总是希望看到明确的CLOSEDEALLOCATE游标:

  

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