在 SQL Server 2008R2 中按数据库规划缓存页

Kyl*_*ndt 2 memory sql-server-2008-r2

是否可以细分每个数据库使用了多少计划缓存页面?Perfmon 似乎只有服务器的总数,但也许有更详细的 DMV?

此外,缓冲池 (sys.dm_os_buffer_descriptors) 是否包括计划缓存还是单独的?

Aar*_*and 6

以下查询将为您提供每个数据库的缓冲区细分和计划缓存细分。请注意,计划缓存按 MB 细分,而不是按页面细分 - 我不知道有什么方便的方法来计算计划缓存使用的页面(您可能认为这是简单的除法,但是不必要)。

-- buffer pool breakdown

SELECT 
  db = DB_NAME(database_id),
  c = COUNT(DISTINCT page_id),
  size_MB = CONVERT(DECIMAL(12,2), COUNT(DISTINCT page_id)*8.0/1024) 
FROM sys.dm_os_buffer_descriptors
WHERE database_id < 32767
GROUP BY database_id
ORDER BY c DESC;

-- plan cache breakdown

SELECT 
  db = DB_NAME(t.[dbid]), 
  size_MB = CONVERT(DECIMAL(12,2), SUM(p.size_in_bytes)/1024.0/1024)
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t
WHERE t.[dbid] < 32767
GROUP BY t.[dbid]
ORDER BY size_MB DESC;
Run Code Online (Sandbox Code Playgroud)

在我的测试实例中,有些情况下计划缓存大于给定数据库的缓冲池。

缓冲池包含数据缓存和计划缓存。但是 AFAIK sys.dm_os_buffer_descriptors 仅包含有关数据缓存(索引和数据页)的信息,因此它不一定反映整个缓冲池。我上面看到的案例似乎支持这个理论。