七 記憶體優化(3)使用DMV

2021-09-03 05:38:04 字數 3522 閱讀 4269

一、sys.dm_os_memory_clerks

1. 查詢dmv

sys.dm_os_memory_clerks返回sql server例項中當前處於活動狀態的全部記憶體clerk的集合。跟蹤這個dmv,可以看到記憶體是如何被sql server消耗。

select type,

sum(virtual_memory_reserved_kb) as virtual_memory_reserved_sum,

sum(virtual_memory_committed_kb) as virtual_memory_committed_sum,

sum(awe_allocated_kb) as awe_allocated_sum,

sum(shared_memory_reserved_kb) as shared_memory_reserved_sum,

sum(shared_memory_committed_kb) as shared_memory_committed_sum,

sum(multi_pages_kb) as multi_pages_sum,

sum(single_pages_kb) as single_pages_sum

from sys.dm_os_memory_clerks

group by type

order by type

2. 各列的解釋

(1)type

momery clerk的名稱。大致可以根據名稱猜出記憶體的用途。

(2)virtual_memory_reserved_sum 和 virtual_memory_committed_sum

virtual_memory_reserved_sum 是記憶體clerk reserve的虛擬記憶體量。這是由使用此clerk的元件直接保留的記憶體量。在多數情況下,只有使用buffer pool的記憶體clerk才會有這種機制。

virtual_memory_committed_sum 是記憶體clerk commit的虛擬記憶體量。這是clerk提交的記憶體量。提交的記憶體量應始終小於保留的記憶體量。這部分記憶體,主要來自database pages。

(3)awe_allocated_sum

記憶體clerk使用awe分配的記憶體量。

(4)shared_memory_reserved_sum 和 shared_memory_committed_sum

shared_memory_reserved_sum 是記憶體clerk保留的共享記憶體量。保留以供共享記憶體和檔案對映使用的記憶體量。

shared_memory_committed_sum 是記憶體clerk提交的共享記憶體量。

這2個列的值,可以追蹤shared memory的大小。一般shared memory的值都很小。

(5)multi_pages_sum 和 single_pages_sum

multi_pages_sum 是分配的多頁記憶體量。此內存在緩衝池外面分配,也就是傳統意義上sql server自己的**使用的multi-page的大小。

single_pages_sum 是通過stolen page分配的單頁記憶體量。也就是說,是buffer pool裡的stolen memory的大小。

3. 估算不同記憶體的大小

(1)reserved 和 commit

即 sum(virtual_memory_reserved_kb) 和 sum(virtual_memory_committed_kb) 。

(2)stolen

等於 sum(single_pages_kb) + sum(multi_pages_kb)

(3)buffer pool(single page)

等於 sum(virtual_memory_committed_kb) + sum(single_pages_kb)

(4)multi-page

即 sum(multi_pages_kb)

4. 侷限性

通過這個dmv可以看到所有buffer pool(或者稱為single page)的使用,以及multi-page裡被sql server**用掉的記憶體。執行在multi-page裡面的第三方**所申請的記憶體是不能被這個檢視跟蹤的。

二、檢視sql server快取的資料頁面資訊

通過sys.dm_os_buffer_descriptors,可以檢視sql server緩衝池中當前所有資料頁的資訊。

use db01

select b.database_id ,db=db_name(b.database_id) , p.object_id , p.index_id ,

buffer_count = count(*)

from sys.allocation_units a,

sys.dm_os_buffer_descriptors b,

sys.partitions p

where a.allocation_unit_id = b.allocation_unit_id

and a.container_id = p.hobt_id

and b.database_id = db_id()

group by b.database_id ,p.object_id ,p.index_id

order by b.database_id , buffer_count desc

三、檢視sql server快取的執行計畫資訊

可以通過sys.dm_exec_cached_plans檢視執行計畫都快取了哪些內容。

select cacheobjtype,objtype

from sys.dm_exec_cached_plans

group by cacheobjtype,objtype

通常快取的執行計畫的物件有:proc(儲存過程)、prepared(預定義語句)、adhoc(動態查詢)、replproc(複製篩選過程)、trigger、view、default(預設值)、usrtab(使用者表)、systab(系統表)、check(check約束)、rule(規則)等。

通過下面的查詢,可以看到各種物件占用了多少記憶體。

select cacheobjtype,objtype, sum(size_in_bytes) as sum_size_in_bytes,

sum(bucketid) as cache_counts

from sys.dm_exec_cached_plans

group by cacheobjtype,objtype

通過dmv檢視的消耗情況,以及快取的資訊。

七 記憶體優化(3)使用DMV

一 sys.dm os memory clerks 1.查詢dmv sys.dm os memory clerks返回sql server例項中當前處於活動狀態的全部記憶體clerk的集合。跟蹤這個dmv,可以看到記憶體是如何被sql server消耗。select type,sum virtual...

七 記憶體優化(3)使用DMV

一 sys.dm os memory clerks 1.查詢dmv sys.dm os memory clerks返回sql server例項中當前處於活動狀態的全部記憶體clerk的集合。跟蹤這個dmv,可以看到記憶體是如何被sql server消耗。select type,sum virtual...

有關鎖和記憶體使用的DMV

檢視連線當前資料庫的spid所加的鎖 set transaction isolation level read uncommitted select db name resource database id as databasename request session id resource ty...