Eu tenho uma consulta que me mostra quanta memória o sql server está usando, as configurações como memória máxima e memória mínima, CPU, etc.
aqui está a consulta:
--============================================================
--checking current memory settings and usage
--marcelo miorelli
--16-feb-2014
--============================================================
SELECT R.[instance],
R.[Logical CPU Count],
R. [Hyperthread Ratio],
R.[Physical CPU Count],
R.[Physical Memory (GB)],
k.[Max server memory (GB)],
FOO.Memory_usedby_Sqlserver_MB,
FOO.Locked_pages_used_Sqlserver_MB,
k.[Min server memory (GB)],
k.[optimize for ad hoc workloads],
R.affinity_type_desc,
FOO.process_physical_memory_low,
FOO.process_virtual_memory_low,
R.virtual_machine_type_desc,
R.sqlserver_start_time
FROM (
SELECT [instance]=@@servername,
cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00) AS [Physical Memory (GB)],
affinity_type_desc,
virtual_machine_type_desc,
sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK)
) R
INNER JOIN (
SELECT [instance] = @@servername,
[Max server memory (GB)] = CONVERT(decimal(12,2),CAST(p.[max server memory (MB)] AS DECIMAL(12,2))/1024.00),
[Min server memory (GB)] = CONVERT(decimal(12,2),CAST(P.[min server memory (MB)] AS DECIMAL(12,2))/1024.00),
[min memory per query (MB)]= CONVERT(decimal(12,2),CAST(P.[min memory per query (KB)] AS DECIMAL(12,2))/1024.00),
p.[optimize for ad hoc workloads]
FROM ( SELECT name, [value_in_use]
FROM sys.configurations) t
PIVOT (MAX([value_in_use])
FOR name IN (
[min server memory (MB)],
[min memory per query (KB)],
[max server memory (MB)],
[optimize for ad hoc workloads]
)) p
) K
ON R.instance = K.instance
INNER JOIN (
SELECT [instance] = @@servername,
CONVERT(decimal(12,2),CAST(physical_memory_in_use_kb AS DECIMAL(12,2))/1024.00) AS Memory_usedby_Sqlserver_MB,
CONVERT(decimal(12,2),CAST(locked_page_allocations_kb AS DECIMAL(12,2))/1024.00) AS Locked_pages_used_Sqlserver_MB,
CONVERT(decimal(18,2),CAST(total_virtual_address_space_kb AS DECIMAL(18,2))/1024.00/1024.00) AS Total_VAS_in_GB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory t
) FOO
ON R.instance = foo.instance
OPTION (RECOMPILE);
esta consulta me dá isso - atualmente em um servidor de desenvolvimento não ocupado:
Minha pergunta está relacionada physical_memory_in_use_kb
ao locked_page_allocations_kb
DMV sys.dm_os_process_memory
.
Como posso descobrir quais objetos ou qualquer servidor sql está mantendo essa memória?
Percebo que no meu caso há uma memória mínima definida para 2 Gb, mas a memória em uso é superior a 5 Gb.
Pode ser que eu realmente não precise saber, pois provavelmente não há pressão de memória no momento, mas ainda assim, existe uma maneira de descobrir o que o SQL Server está mantendo na memória?
Sim e não, dependendo do que você quer dizer com "manter na memória" (sic).
Se você quer dizer o que está usando memória no sentido amplo do termo para a instância, então
DBCC MEMORYSTATUS()
é uma maneira fácil de observar o uso de memória na instância que funcionará tão atrás quanto necessário e também fornecerá um detalhamento do uso de páginas bloqueadas.Existem também os DMVs que lidam com SQLOS, como
sys.dm_os_memory_clerks
,broker
,nodes
e uma série de outros itens, incluindo memória que não é considerada parte da memória máxima do servidor, comosys.dm_os_loaded_modules
,sys.dm_os_stacks
, etc., que também pode ser usada para obter semelhante ( embora não seja informação de paridade exata).Se você quer dizer o que está usando memória no sentido granular do termo, então você estará essencialmente sem sorte, pois a única estrutura real documentada é uma página, que cobre apenas o buffer pool. Além disso, a memória é tão transitória que muda só de olhar para ela. Você teria que executar uma consulta para obter a maioria dos dados, o que por si só faria com que esses itens mudassem. Agora, você poderia tirar um instantâneo do uso atual da memória e um despejo do processo e analisá-lo, mas duvido que isso seja útil.
Eu poderia estar interpretando mal o que você está perguntando em termos do que está usando a memória, mas normalmente você manterá o nível alto, verificará os funcionários e verá se algo está gravemente anormal e seguirá em frente com base nisso. No seu exemplo, você está acima do mínimo de memória do servidor, mas muito abaixo do máximo de memória do servidor, portanto, não há muito ímpeto para o SQL Server cortar qualquer coisa no momento.