У меня есть экземпляр SQL Server, чье использование памяти постепенно растет, пока Windows больше не даст его. Кажется логичным, что случайный большой результат запроса приведет к росту экземпляра.
Есть ли способ убедить 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) + ')'
memory
sql-server
BIBD
источник
источник
Другие постеры верны, что это сделано специально, но вы абсолютно хотите ограничить максимальный объем памяти чуть меньше, чем ОЗУ вашего сервера. Подумайте об этой последовательности событий:
Чтобы избежать этого, настройте максимальный лимит памяти сервера примерно на 80-90% от вашей физической памяти. Инструкции для SQL 2000 по адресу: http://msdn.microsoft.com/en-us/library/ms178067.aspx
источник
Он будет освобожден только в том случае, если ОС сообщит о том, что ей не хватает оперативной памяти, или если вы остановите и перезапустите службу; нужно ограничить максимальное количество, которое будет использовать SQL, настроив значение «max server memory». Если на сервере больше ничего не нужно для оперативной памяти (и, надеюсь, нет), я бы об этом не беспокоился.
источник
Итак, подведем итоги ответов:
Нет способа заставить MS SQL Server освободить память, в которой он не нуждается сразу. SQL Server должен автоматически освобождать память, когда это необходимо, но не раньше. И если у вас есть проблемы с памятью, вы должны уменьшить значение optin памяти «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), а затем пройти по связанному списку, чтобы освободить выделенные блоки
источник