En regardant la disponibilité de votre RAM pour ce serveur particulier et que vous exécutez plusieurs bases de données allant de 30 Go à 5 Go , vous avez certainement besoin de plus de RAM sur ce serveur.
Vous n'avez pas mentionné qu'il s'agit d'une instance autonome ou que ce serveur a plus d'une instance de serveur SQL en cours d'exécution.
Vos paramètres de mémoire MAX semblent OK pour un serveur ayant 8 Go de RAM. Consultez ces paramètres de bonnes pratiques suggérés par Glenn Berry .
Je vous recommande fortement de faire une base de référence de votre environnement en utilisant les compteurs PERFMON ci-dessous pour obtenir une bonne valeur de votre configuration de mémoire:
- SQL Server: Gestionnaire de tampons \ Espérance de vie de la page
- SQL Server: Gestionnaire de tampons \ Lectures de pages / s
- Disque physique \ Lectures de disque / s
- Mémoire \ Mo disponibles
- SQL Server: Gestionnaire de mémoire - Mémoire totale du serveur
- SQL Server: Gestionnaire de mémoire - Mémoire du serveur cible
Mémoire totale du serveur: quantité de mémoire actuellement allouée au pool de mémoire tampon et non la quantité totale de mémoire à SQL Server
Mémoire du serveur cible: taille idéale du pool de tampons correspondant à la mémoire maximale de l'instance.
Remarque: Si la mémoire totale du serveur> la mémoire du serveur cible, cela suggère une pression mémoire.
Le script ci-dessous vous aidera à trouver les notifications de mémoire FAIBLE ou ÉLEVÉE de sys.dm_os_ring_buffers
la session de santé du système:
SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC
Quelques bonnes références: