Как освободить память, используемую бездействующими базами данных SQL Server?

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

Каков правильный способ освобождения памяти, используемой бездействующими базами данных, без снятия службы SQL? Мы хотели бы автоматизировать разгрузку любой базы данных, к которой не было доступа за последние 30 минут.

Примечание. Я ищу решение, которое применяется к SQL 2005. Однако, если в SQL 2008 есть функция, чтобы сделать это, я хотел бы узнать об этом.

Ответы

Ответ 1

SQL Server автоматически освободит всю память, которая может быть освобождена, и будет избегать пейджинга. Если вы столкнулись с поисковым вызовом, тогда используется 99% -ная память, недоступная для освобождения. Вам нужно исследовать, как используется память, вероятно, внешние компоненты, такие как созданный объект sp_oa_xxx или распределенные запросы. Начните с изучения потребителей памяти, посмотрите sys.dm_os_memory_clerks и прочитайте на Как использовать команду DBCC MEMORYSTATUS для мониторинга использования памяти на SQL Server 2005.

В качестве дополнительной заметки у вас уже есть средства для автоматического закрытия баз данных, которые не используются: alter database <dbname> set auto_close on:

AUTO_CLOSE: Когда установлено значение ON, база данных закрывается чисто и ее ресурсы освобождаются после последнего пользовательские выходы. База данных автоматически снова открывается, когда пользователь пытается использовать базы данных снова.

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

Ответ 2

Чтобы начать, я бы предложил изучить:

DBCC FREEPROCCACHE

и

DBCC DROPCLEANBUFFERS

Они не зависят от базы данных, но они могут заменить ваш ночной перезапуск.

Для конкретной команды базы данных вы можете создать CHECKPOINT, который заставит любые грязные страницы на диск, но он применим только к записи.

В SQL Server 2008 (и R2) Enterprise Edition вы можете использовать Resource Governor для разбиения памяти на пулы и выделения большей части критическим базам данных, что позволяет более детально контролировать процессор и память. Для этого необходимо провести тщательное планирование и тестирование.

Ответ 3

Попробуйте следующее:

ALTER DATABASE blah SET AUTO_CLOSE ON;

Этот параметр (который обычно не рекомендуется для производства) может быть подходящим для вашего случая. Этот параметр будет работать в SQL Server 2005 и 2008.

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/bb522682.aspx

Ответ 4

Для MSSQL 2012; сначала запустите

EXEC sys.sp_configure N'max server memory (MB)', N'256'
GO
RECONFIGURE WITH OVERRIDE
GO

затем проверьте, что диспетчер задач видит, что память меньше 256 МБ (или выше, как вы установили выше)

Затем запустите это (замените 2048 на MB, который вы хотите назначить регулярно):

EXEC sys.sp_configure N'max server memory (MB)', N'2048'
GO
RECONFIGURE WITH OVERRIDE
GO

Ответ 5

У меня была такая проблема раньше, и я нашел решение для этой проблемы, вы можете создать хранимую процедуру, как описано ниже: перед запуском приложения вы должны вызвать эту хранимую процедуру в режиме 1, потому что вам нужно достаточно памяти

Для операций SQL и перед закрытием приложения вы должны снова вызвать эту хранимую процедуру в режиме 0

Create Proc [dbo].[MP_Rpt_ConfigureMemory]
    (@Mode bit)
as
    declare @RAM as integer
    declare @MAX as integer
    declare @MIN as integer

    set @RAM = (SELECT
                   [physical_memory_in_bytes]/1048576 AS [RAM (MB)]
                FROM [sys].[dm_os_sys_info])

    Set @MAX = ((@RAM / 4) * 3) 
    Set @MIN = ((@RAM / 4) * 1) 

    if @Mode = 0
    begin
         exec SP_Configure 'min server memory', 1
         RECONFIGURE

         exec SP_Configure 'max server memory', 100
         RECONFIGURE
    end
    else
       if @Mode = 1
       begin
           exec SP_Configure 'max server memory', @MAX
           RECONFIGURE
           exec SP_Configure 'min server memory', @MIN
           RECONFIGURE
       end