Подтвердить что ты не робот

SQL Server не освобождает память после выполнения запроса

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

Я заметил это, потому что несколько дней назад я анализировал запрос, занимающий много места tempdb. Когда я использовал для запуска запроса, он (по окончании выполнения) потреблял до 25 ГБ ОЗУ. Это 25 ГБ ОЗУ не будет выпущено, если я не перезапустил службу MSSQLSERVER.

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

Я также хотел бы услышать, если вы сделаете что-то конкретное, чтобы очистить память, используемую одним запросом.

Спасибо заранее!

4b9b3361

Ответ 1

SQL Server действительно предназначен для запроса как можно большего количества ОЗУ, которое не будет выпущено, если эта операционная система явно не требуется. Я думаю, что лучший подход - ограничить объем оперативной памяти, который может использовать сервер, который позволит ОС иметь определенное количество ресурсов для использования без каких-либо проблем. Чтобы установить это Как настроить параметры памяти с помощью SQL Server Management Studio:

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

  • В проводнике объектов щелкните правой кнопкой мыши сервер и выберите Свойства.
  • Нажмите Память node.
  • В разделе Параметры памяти сервера введите сумму, которая требуется для Минимальная память сервера и Максимальная память сервера.

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

exec sp_configure 'max server memory', 1024
reconfigure

Чтобы ограничить потребление до 1 ГБ.

Примечание. Вышеупомянутое не ограничивает все аспекты SQL Server этим объемом памяти. Это управляет только пулом буферов и кешем плана выполнения. Такие настройки, как CLR, Full Text, фактическая память, используемая файлами SQL Server.exe, SQL Agent, расширенными хранимыми процедурами и т.д., Не регулируются этим параметром. Однако этим другим вещам, как правило, не требуется столько памяти, это пул буферов и кэш плана выполнения, которым нужна основная часть памяти.

Надеюсь, это поможет.

Ответ 2

Я тоже столкнулся с той же проблемой, о которой говорилось выше. Но работающий ниже запрос при освобождении RAM-памяти, но менее чем за 5 часов RAM-память становится занятой. Поэтому снова я должен принудительно освободить оперативную память.

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’2048'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

Затем выполните следующие действия:

2.

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’6144'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

Ответ 3

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

sp_configure 'max server memory', <memory_size MB>
reconfigure

MSDN

Ответ 4

Старый вопрос, но решил, что я добавлю свои два цента. В основном рифф на том, что было в приведенном выше ответе, используя dsql для автоматического возврата к предыдущему значению после сокращения объема памяти. Это уродливо, но оно работает.

IF OBJECT_ID(N'tempdb..##globaltemp') IS NOT NULL
BEGIN
    DROP TABLE ##globaltemp
END

SELECT TOP 1 value
INTO ##globaltemp
FROM sys.configurations
WHERE NAME LIKE '%server memory%'
ORDER BY NAME
OPTION (RECOMPILE);

EXEC sys.sp_configure N'max server memory (MB)'
    , N'1024'
GO

RECONFIGURE
WITH OVERRIDE
GO

DECLARE @dsql AS VARCHAR(20)

SELECT @dsql = cast(value AS NVARCHAR(20))
FROM ##globaltemp

EXEC sys.sp_configure N'max server memory (MB)'
    , @dsql
GO

RECONFIGURE
WITH OVERRIDE
GO

Ответ 5

SQL - это декларативный язык высокого уровня. Он не предназначен для того, чтобы вы могли участвовать в деталях таких вещей, как управление памятью, как если бы вы писали код на более низком уровне программирования, например, C. Я думаю, вы обнаружите, что если ему нужна эта память, для другой задачи он быстро отпустит ее.