數據庫內存結構

數據庫從操做系統申請到的內存可分爲兩部分:
1.緩存池內存(數據頁和空閒頁)
2.非緩存池內存(線程/DLL/鏈接服務器等)數據庫

Note:經過服務器實例屬性設置的最大/最小服務器內存是指緩存池內存
Note:Express只能使用1G內存緩存

數據庫內存可分爲三個層級
Level1:內存節點(Memory Node),提供低級的分配器的接口和實現,在NUMA中內存節點和CPU節點對應,只有內存CLERK能夠訪問內存節點;服務器

Level2:由內存CLERK/內存緩存/內存池三部分組成,內存CLERK訪問內存節點的接口來分配內存。ide

Level3:內存對象,SQL SERVER組件使用內存對象,而不使用Memory CLERK,內存對象使用內存CLERK的頁分配器接口來分配頁。性能

數據庫內存按申請大小分紅兩部分
1.申請小於等於8KB爲一單位的內存,這些內存被用於緩存(singlepage allocator)
2.申請大於8KB爲一單位的內存,這些內存主要用於SQL CLR,Linked Server and backup buffer and others. 這些內存稱爲Multi-Page OR MemToLeave(multioPage allocator)spa

MemToLeave保留內存=((CPU數量-4)+256)*0.5+256 約等於384MB操作系統

查看Memory CLERK的內存使用狀況可調用sys.dm_os_memory_clerks視圖線程


查看Buffer pool的內存使用狀況可調用sys.dm_os_buffer_descriptors視圖對象

查看各數據庫緩存狀況
SELECT
DB_NAME(DS.database_id) AS DatabaseName,
CAST(COUNT(1) *8.0/1024.0 AS INT) UsedMB
FROM sys.dm_os_buffer_descriptors DS
GROUP BY database_id接口


數據庫使用的總內存:主要由buffer pool中用於緩存的內存+從Buffer pool中借(stolen)的CLERK singlePage的內存+MemToLeave(MultiPage)的內存

SELECT
'SinglePage(MB)',
CAST(SUM(C.single_pages_kb)/1024.0 AS NUMERIC(10,2))
FROM sys.dm_os_memory_clerks C
UNION ALL
SELECT
'MemToLeave(MB)',
CAST(SUM(C.multi_pages_kb)/1024.0  AS NUMERIC(10,2))
FROM sys.dm_os_memory_clerks C
UNION ALL
SELECT
'Buffer Pool(MB)',
CAST(COUNT(1) *8.0/1024.0 AS NUMERIC(10,2)) AS UsedMB
FROM sys.dm_os_buffer_descriptors DS

或者使用性能計數器來查看SQLServer佔用的內存
SELECT * FROM sys.sysperfinfo P
WHERE P.object_name LIKE 'SQLServer:Memory Manager%'
AND( P.counter_name LIKE 'Target Server Memory (KB)%'
OR P.counter_name LIKE 'Total Server Memory (KB)%')


Memory Object:
本質上是一個堆,由Page allocator進行分配,使用sys.dm_os_memory_objects來查看,使用page_allocator_address來與標識memory clerk

相關文章
相關標籤/搜索