您好,登錄后才能下訂單哦!
數據庫內存結構是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
數據庫從操作系統申請到的內存可分為兩部分:
1.緩存池內存(數據頁和空閑頁)
2.非緩存池內存(線程/DLL/連接服務器等)
Note:通過服務器實例屬性設置的最大/最小服務器內存是指緩存池內存
Note:Express只能使用1G內存
數據庫內存可分為三個層級
Level1:內存節點(Memory Node),提供低級的分配器的接口和實現,在NUMA中內存節點和CPU節點對應,只有內存CLERK可以訪問內存節點;
Level2:由內存CLERK/內存緩存/內存池三部分組成,內存CLERK訪問內存節點的接口來分配內存。
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)
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
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。