Студия управления System.OutOfMemoryException

38

Я использую Microsoft SQL Server 2012 и пытаюсь выполнить простой запрос к нему в Management Studio. Я получаю следующую ошибку (в SSMS, работающей на сервере):

Произошла ошибка при выполнении пакета. Сообщение об ошибке: Исключение типа «System.OutOfMemoryException» было сгенерировано.

В системе установлено 24 ГБ ОЗУ, но в диспетчере задач процесс sqlservr.exe использует только 2,9 ГБ.

Есть ли где-то настройка, ограничивающая использование ОЗУ?

Пол Уайт говорит, что GoFundMonica
источник

Ответы:

39

Эта ошибка означает, что в Management Studio не хватает памяти, а не службы SQL Server. Даже если вы установили 64-битный SQL Server, исполняемый файл SQL Server Management Studio является 32-битным приложением.

Вероятно, это связано с размером набора результатов, который вы возвращаете в Management Studio. Вы выполняете что-то вроде SELECT * FROM действительно_big_table? См. Http://support.microsoft.com/kb/2874903 для получения дополнительной информации.

Майк Станкович
источник
19

Майк прав, что сообщение об ошибке вы получаете от самого приложения Management Studio, а не от SQL Server. Это память на вашей локальной рабочей станции, которая была исчерпана, вероятно, из-за попытки вытянуть 16 миллиардов строк в клиентское приложение (рендеринг такого количества данных в сетке довольно дорог с точки зрения памяти, поэтому постарайтесь ограничить свои запросы, используя TOPetc - Я не знаю, какие практические действия вы могли бы сделать с достаточным количеством данных, чтобы все равно использовать всю вашу локальную память).

Но я хочу решить еще одну проблему: использование диспетчера задач для оценки объема памяти, используемого SQL Server. Не делай этого; это наглый лжец Копирование из этого ответа (ваш вопрос двоякий, поэтому я не могу закрыть его как дубликат):


Вы НИКОГДА, НИКОГДА не могли доверять диспетчеру задач, чтобы сообщить вам, сколько памяти использует SQL Server. Прекратите использовать диспетчер задач для этого, точка. Используйте счетчик производительности - вы также можете запросить счетчик производительности, используя DMV:

SELECT object_name, cntr_value 
  FROM sys.dm_os_performance_counters
  WHERE counter_name = 'Total Server Memory (KB)';

Вы можете сохранить его как ярлык запроса в «Инструменты»> «Параметры»> «Среда»> «Клавиатура»> «Ярлыки запроса» и получить точные результаты в окне запроса гораздо быстрее, чем получать неточные результаты из диспетчера задач.

Вы также можете проверить давление памяти (и можете ли вы что-нибудь с этим сделать), используя эти запросы:

SELECT object_name, cntr_value
  FROM sys.dm_os_performance_counters
  WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_kb FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

EXEC sp_configure 'max server memory';
Аарон Бертран
источник
Вышеуказанные команды предназначены для новых версий SQL. Для серверов SQL 2008 R2 команды там немного отличаются. Я добавлю еще один пост в этот список для этих серверов, так как последующие комментарии не достаточно хорошо отформатированы, чтобы помещать их здесь
Дэвид Бридж
15

Это было то же самое со мной. Моя SQL Server Management Studio была открыта в течение нескольких дней. Я перезапустил его, и это было решено.

Барри Гувенькая
источник
9

Я обнаружил, что отключение IntelliSense помогло. Я также рекомендую проверить любые надстройки, которые у вас есть (такие вещи, как инструменты RedGate и ApexSQL также усугубили проблему для меня).

Эта проблема мучила меня уже несколько дней, и, честно говоря, она довольно слабая из Microsoft. Они должны иметь 64-битные наборы инструментов, поскольку в наши дни мы имеем дело с большими данными, 64-битными серверами и рабочими средами.

Тахир Халид
источник
1
В моем случае RedGate SQL Prompt боролся с SSMS, встроенной в intellisense. Отключение IntelliSense для SSMS также значительно улучшило работу SQL Prompt.
TTT
1

Для SQL 2008 R2 команды запроса памяти (из поста Аарона Бертранда) следующие

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Total Server Memory (KB)';

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

Также обратите внимание, что команда

EXEC sp_configure 'max server memory';

может не работать, если не включены расширенные параметры. например, сделай это первым

EXEC sp_configure 'show advanced options',1
RECONFIGURE
Дэвид Бридж
источник
1

Обратите внимание, что существует проблема с подключением Microsoft, связанная с утечкой памяти SSMS. Они думают, что решили это в 16.5

Смотрите проблему на Connect.microsoft.com, нажав здесь

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

SSMS v16.5 здесь

Проблема с подключением, указывающая на утечку памяти, исправлена ​​в 16.5 здесь

Дэвид Бридж
источник