Sql-Server

每個數據庫的 SQL 記憶體使用累積

  • January 25, 2018

以下查詢顯示如何查找每個數據庫使用的緩衝區記憶體的目前視圖。如何查找自上次 SQL 伺服器重新啟動以來每個數據庫的平均/累積記憶體緩衝區使用情況,而不僅僅是目前時間快照?

我們在一台伺服器上有 5 個微服務數據庫,沒有跨數據庫連接,不相關。從適當的數據庫呼叫儲存過程。我們正在嘗試分離到不同的伺服器,並找到基準 Ram 和核心處理器要求,但不確定最好的方法

謝謝,

按數據庫確定 SQL 記憶體使用情況

-- Note: querying sys.dm_os_buffer_descriptors
-- requires the VIEW_SERVER_STATE permission.

DECLARE @total_buffer INT;

SELECT @total_buffer = cntr_value
FROM sys.dm_os_performance_counters 
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
AND counter_name = 'Database Pages';

;WITH src AS
(
SELECT 
database_id, db_buffer_pages = COUNT_BIG(*)
FROM sys.dm_os_buffer_descriptors
--WHERE database_id BETWEEN 5 AND 32766
GROUP BY database_id
)
SELECT
[db_name] = CASE [database_id] WHEN 32767 
THEN 'Resource DB' 
ELSE DB_NAME([database_id]) END,
db_buffer_pages,
db_buffer_MB = db_buffer_pages / 128,
db_buffer_percent = CONVERT(DECIMAL(6,3), 
db_buffer_pages * 100.0 / @total_buffer)
FROM src
ORDER BY db_buffer_MB DESC; 

我不相信有任何累積/平均指標。我也不認為以這種方式看待它是有意義的。我認為你不能從這樣的觀點中得出任何有用的結論。此資訊太不穩定,無法以這種方式使用。有些東西比其他東西老化得更快。這很大程度上取決於哪些頁面被頻繁訪問,系統上有多少可用記憶體等。此外,緩衝池並不是唯一使用記憶體的地方。還有權限記憶體、計劃記憶體、數據庫元數據記憶體等。因此,這種方法很可能會產生誤導。

除了查看之外sys.dm_os_buffer_descriptors,還有以下資源可以查看:

  • DBCC MEMORYSTATUS;
  • SELECT * FROM sys.dm_os_memory_clerks;
  • SELECT * FROM sys.dm_os_performance_counters;

關於這三個資源,請注意:

  1. DBCC 和其他的有一些重複(甚至還有一些其他的 DMV 沒有在這裡列出)
  2. 在這些資源中的每一個中,都有一些條目覆蓋了所有數據庫並且不容易分解,例如連接池記憶體、計劃記憶體等

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