SQL: Która baza i jaki obiekt zajmuje najwięcej pamięci na bufor?

30-paź-2013

Ile masz dostępnej pamięci w systemie dowiesz się nawet z Task Managera.

Który proces zabrał tę pamięć też pomoże określić Task Manager.

Jeśli tylko na Twoim serwerze znajduje się SQL server, to prawdopodobnie w ten sposób ustaliłeś, że właśnie SQL server zużył prawie całą pamięć. Zgadłem?

Zastanówmy się, jak ustalić która baza zajęła tyle miejsca (bufor). Może do tego posłużyć zapytanie odnalezione w czeluściach Internetu (http://www.sqlservercentral.com/Forums/Topic1215340-391-1.aspx):

–find out how big buffer pool is and determine percentage used by each database

DECLARE @total_buffer INT; SELECT @total_buffer = cntr_value   FROM sys.dm_os_performance_counters WHERE RTRIM([object_name]) LIKE '%Buffer Manager’   AND counter_name = 'Total

Pages’; ;WITH src AS(   SELECT        database_id, db_buffer_pages = COUNT_BIG(*) FROM sys.dm_os_buffer_descriptors       –WHERE database_id BETWEEN 5 AND 32766

GROUP BY database_id)SELECT   [db_name] = CASE [database_id] WHEN 32767

THEN 'Resource DB’        ELSE DB_NAME([database_id]) END,   db_buffer_pages,

db_buffer_MB = db_buffer_pages / 128,   db_buffer_percent = CONVERT(DECIMAL(6,3),

db_buffer_pages * 100.0 / @total_buffer) FROM src ORDER BY db_buffer_MB DESC;

W wyniku zobaczysz zestawienie twoich baz od tej największej do tej najmniejszej. Jeśli chesz zobaczyć jaka tabela/obiekt zajmuje najwięcej miejsca w buforze wykonaj kolejne polecenie, ale najpierw przejdź do właściej bazy

–then drill down into memory used by objects in database of your choice

USE TU_NAZWA_TWOJEJ_BAZY

WITH src AS(   SELECT       [Object] = o.name,       [Type] = o.type_desc,

[Index] = COALESCE(i.name, ”),       [Index_Type] = i.type_desc,       p.

[object_id],       p.index_id,       au.allocation_unit_id   FROM       sys.partitions AS p   INNER JOIN       sys.allocation_units AS au

ON p.hobt_id = au.container_id   INNER JOIN       sys.objects AS o       ON p.

[object_id] = o.[object_id]   INNER JOIN       sys.indexes AS i       ON o.

[object_id] = i.[object_id]       AND p.index_id = i.index_id   WHERE       au.

[type] IN (1,2,3)       AND o.is_ms_shipped = 0) SELECT   src.[Object],   src.[Type],   src.[Index],   src.Index_Type,

buffer_pages = COUNT_BIG(b.page_id),   buffer_mb = COUNT_BIG(b.page_id) / 128 FROM   src INNER JOIN   sys.dm_os_buffer_descriptors AS b   ON src.allocation_unit_id = b.allocation_unit_id WHERE   b.database_id = DB_ID() GROUP BY   src.[Object],   src.[Type],   src.[Index],   src.Index_Type ORDER BY   buffer_pages DESC;

 

Komentarze są wyłączone

Autor: Rafał Kraik