Come vedere cosa viene memorizzato nella cache in memoria in SQL Server 2008?


13

Esiste un modo per scoprire cosa viene memorizzato nella cache in SQL Server 2008 R2? Ho trovato il seguente simpatico articolo: http://blog.sqlauthority.com/2010/06/17/sql-server-data-pages-in-buffer-pool-data-stored-in-memory-cache . Tuttavia, vorrei sapere quanti dati (ad esempio in percentuale e KB) sono memorizzati per ogni tabella e indice. Esiste un modo semplice per ottenere tali dati?

Risposte:


16

Puoi trovare ciò che è memorizzato nel pool di buffer (cache di dati) usando la query seguente:

Da qui :

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

Riferimento eccellente: all'interno del motore di archiviazione: cosa c'è nel pool di buffer? di Paul Randal.


5

È possibile utilizzare la vista di gestione dinamica per elencare le pagine attualmente memorizzate nella cache e filtrarle per database_id:

   select top 100 * from sys.dm_os_buffer_descriptors

Quindi puoi vedere il DBCC PAGEcomando per elencare le pagine di un oggetto. Buona referenza: http://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/

Spetta a te, tuttavia, combinare i risultati e non sembra un compito facile :). Facci sapere quando ti viene in mente un modo efficace per farlo.


0

Prova questa query 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.