sys.dm_os_buffer_descriptors (Transact-SQL)

Retourne des informations sur toutes les pages de données qui se trouvent actuellement dans le pool de mémoires tampons de SQL Server. Le résultat de cet affichage peut être utilisé pour déterminer la répartition des pages de base de données dans le pool de mémoires tampons par base de données, objet ou type.

Lorsqu'une page de données est lue à partir du disque, cette page est copiée dans le pool de mémoires tampons de SQL Server et mise en cache en vue de sa réutilisation. Chaque page de données mise en cache est associée à un descripteur de mémoire tampon. Les descripteurs de mémoire tampon identifient de manière unique chaque page de données actuellement mise en cache dans une instance de SQL Server. sys.dm_os_buffer_descriptors retourne les pages mises en cache pour toutes les bases de données utilisateur et système. Cela inclut les pages qui sont associées à la base de données Resource.

Nom de la colonne

Type de données

Description

database_id

int

Identificateur de la base de données associée à la page dans le pool de mémoires tampons. Cette colonne accepte la valeur NULL.

file_id

int

Identificateur du fichier qui contient l'image persistante de la page. Cette colonne accepte la valeur NULL.

page_id

int

Identificateur de la page dans le fichier. Cette colonne accepte la valeur NULL.

page_level

int

Niveau d'index de la page. Cette colonne accepte la valeur NULL.

allocation_unit_id

bigint

Identificateur de l'unité d'allocation de la page. Cette valeur peut être utilisée pour la jointure de sys.allocation_units. Cette colonne accepte la valeur NULL.

Remarque   sys.dm_os_buffer_descriptors peut afficher des valeurs inexistantes dans allocation_unit_id pour les index cluster créés avec une version de SQL Server antérieure à SQL Server 2005.

page_type

nvarchar(60)

Type de la page, par exemple page de données ou page d'index. Cette colonne accepte la valeur NULL. Pour plus d'informations, consultez Fonctionnement des pages et étendues.

row_count

int

Nombre de lignes dans la page. Cette colonne accepte la valeur NULL.

free_space_in_bytes

int

Quantité d'espace disponible dans la page, en octets. Cette colonne accepte la valeur NULL.

is_modified

bit

1 = la page a été modifiée après avoir été lue sur le disque. Cette colonne accepte la valeur NULL.

numa_mode

int

Nœud NUMA (Nonuniform Memory Access) pour la mémoire tampon.

Autorisations

Nécessite l'autorisation VIEW SERVER STATE sur le serveur.

Notes

sys.dm_os_buffer_descriptors retourne les pages actuellement utilisées par la base de données Resource. sys.dm_os_buffer_descriptors ne retourne pas d'informations sur les pages libres ou occultées, ni sur les pages qui comprenaient des erreurs lors de leur lecture.

De

À

Sur

Relation

sys.dm_os_buffer_descriptors

sys.databases

database_id

plusieurs-à-un

sys.dm_os_buffer_descriptors

<userdb>.sys.allocation_units

allocation_unit_id

plusieurs-à-un

sys.dm_os_buffer_descriptors

<userdb>.sys.database_files

file_id

plusieurs-à-un

Exemples

A. Renvoi du nombre de pages mises en cache pour chaque base de données

L'exemple suivant retourne le nombre de pages chargées pour chaque base de données.

SELECT count(*)AS cached_pages_count
    ,CASE database_id 
        WHEN 32767 THEN 'ResourceDb' 
        ELSE db_name(database_id) 
        END AS Database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY db_name(database_id) ,database_id
ORDER BY cached_pages_count DESC;

B. Renvoi du nombre de pages mises en cache pour chaque objet de la base de données active

L'exemple suivant retourne le nombre de pages chargées pour chaque objet de la base de données active.

SELECT count(*)AS cached_pages_count 
    ,name ,index_id 
FROM sys.dm_os_buffer_descriptors AS bd 
    INNER JOIN 
    (
        SELECT object_name(object_id) AS name 
            ,index_id ,allocation_unit_id
        FROM sys.allocation_units AS au
            INNER JOIN sys.partitions AS p 
                ON au.container_id = p.hobt_id 
                    AND (au.type = 1 OR au.type = 3)
        UNION ALL
        SELECT object_name(object_id) AS name   
            ,index_id, allocation_unit_id
        FROM sys.allocation_units AS au
            INNER JOIN sys.partitions AS p 
                ON au.container_id = p.partition_id 
                    AND au.type = 2
    ) AS obj 
        ON bd.allocation_unit_id = obj.allocation_unit_id
WHERE database_id = db_id()
GROUP BY name, index_id 
ORDER BY cached_pages_count DESC;