Ниже несколько запросов SQL, которые покажут какая база кушает память, что именно в БД занимает оперативную память.
--1. Какие объекты в рамках БД кушают память (находятся в буфере кеша)
SELECT
DB_NAME(database_id) AS DatabaseName,
OBJECT_NAME(p.object_id) AS ObjectName,
p.index_id,
i.name AS IndexName,
COUNT(*) * 8 / 1024 AS MemoryUsedMB
FROM sys.dm_os_buffer_descriptors bd
JOIN sys.allocation_units au ON bd.allocation_unit_id = au.allocation_unit_id
JOIN sys.partitions p ON au.container_id = p.hobt_id
JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id
WHERE database_id = DB_ID()
GROUP BY database_id, p.object_id, p.index_id, i.name
ORDER BY MemoryUsedMB DESC;
--2. Распределение памяти по базам данных
-- Если нужно понять, какая база данных «съела» больше всего RAM:
SELECT
CASE database_id WHEN 32767 THEN 'Resource DB' ELSE DB_NAME(database_id) END AS DatabaseName,
COUNT_BIG(*) [Pages in Buffer],
COUNT_BIG(*) * 8 / 1024 [Buffer Size (MB)]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY [Pages in Buffer] DESC;
--3. занятая память планами запросов
SELECT TOP 20
st.text AS [Query Text],
cp.objtype AS [Object Type],
cp.cacheobjtype AS [Cache Object Type],
cp.size_in_bytes / 1024 AS [Size (KB)],
cp.usecounts AS [Execution Count],
qp.query_plan AS [Query Plan XML]
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
ORDER BY cp.size_in_bytes DESC;
--4. суммарный объем памяти, занятый всеми планами, используйте:
SELECT SUM(CAST(size_in_bytes AS BIGINT)) / 1024 / 1024 AS [Total Cache Size (MB)]
FROM sys.dm_exec_cached_plans;
Чтобы обновить статистику (очистить буферы кеша), необходимо на сервере сделать (нужны спец права):
CHECKPOINT; -- сбрасывает данные на диск из памяти
DBCC DROPCLEANBUFFERS; -- чистит буферы кеша
DBCC FREEPROCCACHE; -- чистит планы запросов