Назад | Перейти на главную страницу

Восстановление памяти из SQL Server

У меня есть экземпляр SQL Server, использование памяти которого постепенно растет, пока окна не перестанут его предоставлять. Кажется логичным, что случайный результат большого запроса может вызвать рост экземпляра.

Есть ли способ убедить SQL Server освободить память, которая ему больше не нужна (кроме перезапуска службы)?

Редактировать:
Я использую SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)

Я смог выяснить это с помощью следующего запроса:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

Именно так устроен SQL Server. предполагаемый работать.

Если у вас есть другие службы на этом компьютере и вы не хотите, чтобы SQL занимал всю доступную память, вам нужно будет установить максимальный объем памяти сервера. Видеть Параметры памяти SQL Server в MSDN.

Другие плакаты верны, что это сделано намеренно, но вы абсолютно хотите ограничить максимальный объем памяти немного меньше, чем объем оперативной памяти вашего сервера. Подумайте об этой последовательности событий:

  • SQL 2000 работает нормально, потребляя всю оперативную память вашего сервера.
  • У кого-то есть RDP, или вам нужно запустить IE, чтобы загрузить патч, или ваши резервные копии начнутся, что угодно
  • SQL должен освободить и освободить достаточно памяти для работы ОС
  • Производительность отстой, пока освобождается память и выполняется подкачка на диск
  • Дела идут достаточно хорошо, когда все стабильно
  • Другая операция завершается, и SQL постепенно восстанавливает освобожденную оперативную память.
  • Повторение

Чтобы избежать этого, настройте максимальный предел памяти сервера примерно на 80-90% от вашей реальной физической памяти. Инструкции для SQL 2000 по адресу: http://msdn.microsoft.com/en-us/library/ms178067.aspx

Он освободит его только в том случае, если ОС сообщит о нехватке оперативной памяти или если вы остановите и перезапустите службу; нужно ограничить максимальное количество, которое SQL будет использовать, настроив значение «max server memory». Если на сервере больше нет ничего, что требует ОЗУ (а, надеюсь, ее нет), я бы не стал об этом беспокоиться.

Итак, подведем итоги ответов:

Невозможно заставить MS SQL Server освободить память, которая ему не нужна. SQL Server должен автоматически освобождать память, когда это необходимо, но не раньше. И если у вас есть проблемы с памятью, вам следует уменьшить значение параметра памяти "max server memory".

SQL Server будет потреблять память и не возвращать ее, если операционная система не сообщит ему о нехватке памяти. Как указал Портман, это сделано намеренно, и если вы хотите ограничить потребление памяти, вам необходимо установить максимальную память сервера, которую будет использовать SQL Server.

Помните, что поведение, которое вы все описываете, относится к SQL Server 2005 и позже, когда диспетчер памяти был переписан, чтобы (среди прочего) отвечать на запросы нагрузки на память от ОС.

Для SQL Server 2000 и более ранних версий, захватив память, он не вернет ее, как бы ОС ни кричала об этом.

CodeSlave - вы используете 2000, 2005 или 2008?

Старый вопрос, я знаю, но способ заставить (по крайней мере, более новый) SQL освободить память - это написать приложение, выделяющее как можно больше памяти кусками, ожидая (скажем) 15 секунд (например, Sleep (15000)) и освобождение выделенной памяти и выход; Я попробовал это, и SQL действительно освобождает память, чтобы система вернула свою оперативную память; написание кода, подобного приведенному выше, с использованием C / C ++ почти тривиально, просто вопрос настройки цепочки элементов для хранения цепочки блоков памяти (указатель и размер), постепенное уменьшение размера при сбое "malloc ()", пока не достигнет минимум (скажем, менее 1024), а затем просмотрите связанный список, чтобы освободить выделенные блоки