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

10

У меня есть экземпляр 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) + ')'
BIBD
источник

Ответы:

19

Именно так должен работать SQL Server .

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

Портман
источник
1
Звучит скорее как ошибка, чем как функция ... это происходит со мной. SQL Server занимает 95% доступной оперативной памяти, чтобы что-то сделать, и не может освободить ее, когда она будет завершена.
Алхимия
1
@Alchemical Зависит от того, что вы подразумеваете под « завершенным ». SQL Server может использовать всю оперативную память на компьютере; используя его как дисковый кеш. Он не « завершает » использование его в качестве дискового кэша, пока вы не закончили использовать SQL Server.
Ян Бойд
8

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

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

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

ш-бета
источник
Помните, что это поведение 2005 и 2008 - 2000 не освобождает память по требованию к ОС.
Пол Рэндал
2
Не совсем по требованию, но он возвращает память обратно в ОС. По ссылке, которую я разместил: «Когда SQL Server использует память динамически, он периодически запрашивает у системы объем свободной физической памяти. В Microsoft Windows 2000 SQL Server увеличивает или уменьшает буферный кэш, чтобы оставить свободную физическую память между 4 МБ и 10 МБ в зависимости от активности сервера. Сохранение этой свободной памяти предотвращает подкачку Windows 2000. Если памяти недостаточно, SQL Server освобождает память для Windows 2000. Если памяти больше, SQL Server выделяет память для пула буферов ».
sh-beta
Ах, правда, это помогает избавиться от физической памяти - вы правы!
Пол Рэндал
4

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

SqlACID
источник
4

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

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

BIBD
источник
3

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

К. Брайан Келли
источник
2

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

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

CodeSlave - вы работаете в 2000, 2005 или 2008 году?

Пол Рэндал
источник
Ах, ха ... да, действительно, SQL 2000.
BIBD
3
Он не возвращает его, когда ОС кричит об этом, но он возвращает его, если видит, что ОС находится ниже определенного порога для свободной физической памяти. См. Msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta
И чтобы подкрепить сказанное sh-бета, SQL Server 2000 освобождает память только тогда, когда он замечает, что в ОС недостаточно физической памяти, поскольку только в Windows XP (2001) Windows добавила API, позволяющий « кричать ОС». это "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005 использует эту новую функцию Windows. Но когда был написан SQL Server 2000, ОС не могла кричать об этом, заставляя SQL Server периодически проверять нехватку памяти.
Ян Бойд
0

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

Прохожий
источник