我们有一个sql server 2008框。 在此服务器上,我们有一个调度作业,它调用一个大型存储过程来打开xml文件并将它们加载到表中。
经过一段长时间的运行后,SQL服务器会消耗所有可用内存。 (实际上页面文件几乎占用了所有光盘空间)
存储过程是否可能泄漏内存? SSIS包是否可能泄漏内存?
提前致谢!!
答案 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;
[注意:我很少使用游标。在任何可能和适当的地方,我总是尝试以基于集合的方式做到这一点]
仅仅是为了记录,即使我总是希望看到明确的CLOSE
和DEALLOCATE
游标:
当存储过程隐式释放LOCAL游标时, 触发器或创建它们的批处理终止,除非 游标已作为参数传回。然后LOCAL光标 在参数或变量引用时隐式释放 调用该过程的代码中的游标超出范围。 Ref