【问题标题】:Can a stored procedure cause a memory leak?存储过程会导致内存泄漏吗?
【发布时间】:2012-11-04 17:27:07
【问题描述】:

我们有一个 sql server 2008 盒子。 在这台服务器上,我们有一个计划的作业,它调用一个打开 xml 文件并将它们加载到表中的大型存储过程。

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

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

提前致谢!!

【问题讨论】:

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


    【解决方案1】:

    是的,如果您忘记调用sp_xml_removedocument(对于每个匹配的sp_xml_preparedocument),可能会发生内存泄漏:

    已分析的文档存储在 SQL Server 的内部缓存中。这 MSXML 解析器 (Msxmlsql.dll) 使用八分之一的总可用内存 对于 SQL 服务器。为避免内存不足,请运行 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.

    【讨论】:

    • +1 米奇。有趣的。谢天谢地,我不必在 sql server 中处理太多的 xml。还推荐 Aaron Bertrand 的 SQL memory use by db and object query 来检查内存中的对象:mssqltips.com/sqlservertip/2393/…
    • 谢谢大家!原来这不是我们的存储过程,但这很有启发性。 SSIS 包呢?
    猜你喜欢
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-16
    • 2011-10-28
    相关资源
    最近更新 更多