Может ли хранимая процедура вызвать утечку памяти?


У нас есть коробка sql server 2008. На этом сервере у нас есть запланированное задание, которое вызывает большую хранимую процедуру, которая открывает xml-файлы и загружает их в таблицы.

После длительного периода времени работы SQL server потребляет буквально всю доступную память. (на самом деле файл подкачки почти съел все дисковое пространство)

Возможно ли для сохраненного proc утечка памяти? Возможна ли утечка памяти из пакета служб SSIS?

Заранее спасибо!!

1 2

1 ответ:

Да, утечка памяти возможна, если вы забудете позвонить sp_xml_removedocument (для каждого соответствия sp_xml_preparedocument):

Анализируемый документ хранится во внутреннем кэше SQL Server. То MSXML parser (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 для курсоров:

Локальные курсоры неявно освобождаются, когда хранимая процедура, триггер или пакет, в котором они были созданы, завершается, если только курсор был передан обратно в качестве параметра. Локальный курсор будет тогда быть неявно освобождается, когда параметр или переменная ссылаются курсор в коде, вызвавшем процедуру, выходит из области видимости. Ref .