Sql-Server

頁面預期壽命下降時的緩衝區記憶體大小

  • July 22, 2019

我正在解決我們的一個 SharePoint 數據庫的問題,我認為這是由於 I/O 活動增加導致的 PLE 大幅下降(我看到同時增加了讀取、寫入和延遲寫入)

此時的 Buffer Cache Hit Ratio 通常為 96%。

Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 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

我看到的大小沒有意義(對我來說,我的意思是),通常是 250-350MB。我希望我會看到一個很大的大小,然後我可以檢查哪些表在記憶體中的頁面最多,這將有望引導我檢索/上傳哪些 LOB 對象,從而導致問題。

我是否還需要查看計劃記憶體?即 PLE 下降可能是由一些繁重的表掃描引起的嗎?

SQL Server 從可用的 16GB 中分配了 12GB 的 MAX 記憶體。這與緩衝區記憶體大小有什麼關係?

如果 PLE 下降到 0-5 的值,那麼緩衝區大小肯定應該更大……?

我正在解決我們的一個 SharePoint 數據庫的問題,我認為這是由於 I/O 活動增加導致的 PLE 大幅下降(我看到同時增加了讀取、寫入和延遲寫入)

我可以從你的問題中看出SQL Server 2012 SP1SQL Server 2012中有一個錯誤導致 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;  

如果要為特定數據庫中的每個對象記憶體頁面

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;

引用自:https://dba.stackexchange.com/questions/138091