Почему SQL Server 2012 Express использует 9,5 ГБ ОЗУ на моем сервере?

22

Я создаю приложение, в которое планирую встроить SQL Server 2012 Express в качестве основного хранилища данных. При тестировании на моей машине для разработки (Win7-32 ​​с 3 ГБ ОЗУ) я никогда не наблюдал, чтобы sqlservr.exeпроцесс использовал более 1 ГБ ОЗУ, как и следовало ожидать от опубликованных ограничений аппаратного масштабирования для редакции SQL Server Express.

Затем я переместил свое приложение на компьютер серверного уровня (64-разрядный Win Server 2008R2 с 16 ГБ ОЗУ), чтобы оценить его производительность, и с удивлением обнаружил, что sqlservr.exeпроцесс быстро расширился до примерно 9,5 ГБ ОЗУ и остался там.

Я перезапустил его пару раз, чтобы посмотреть, окажет ли это какое-либо влияние, но каждый раз процесс быстро возвращался к ~ 9,5 ГБ. Теперь я, конечно, рад, что SQL Server Express использует мою оперативную память, но я хотел бы знать, является ли это ожидаемым поведением, чтобы я не стал полагаться на уровни производительности, основанные на неправильном использовании оперативной памяти.

К вашему сведению, версия SQL Server на моем сервере, в соответствии с SELECT @@VERSION:

Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
    Oct 19 2012 13:38:57 
    Copyright (c) Microsoft Corporation
    Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Мой номер 9,5 ГБ пришел из номера «Частный рабочий набор» в диспетчере задач. Первая таблица выходных данных DBCC memorystatus(хотя и на теперь простаивающем сервере) приведена ниже:

PROCESS/SYSTEM COUNTS
Available Physical Memory   5543616512
Available Virtual Memory    8734902411264
Available Paging File       22471094272
Working Set                 9664200704
Percent of Committed Memory in WS   99
Page Faults                 2627510
System physical memory high 1
System physical memory low  0
Process physical memory low 0
Process virtual memory low  0

Вывод из предложенного спагеттидба запроса о sys.dm_os_memory_clerks:

MEMORYCLERK_SQLBUFFERPOOL   1410
OBJECTSTORE_LOCK_MANAGER    256
MEMORYCLERK_SQLCLR          38
MEMORYCLERK_SOSNODE         26
CACHESTORE_SQLCP            11

плюс ~ 10 более мелких записей размером до 30 МБ.

Дэн
источник

Ответы:

12

Объем SQL Express ограничен 1 ГБ для пула буферов, но в SQL Server есть много других пулов памяти. Что меня удивляет, так это чрезмерное использование небуферных пулов памяти. Чтобы узнать использование памяти одним клерком памяти, запустите:

SELECT type, SUM(pages_kb)/1024 AS MemoryMB
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY 2 DESC

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

spaghettidba
источник
Результат этого запроса: MEMORYCLERK_SQLBUFFERPOOL 1410 OBJECTSTORE_LOCK_MANAGER 256 MEMORYCLERK_SQLCLR 38 MEMORYCLERK_SOSNODE 26 CACHESTORE_SQLCP 11 а затем еще несколько маленьких, которые составляют <30 МБ. Кажется странным для меня -arg- при форматировании комментария.
Дан
Хммм. Только MEMORYCLERK_SQLBUFFERPOOL выходит за пределы 1 ГБ, поэтому мы можем столкнуться с ошибкой. То, что я нахожу странным, это то, как он использует 9,5 ГБ, не показывая в запросе
Спагеттидба
Я думаю, что есть некоторые другие интересные столбцы в sys.dm_os_memory_clerks (помимо single_pages_kb): virtual_memory_committed_kb кажется более уместным в случае MEMORYCLERK_SQLBUFFERPOOL.
Разван Соколь