web-dev-qa-db-fra.com

Comment voir ce qui est mis en cache en mémoire dans SQL Server 2008?

Existe-t-il un moyen de savoir ce qui est mis en cache dans SQL Server 2008 R2? J'ai trouvé l'article Nice suivant: http://blog.sqlauthority.com/2010/06/17/sql-server-data-pages-in-buffer-pool-data-stored-in-memory- cache . Cependant, je voudrais savoir combien de données (par exemple en pourcentage et en Ko) sont stockées de chaque table et index. Existe-t-il un moyen simple d'obtenir ces données?

13
Ondrej Peterka

Vous pouvez trouver ce qui est stocké dans le pool de tampons (cache de données) en utilisant la requête ci-dessous:

De ici :

select
       count(*)as cached_pages_count,
       obj.name as objectname,
       ind.name as indexname,
       obj.index_id as indexid
from sys.dm_os_buffer_descriptors as bd
    inner join
    (
        select       object_id as objectid,
                           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_id as objectid,
                           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
left outer join sys.indexes ind 
  on  obj.objectid = ind.object_id
 and  obj.index_id = ind.index_id
where bd.database_id = db_id()
  and bd.page_type in ('data_page', 'index_page')
group by obj.name, ind.name, obj.index_id
order by cached_pages_count desc

Excellente référence: À l'intérieur du moteur de stockage: que contient le pool de tampons? par Paul Randal.

16
Kin Shah

Vous pouvez utiliser la vue de gestion dynamique pour répertorier les pages actuellement mises en cache et les filtrer par database_id:

   select top 100 * from sys.dm_os_buffer_descriptors

Ensuite, vous pouvez voir DBCC PAGE commande pour lister les pages d'un objet. Bonne référence: http://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/

Ce sera à vous, cependant, de combiner les résultats, et cela ne semble pas être une tâche facile :). Faites-nous savoir lorsque vous trouverez un moyen efficace de le faire.

5
Adam Luniewski

Essayez cette requête SQL:

select count(*)*8/1024 AS 'Cached Size (MB)'        
,case database_id                
when 32767 then 'ResourceDB'                
else db_name(database_id)                
end as 'Database'
from sys.dm_os_buffer_descriptors
where page_type in
(
'INDEX_PAGE'
,'DATA_PAGE'
)
group by db_name(database_id), database_id
order by 'Cached Size (MB)' desc
0
Tanmay Nehete