頁面預期壽命下降時的緩衝區記憶體大小
我正在解決我們的一個 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 SP1
。SQL 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;