SQL Server System.OutOfMemoryException

Я генерирую XML из 60 таблиц и сохраняю этот XML в таблице.

Table Name : Final_XML_Table

PK   FK    XML_Content (type xml)
1     1     "XML that I am generating from 60 tables"

Когда я запускаю запрос ниже, он дает исключение памяти:

Select * from Final_XML_Table

Вещи, которые я пробовал: 1. Результаты в текст: я получаю только несколько строк из XML в виде текста в окне вывода. 2. Результаты в файл: я получаю только несколько строк из XML в файле.

Пожалуйста, предложите, а также, если есть какие-либо изменения, придется ли мне делать это на сервере SQL во время развертывания.

Я также установил XML_Data на неограниченный:

SQL Server System.OutOfMemoryException

Попробуйте выполнить запрос щелкните правой кнопкой мыши, выберите «параметры» из контекстного меню и откройте область «сетки» в «результатах». Есть опция для данных XML. Вы можете установить это значение на «без ограничений». Это будет использовать всю память, которая может быть обработана. Значение по умолчанию может быть маленьким для вашего XML ...

Shnugo 08.08.2018 12:31

Я установил XML_DATA как неограниченный. все же он дает ту же ошибку

user7739833 08.08.2018 13:06

вы перезапускали SSMS?

Shnugo 08.08.2018 13:31

Да, но не повезло :( ... такая же ошибка

user7739833 08.08.2018 14:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
3 340
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Эта ошибка не является ошибкой SQL Server, это ошибка SSMS. Это означает, что SSMS не хватает памяти.

SSMS - это только 32-битное приложение, поэтому может адресовать только 2 ГБ ОЗУ. Если он попытается адресовать большее количество адресов, возникнет ошибка. если вы открыли SSMS и вернули очень большие наборы данных, эта оперативная память будет израсходована.

Честно говоря, если вы выполняете такой запрос, как SELECT * FROM Final_XML_Table, то я рискну предположить, что набор данных огромен. Добавьте предложение WHERE или не возвращайте набор данных на экран. если вам действительно нужно просмотреть данные (все), экспортируйте их во что-нибудь другое. Но я очень сомневаюсь, что вам нужно смотреть на строку каждый, если вы возвращаете около 2 ГБ данных.

table имеет только 1 запись и содержит xml, который содержит около 58 тыс. строк кода.

user7739833 08.08.2018 11:49

@JFI, если вы выполняли другие запросы, это также увеличило бы объем оперативной памяти, которую использует SSMS (поскольку иногда у нее есть привычка не выпускать ее). Хотя 58К строк сами по себе ничего не значат. Если бы в каждой строке было всего 1-10 символов, она не была бы такой большой, но если бы каждая имела 500-1000 (пробел (' ') тоже считается символом), то размер значительно больше. Точно так же, как таблица с 1 строкой и 1 столбцом, которая представляет собой nvarchar(MAX), которая заполнена до отказа, намного больше, чем таблица с 8 столбцами типа данных bit с 80 миллионами строк. (Первый составляет 2 ГБ, а другой ~ 80 МБ)

Larnu 08.08.2018 11:57

У меня есть файл xml размером 3 МБ, я вставил данные этого xml в 60 таблиц, и теперь я повторно генерирую xml из таблицы, я правильно сгенерировал 59 таблиц xml, и когда я создаю окончательную таблицу, которая содержит полный xml, как ожидалось , это выдает ошибку. Таким образом, ожидаемый размер xml составляет 3 МБ, который вставляется в таблицу в столбце типа xml.

user7739833 08.08.2018 12:24
Ответ принят как подходящий

Это не ответ, но за комментарий ...

Тот факт, что вы можете хранить XML, ясно показывает, что XML не является к большому для базы данных.

Тот факт, что вы получаете исключение недостаточно памяти с Select * from Final_XML_Table, ясно показывает, что SSMS имеет проблему при чтении / отображении вашего XML.

Вы можете попробовать проверить длину, как здесь:

DECLARE @tbl TABLE (x XML);
INSERT INTO @tbl VALUES('<root><test>blah</test><test /><test2><x/></test2></root>');

SELECT * FROM @tbl;              --This does not work for you
SELECT DATALENGTH(x) FROM @tbl;  --This returns just "82" in this case

Возможно, из-за логической ошибки при создании вашего XML (неправильное соединение?) XML содержит несколько / повторяющихся элементов. Вы можете попробовать запрос, подобный этому, чтобы получить количество узлов, чтобы проверить, реалистично ли это число:

SELECT x.value('count(//*)','int') FROM @tbl

В приведенном выше примере возвращается "5".

Вы можете сделать то же самое с исходным XML.

С помощью запроса, подобного следующему, вы можете получить все имена узлов первого уровня, второго уровня и так далее. Вы можете проверить, все ли в порядке:

SELECT firstLevel.value('local-name(.)','varchar(max)') AS l1_node
      ,SecondLevel.value('local-name(.)','varchar(max)') AS l2_node
      --add more
FROM @tbl
OUTER APPLY x.nodes('/*') AS A(firstLevel)
OUTER APPLY A.firstLevel.nodes('*') AS B(SecondLevel)
--add more

И, конечно же, вы можете открыть ResourceMonitor, чтобы посмотреть на фактическое использование памяти ...

Вернитесь с подробностями ...

большое спасибо .... datalength - 37708889 Count - 928720 Я видел до 11 уровня, он выглядит хорошо, и до 11 уровня он дает около 710145 записей.

user7739833 09.08.2018 07:09

1-й и второй уровень точно такие же, как я ожидал.

user7739833 09.08.2018 07:10

@JFI Тот факт, что мои утверждения работают, ясно показывает: SSMS может иметь дело с большим XML, как это делает SQL Server, но он не может отображать этот размер, поскольку он ограничен 32-битными адресами.

Shnugo 09.08.2018 14:33

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

user7739833 09.08.2018 16:50

@JFI Вы проверяли DATALENGTH оригинала?

Shnugo 09.08.2018 16:55

Другие вопросы по теме