页面预期寿命下降时的缓冲区缓存大小

Mol*_*pad 4 performance sql-server memory sql-server-2012

我正在对我们的一个 SharePoint 数据库的问题进行故障排除,我认为 PLE 的大幅下降主要是由于 I/O 活动增加(我同时看到读取、写入和延迟写入增加)

此时的缓冲区缓存命中率通常为 96%。

Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 2012 年 10 月 19 日 13:38:57 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows NT 6.2(Build 9200:)上的基于核心的许可(64 位)(管理程序)

我想在 PLE 删除的确切时间检查缓冲区缓存的大小,所以我正在运行以下查询,我认为它以 MB 为单位给出了大小:

DECLARE @total_buffer INT;

SELECT @total_buffer = cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Buffer Manager%'
AND counter_name = 'Database Pages'

SELECT ((@total_buffer * 8) / 1024) AS CacheSizeMB
Run Code Online (Sandbox Code Playgroud)

我看到的大小没有意义(对我来说,我的意思是),通常为 250-350MB。我希望我会看到一个大尺寸,然后我可以检查哪些表在缓存中的页面最多,这有望引导我找到哪些 LOB 对象正在被检索/上传,从而导致问题。

我还需要查看计划缓存吗?即 PLE 丢弃可能是由一些繁重的表扫描引起的吗?

SQL Server 从可用的 16GB 分配了 12GB 的 MAX 内存。这与缓冲区缓存大小有何关联?

如果 PLE 下降到 0-5 的值,那么缓冲区大小肯定应该更大......?

Sha*_*nky 6

我正在对我们的一个 SharePoint 数据库的问题进行故障排除,我认为 PLE 的大幅下降主要是由于 I/O 活动增加(我同时看到读取、写入和延迟写入增加)

我可以从你提出的问题中看出SQL Server 2012 SP1SQL Server 2012 中有一个Bug,它迫使 PLE 急剧下降,但在SQL Server 2012 SP1 CU4. 现在既然 ** SQL Server 2012 SP3** 已经发布,我建议你应用 SP3,看看问题是否消退。

我想在 PLE 删除的确切时间检查缓冲区缓存的大小,

您不能使用 perfmon 计数器Buffer Manager: Database Pages来检查缓冲区大小。根据BOL,它的含义是:

指示缓冲池中包含数据库内容的页数。

所以你可以看到它没有提供关于完整缓冲池的信息。当您定义 SQL Server max server memory 时,max server memory 中设置的值成为缓冲池大小。因此,从 SQL Server 2012 开始,缓冲池的意义不大。以前它既是消费者又是内存的提供者。从 SQL Server 2012 开始,它只是消费者。要查看缓冲池的内容(在某种程度上),您有 DMV sys.dm_os_buffer_descriptors

下面的查询返回每个数据库的缓存页数。

SELECT COUNT(*)AS cached_pages_count
    ,CASE database_id 
        WHEN 32767 THEN 'ResourceDb' 
        ELSE db_name(database_id) 
        END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY cached_pages_count DESC;  
Run Code Online (Sandbox Code Playgroud)

如果您想为特定数据库中的每个对象缓存页面

SELECT COUNT(*)AS cached_pages_count 
    ,name ,index_id 
FROM sys.dm_os_buffer_descriptors AS bd 
    INNER JOIN 
    (
        SELECT 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_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
WHERE database_id = DB_ID()
GROUP BY name, index_id 
ORDER BY cached_pages_count DESC;
Run Code Online (Sandbox Code Playgroud)