Les index consomment-ils de la mémoire?

10

Je commence tout juste à en apprendre davantage sur l'utilisation de la mémoire sur SQL Server. Lorsque vous utilisez la requête dans la réponse à la question SQL Server 2008 R2 "Ghost Memory"? , J'ai découvert qu'une seule base de données prend la part du lion de l'espace dans le pool de mémoire tampon. En regardant plus loin, en utilisant sys.allocation_unitset sys.indexes, j'ai confirmé que cela est probablement dû à l'utilisation intensive des index dans la base de données. La plupart des index sont regroupés.

Un autre développeur de base de données pense que nous avons des problèmes de mémoire sur le serveur - que les requêtes commencent à s'exécuter longtemps car il n'y a pas de mémoire disponible.

Ma question est la suivante: l'utilisation de ces index et leur existence dans le pool de tampons enlèvent-elles de la mémoire disponible pour d'autres processus?

JHFB
la source
2
"Another database developer believes we are having memory issues on the server"- sur quoi? De combien de RAM le serveur dispose-t-il, quels sont les paramètres de mémoire d'instance et combien de mémoire est utilisée par le cache de procédure?
Jon Seigel
Basé sur des temps de requête étendus et en regardant le Gestionnaire des tâches - que ma recherche a indiqué est un "menteur sale et sale" (merci Brent Ozar - brentozar.com/archive/2011/09/… ). Je peux trouver qu'il n'y a pas de problème de mémoire - je suis en train de suivre toutes les suggestions fournies dans ces commentaires et réponses!
JHFB
2
Puisque nous roulons la boule 8 ici, je pense que les requêtes sont lentes car elles ont été écrites par ce 'autre' développeur de base de données ...
Remus Rusanu

Réponses:

12

Oui, les pages de données d'un index utilisé qui sont mises en cache dans le pool de mémoire tampon occuperont de l'espace dans le cache de données . Mais ne laissez pas cela vous empêcher d'utiliser des index (tout d'abord, un index cluster est les données réelles de la table, gardez cela à l'esprit également). L'utilisation d'index (bien conçus et mis en œuvre, bien sûr) est une bonne chose.

Vos problèmes de mémoire ne sont probablement pas dus à la présence d'index sur vos tables . Plongez dans les problèmes de mémoire, quels sont exactement les problèmes? Avez-vous une faible espérance de vie de page ? Comment votre mémoire est-elle configurée sur le serveur? La mémoire maximale du serveur est-elle faible, ce qui limite la taille du pool de tampons?

Pour obtenir une ventilation des pages d'index dans votre cache de données, vous pouvez exécuter la requête ci-dessous:

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

Pour obtenir ces statistiques par base de données:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc
Thomas Stringer
la source
Espérance de vie de la page décente (?) - 4234. J'ai besoin de rechercher le taux de succès du cache de tampon et de regarder dans les autres parties.
JHFB
Ce PLE ne montre aucune pression sur la mémoire. Tout ce qui dépasse 1000 en règle générale (bien sûr, il y a toujours "ça dépend") est acceptable.
Thomas Stringer
Le taux de réussite du cache de mémoire tampon peut être très trompeur ou inutile. Voir Great SQL Server Debates: Buffer Cache Hit Ratio par @JonathanKehayias.
Mark Storey-Smith
@ MarkStorey-Smith Noté, merci pour le pointeur!
Thomas Stringer
@JHFB Prenons un peu de recul. Qu'est-ce qui vous fait penser que vous avez une pression sur la mémoire?
Thomas Stringer
7

Les index consomment de l'espace du pool de tampons, oui. C'est une raison de plus pour laquelle vous devez prendre soin de votre stratégie d'indexation et minimiser les doublons.

J'ai confirmé que cela était probablement dû à l'utilisation intensive des index dans la base de données. La plupart des index sont regroupés.

N'oubliez pas qu'un index cluster est la table . La seule surcharge qui existe pour un index clusterisé au-delà de celle d'un segment de mémoire (ce qui est généralement indésirable) concerne les pages d'index non-feuille et l'inclusion de la clé de cluster dans tous les index non cluster pour cette table. C'est pourquoi les clés de cluster étroites sont préférées.

Les articles de Kimberley Tripp sur les choix clés groupés sont une excellente référence pour cela.

Mark Storey-Smith
la source
+1 Que les articles de Mme Tripp sont EPIC sur les clés de clustering ...
Fabricio Araujo