我们有一个 sql server 2008 盒子。在这台服务器上,我们有一个计划的作业,它调用一个打开 xml 文件并将它们加载到表中的大型存储过程。
经过一段较长的正常运行时间后,SQL 服务器实际上会消耗所有可用内存。(实际上页面文件几乎吃掉了所有的磁盘空间)
存储过程是否有可能泄漏内存?SSIS 包是否有可能泄漏内存?
提前致谢!!
我们有一个 sql server 2008 盒子。在这台服务器上,我们有一个计划的作业,它调用一个打开 xml 文件并将它们加载到表中的大型存储过程。
经过一段较长的正常运行时间后,SQL 服务器实际上会消耗所有可用内存。(实际上页面文件几乎吃掉了所有的磁盘空间)
存储过程是否有可能泄漏内存?SSIS 包是否有可能泄漏内存?
提前致谢!!
是的,如果您忘记调用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;
[注意:我很少使用游标。在可能和适当的情况下,我总是尝试以基于集合的方式进行]
只是为了记录,即使我总是喜欢看到一个明确的CLOSE
和DEALLOCATE
用于游标:
LOCAL 游标在创建它们的存储过程、触发器或批处理终止时被隐式释放,除非游标已作为参数传回。当调用过程的代码中引用游标的参数或变量超出范围时,将隐式释放 LOCAL 游标。 参考。