Wie kann ich sehen, was in SQL Server 2008 im Arbeitsspeicher zwischengespeichert ist?

12

Gibt es eine Möglichkeit, um herauszufinden, was in SQL Server 2008 R2 zwischengespeichert ist? Ich habe den folgenden schönen Artikel gefunden: http://blog.sqlauthority.com/2010/06/17/sql-server-data-pages-in-buffer-pool-data-stored-in-memory-cache . Ich möchte jedoch wissen, wie viele Daten (z. B. in Prozent und KB) von jeder Tabelle und jedem Index gespeichert sind. Gibt es eine einfache Möglichkeit, an solche Daten zu gelangen?

Ondrej Peterka
quelle

Antworten:

16

Mit der folgenden Abfrage können Sie herausfinden, was im Pufferpool (Datencache) gespeichert ist:

Von hier :

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

Hervorragende Referenz: Innerhalb der Storage Engine: Was befindet sich im Pufferpool? von Paul Randal.

Kin Shah
quelle
5

Mit der dynamischen Verwaltungsansicht können Sie die aktuell zwischengespeicherten Seiten auflisten und nach database_id filtern:

   select top 100 * from sys.dm_os_buffer_descriptors

Dann können Sie den DBCC PAGEBefehl zum Auflisten der Seiten eines Objekts sehen. Gute Referenz: http://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/

Es liegt jedoch an Ihnen, die Ergebnisse zu kombinieren, und es scheint keine leichte Aufgabe zu sein :). Lassen Sie uns wissen, wann Sie einen effektiven Weg finden, dies zu tun.

Adam Luniewski
quelle
0

Versuchen Sie diese SQL-Abfrage:

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
Tanmay Nehete
quelle