Как освободить память, используемую для анализа поля XML в SQL Server

#sql-server #xml #tsql #xml-parsing

#sql-сервер #xml #tsql #xml-синтаксический анализ

Вопрос:

Я открыл много больших XML-файлов, используя хранимую процедуру sp_xml_preparedocument , и я закрываю вкладку в SSMS без вызова sp_xml_removedocument для освобождения памяти.

В результате, теперь, когда я пытаюсь проанализировать другой XML, используя следующий код:

 EXEC sp_xml_preparedocument @idoc OUTPUT, @result
 

Я получаю эту ошибку:

XML-документ не удалось создать из-за нехватки памяти сервера. Используйте sp_xml_removedocument для выпуска XML-документов

Но поскольку я не сохранил дескрипторы, как я мог освободить память, хранящуюся в открытом XML-файле? Сеанс был закрыт, и я больше не могу получить доступ к дескриптору…

P.S. Я не могу поверить, что если вы вызовете sp_xml_preparedocument и забудете закрыть его с помощью sp_xml_removedocument , файл останется во внутреннем кэше навсегда. Это реально?

Комментарии:

1. Используйте select document_id from sys.dm_exec_xml_handles(@@SPID); для извлечения дескрипторов.

2. @HABO Спасибо! но я обнаружил, что даже если я использую 0 в качестве аргумента, он ничего не возвращает. Только когда я выполняю sp на той же вкладке, я могу восстановить открытый XML

3. Должен признать, что я понятия не имею об этом… Причина может заключаться в том, что этот подход устарел примерно на 15 лет… Поддержка XML была введена с версии 2000, и основные методы XQuery вступили в игру, я думаю, с версии 2005. С тех пор рекомендуемым подходом являются методы, предоставляемые собственным типом данных XML . Вы можете использовать цикл подсчета для вызова sp_xml_removedocument с любым номером… или перезагрузите систему, если это возможно.

4. забавный факт: я только что погуглил sql server, чтобы удалить XML-документы из памяти сервера . Первая запись относится к 2005 году и возвращает два предложения: цикл подсчета и перезапуск сервера 🙂

5. @Shnugo Благодарит вас за ваш ответ, сервер находится в рабочем состоянии, поэтому мы не можем его легко перезапустить. Решение цикла кажется практичным, хотя я думаю, что дескрипторы могут быть не уникальными для разных сеансов. В любом случае, я попробую это решение. Спасибо!

Ответ №1:

Похоже, что единственным решением этой проблемы является перезапуск сервера. Ошибка исчезла после перезагрузки.