Jam*_*orz 2 sql-server memory-leaks stored-procedures scheduled-tasks
我们有一个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
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)
[注意:我很少使用游标.在任何可能和适当的地方,我总是尝试以基于集合的方式做到这一点]
只是为了记录,即使我总是喜欢看到明确的CLOSE和DEALLOCATE游标:
除非光标已被传递回作为参数时存储的过程,触发器或批处理中创建它们终止LOCAL游标隐式释放.当引用调用过程的代码中的游标的参数或变量超出范围时,将隐式释放LOCAL游标. 参考.
| 归档时间: |
|
| 查看次数: |
3132 次 |
| 最近记录: |