
---------------------------------------------------------------------------------------------------------------------------
-- Purpose: Find out how much SQL Server memory each index or heap is currently using. Run this in the user database.
-- More Information: https://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/
-- Revision: 2019-05-21
--
;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;
