How much size of RAM is occupied by each database in SQL Server Database
Memory one of the important bottle neck in troubleshooting the performance of SQL Server.
It is very evident that the pages which are retrieved from RAM directly will increase the performance of any application rather than pages retrieving from DISK to RAM.
Our first preference is to find out how much space is being occupied by each database in the buffer cache (which is nothing but physical RAM).
Below is the query to find the space details occupied by database in RAM.
DECLARE @total_buffer INT;SELECT @total_buffer = cntr_value FROM sys.dm_os_performance_countersWHERE 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 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 srcORDER BY db_buffer_MB DESC;
After identifying the database which is consuming more space in RAM, now it's turn to identify the table which is taking more space in that particular database.
USE [DB_NAME];GOWITH 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_idINNER 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) / 128FROM srcINNER 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_TypeORDER BY buffer_pages DESC;Now it will be clear regarding which table pages are more in physical RAM.
Obviously this table is being retrieved more than any other table in the database.
Now it's up to you how you proceed for further troubleshooting. You need to check what type of queries being fired from the application or users.
Question yourself
1. Is this table retrieving more than it is needed
2. Why do we need all the column data in the RAM
3. Can we create the index and extract only those columns data which is needed.
Now proceed the way where your question takes you to solve the issues.
Please post your issues or concerns so that together we can work and solve it.